#grako
#grako
Вопрос:
Я хотел бы описать условие вложенности. Вот с чем я работаю :
expr = ( /[_a-zA-Z][a-zA-Z0-9_-]*/ ) ;
condop = ( "AND" | "OR" ) ;
condition = expr { condop condition } ;
start = condition ;
Я могу сгенерировать AST со строками типа :
foo AND bar
Здесь AST :
[
"foo",
[
[
"AND",
[
"bar",
[]
]
]
]
]
Но после «bar» есть пустой список, потому что я предполагаю, что в последний раз, когда сопоставляется правило условия, «условие condop» стоит пустой строки. Согласно документам https://pypi.python.org/pypi/grako/3.16.0 , {} генерирует пустой список.
Есть ли способ предотвратить это?
Ответ №1:
То, что вы видите, не зависит от Grako. Вы используете как рекурсию, так и замыкания в одном и том же правиле.
Существует (более) двух способов описания этих выражений:
condition = expr { condop expr } ;
или
condition = expr [ condop condition ] ;
или
condition = expr condop condition | expr;
что эквивалентно предыдущему.
Левая рекурсия работает не во всех случаях с Grako, поэтому используйте ее на свой страх и риск. Эквивалент будет:
condition = condition condop condition | expr;