Игнорирование пустых элементов, соответствующих {} в рекурсивном правиле

Я хотел бы описать вложенное условие. Вот с чем я работаю:

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;
Другие вопросы по тегам