ldevyataykina / ldsl_grammar

0 stars 0 forks source link

Add string from DSL like a comment to python code #2

Open ldevyataykina opened 6 years ago

ldevyataykina commented 6 years ago

@erezsh Is any way to add DSL string like a comment to python code?

For example

DSL

Если возраст < 18 то
    отказ
Если возраст >= 18 то
    Если зарплата > 100000 то
        выдать_кредит

Python code

# Если возраст < 18 то
if age < 18:
    # отказ
    print('refused')

# Если возраст >= 18 то
if age >= 18:
    # Если зарплата > 100000 то
    if salary > 100000:
        # выдать кредит
        print('success')`
erezsh commented 6 years ago

I'm not sure what you're asking. please fix the formatting and be more explicit in your question.

ldevyataykina commented 6 years ago

@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

erezsh commented 6 years ago

So you want to convert a DSL to Python code? And add the DSL as comments after you convert it?

ldevyataykina commented 6 years ago

@erezsh yes, you're right. If it's possible, add to node tree and next parse it

erezsh commented 6 years ago

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?

ldevyataykina commented 6 years ago

@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    ЕГРЮЛ.КорпДог
erezsh commented 6 years ago

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.

ldevyataykina commented 6 years ago

@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

erezsh commented 6 years ago

Please provide the full code you're using (or an equivalent sample).

ldevyataykina commented 6 years ago

@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, 'Ручная_обработка')])])])])

ldevyataykina commented 6 years ago

@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?

erezsh commented 6 years ago

Please provide the actual code you use to initialize Lark, and parse the text..

ldevyataykina commented 6 years ago

@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)

ldsl_grammar.txt test_dsl.txt

ldevyataykina commented 6 years ago

@erezsh Sorry, I've fixed my problem. Code wasn't common

erezsh commented 6 years ago

Obviously, you're missing propagate_positions=True