Это немного сложно.Вы можете сделать это, используя синтаксический предикат (LOOK-AHEAD-TOKENS-HERE)=>
перед сопоставлением с цепочкой ИЛИ:
expr
: (atom '|')=> atom ('|' atom)+ -> ^('|' atom+)
| atom
;
, которая правильно обрабатывает a|b|c
, a|b
и a
.
Но вы, возможно, захотите объяснить, на каком языке вы на самом деле пытаетесь разобрать: возможно, есть лучшие (более элегантные?) Способы выразить это.
Почему бы вам не захотеть использовать AST, как на первой диаграмме?Оценивать выражения легко, когда корень (операнд) имеет только двух дочерних элементов, верно?