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

#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;