2016-10-04 5 views
0

Я хотел бы описать вложенное условие. Вот то, что я работаю с:Игнорирование пустых элементов, соответствующих {} в рекурсивном правиле

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^