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