Open ldevyataykina opened 6 years ago
I'm not sure what you're asking. please fix the formatting and be more explicit in your question.
@erezsh I've updated question. I need to add to tree string of input DSL to add that to python code like a comments. I mean I want to get dsl string (like a comment) and after that get transforming string in python
So you want to convert a DSL to Python code? And add the DSL as comments after you convert it?
@erezsh yes, you're right. If it's possible, add to node tree and next parse it
Well, these are several separate steps:
1) Parse the DSL into a tree
2) Populate the tree with comments (you can use the propagate_positions
flag to get the line numbers)
3) Generate the python code from the tree
Which part are you having trouble with?
@erezsh with second. I've specified that argument, but my tree hasn't changed
Part of my tree before using this argument and after. Nothing changing
Tree(start, [Tree(unit, [Tree(name_unit, [Token(STRING, '"Проверка правоспособности АО на основании данных ЕГРЮЛ"')])]), Tree(imperativ, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.ОГРН')])]), Tree(imperativ, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.ПНЮЛ')])]), Tree(imperativ, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.РазмерУК')]), Tree(name_type, [Token(VARIABLE, 'Денежная_сумма')])]), Tree(imperativ, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ_МН')]), Tree(name_type, [Token(VARIABLE, 'Список')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.КорпДог')])])
and pretty variant
start
unit
name_unit "Проверка правоспособности АО на основании данных ЕГРЮЛ"
imperativ
name ЕГРЮЛ.ОГРН
imperativ
name ЕГРЮЛ.ПНЮЛ
imperativ
name ЕГРЮЛ.РазмерУК
name_type Денежная_сумма
imperativ
name ЕГРЮЛ_МН
name_type Список
dispositiv
name ЕГРЮЛ.КорпДог
This won't be shown in the repr()
or pretty()
displays. But try dir(tree)
and you should see the following properties: line
, column
, end_line
and end_column
.
@erezsh can you say, I run it in jupyter notebook and it works ok and try to run it from ubuntu terminal and get an error
Traceback (most recent call last):
File "rules_collector.py", line 41, in <module>
transformer = DSL_Transformer().DFS(tree)
File "rules_collector.py", line 21, in DFS
print(child.line)
AttributeError: 'Tree' object has no attribute 'line'
what can problem connect with? Library version is 0.5.5
Please provide the full code you're using (or an equivalent sample).
@erezsh I try
if tree.data == 'start':
for child in tree.children:
print(child)
print(child.line)
And code works ok in jupyter , but i have an error in ubuntu console
That's tree
Tree(start, [Tree(unit, [Tree(name_unit, [Token(STRING, '"Проверка правоспособности АО на основании данных ЕГРЮЛ"')])]), Tree(imperativ, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.ОГРН')])]), Tree(imperativ, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.ПНЮЛ')])]), Tree(imperativ, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.РазмерУК')]), Tree(name_type, [Token(VARIABLE, 'Денежная_сумма')])]), Tree(imperativ, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ_МН')]), Tree(name_type, [Token(VARIABLE, 'Список')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.КорпДог')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.Ликвидация')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.ОсобОтметки')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.Лицензии')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.Реорганизация')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.ЕИО_УК.СвРегИн')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.СведУмУк')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.СвПрекрЮл')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.СвРешИсклЮл')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.СвСтатус.КодСтатусЮл')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.СвРешИзмМН')])]), Tree(dispositiv, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.СвСтатус')])]), Tree(imperativ, [Tree(name, [Token(VARIABLE, 'ЕГРЮЛ.Регистратор')])]), Tree(result, [Tree(type_result, [Token(__ANONSTR_8, 'Экспертиза')]), Tree(text_result, [Token(STRING, '"Ошибка выписки (запросить корректную выписку)."')]), Tree(name_result, [Token(VARIABLE, 'Ошибка_выписки')])]), Tree(result, [Tree(type_result, [Token(__ANONSTR_8, 'Экспертиза')]), Tree(text_result, [Token(STRING, '"Требуется ручная обработка."')]), Tree(name_result, [Token(VARIABLE, 'Ручная_обработка')])]), Tree(result, [Tree(type_result, [Token(__ANONSTR_8, 'Экспертиза')]), Tree(text_result, [Token(STRING, '"Противоречивость данных. Требуется ручная обработка."')]), Tree(name_result, [Token(VARIABLE, 'Противоречие')])]), Tree(result, [Tree(type_result, [Token(__ANONSTR_9, 'Отрицательный')]), Tree(text_result, [Token(STRING, '"Отрицательный результат проверки"')]), Tree(name_result, [Token(VARIABLE, 'Отрицательный_исход')])]), Tree(message, [Tree(text_message, [Token(STRING, '"Общество осуществляет свою деятельность на основании лицензии."')]), Tree(name_message, [Token(VARIABLE, 'Сообщение_о_лицензии')])]), Tree(if_stmt, [Tree(condition, [Tree(unique_cond, [Tree(unique_operator, [Token(__ANONSTR_18, 'не'), Token(__ANONSTR_30, 'единственное')]), Token(VARIABLE, 'ЕГРЮЛ.МН')])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Ошибка_выписки')])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.КорпДог')])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Ручная_обработка')])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.КорпДог')])]), Tree(else, [Tree(complex_else, [Tree(if_stmt, [Tree(condition, [Tree(comparable_cond, [Tree(variable, [Token(VARIABLE, 'КомфПисьмо.5')]), Tree(action_operator, [Token(__ANONSTR_22, 'равно')]), Tree(variable, [Token(STRING, '"Нет"')])])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Противоречие')])])])])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_18, 'не'), Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.КорпДог')])]), Tree(else, [Tree(complex_else, [Tree(if_stmt, [Tree(condition, [Tree(comparable_cond, [Tree(variable, [Token(VARIABLE, 'КомфПисьмо.5')]), Tree(action_operator, [Token(__ANONSTR_22, 'равно')]), Tree(variable, [Token(STRING, '"Да"')])])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Противоречие')])])])])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_18, 'не'), Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.КорпДог')])]), Tree(else, [Tree(complex_else, [Tree(if_stmt, [Tree(condition, [Tree(comparable_cond, [Tree(variable, [Token(VARIABLE, 'КомфПисьмо.5')]), Tree(action_operator, [Token(__ANONSTR_22, 'равно')]), Tree(variable, [Token(STRING, '"Да"')])])]), Tree(else, [Tree(complex_else, [Tree(if_stmt, [Tree(condition, [Tree(comparable_cond, [Tree(variable, [Token(VARIABLE, 'КомфПисьмо.5а')]), Tree(action_operator, [Token(__ANONSTR_22, 'равно')]), Tree(variable, [Token(STRING, '"Нет"')])])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Ручная_обработка')])])])])])])])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.Ликвидация')])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Ручная_обработка')])])]), Tree(if_stmt, [Tree(condition, [Tree(merge_lists_cond, [Tree(variable, [Token(VARIABLE, 'ЕГРЮЛ.ОсобОтметки')]), Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Tree(array, [Token(VARIABLE, 'СвНедАдресЮЛ'), Token(VARIABLE, 'УчрЮЛРос.СвНедДанУчр'), Token(VARIABLE, 'УчрЮЛИн'), Token(VARIABLE, 'УчрФЛ')])])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Отрицательный_исход')])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.Лицензии')])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Сообщение_о_лицензии')])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.Реорганизация')])]), Tree(else, [Tree(complex_else, [Tree(if_stmt, [Tree(condition, [Tree(comparable_cond, [Tree(variable, [Token(VARIABLE, 'ЕГРЮЛ.Реорганизация.ПричВнесЗаписи')]), Tree(action_operator, [Token(__ANONSTR_29, 'содержит')]), Tree(variable, [Token(STRING, '"Начало процедуры реорганизации"')])])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Требуется_обработка')])])])])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_18, 'не'), Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.Реорганизация')])]), Tree(else, [Tree(complex_else, [Tree(if_stmt, [Tree(condition, [Tree(comparable_cond, [Tree(variable, [Token(VARIABLE, 'КомфПисьмо.3')]), Tree(action_operator, [Token(__ANONSTR_23, 'равен')]), Tree(variable, [Token(STRING, '"Да"')])])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Противоречие')])])])])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.Реорганизация')])]), Tree(else, [Tree(complex_else, [Tree(if_stmt, [Tree(condition, [Tree(comparable_cond, [Tree(variable, [Token(VARIABLE, 'КомфПисьмо.3')]), Tree(action_operator, [Token(__ANONSTR_23, 'равен')]), Tree(variable, [Token(STRING, '"Нет"')])])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Противоречие')])])])])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.ЕИО_УК.СвРегИн')])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Ручная_обработка')])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.СвПрекрЮЛ')])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Отрицательный_исход')])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.СвРешИсклЮЛ')])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Отрицательный_исход')])])]), Tree(if_stmt, [Tree(condition, [Tree(comparable_cond, [Tree(variable, [Token(VARIABLE, 'ЕГРЮЛ.СвСтатус.КодСтатусЮЛ')]), Tree(action_operator, [Token(__ANONSTR_23, 'равен')]), Tree(variable, [Tree(array, [Token(SIGNED_NUMBER, '701'), Token(SIGNED_NUMBER, '702'), Token(SIGNED_NUMBER, '801')])])])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Отрицательный_исход')])])]), Tree(if_stmt, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.СвРешИзмМН')])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Ручная_обработка')])])]), Tree(if_stmt, [Tree(union_condition, [Tree(condition, [Tree(existence_cond, [Tree(existence_operator, [Token(__ANONSTR_17, 'существует')]), Token(VARIABLE, 'ЕГРЮЛ.СвСтатус')])]), Tree(logic_operator, [Token(__ANONSTR_15, 'и')]), Tree(condition, [Tree(comparable_cond, [Tree(variable, [Token(VARIABLE, 'ЕГРЮЛ.СвСтатус')]), Tree(action_operator, [Token(__ANONSTR_23, 'равен')]), Tree(variable, [Token(SIGNED_NUMBER, '112')])])])]), Tree(else, [Tree(name_result, [Token(VARIABLE, 'Ручная_обработка')])])])])
@erezsh and when I try to
dir(child)
in console it returns
['__class__', '__deepcopy__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_pretty', '_pretty_label', 'children', 'copy', 'data', 'expand_kids_by_index', 'find_data', 'find_pred', 'iter_subtrees', 'pretty', 'scan_values', 'set']
Why are they different?
Please provide the actual code you use to initialize Lark, and parse the text..
@erezsh
json_parser = Lark(grammar, parser='lalr', postlex=PythonIndenter(), start='start')
tree = json_parser.parse(file)
I add files ldsl_grammar.txt (grammar) and test_dsl.txt (test file)
@erezsh Sorry, I've fixed my problem. Code wasn't common
Obviously, you're missing propagate_positions=True
@erezsh Is any way to add DSL string like a comment to python code?
For example
DSL
Python code