Я пытаюсь реализовать грамматику обработки выражений (которая касается вложенных скобок и т. Д.). У меня есть следующие до сих пор, но они не могут иметь дело с некоторыми случаями (успешные/неудачные случаи появляются после следующего блока кода). Кто-нибудь знает, что происходит?ANTLR Грамматика для выражений
Примечание: VarName + = и VarName = вещи являются лишь некоторые дополнительные поколения AST вспомогательный материал в XText. Не волнуйся о них пока.
...
NilExpression returns Expression:
'nil';
FalseExpression returns Expression:
'false';
TrueExpression returns Expression:
'true';
NumberExpression returns Expression:
value=Number;
StringExpression returns Expression:
value=STRING; //EllipsesExpression: '...';
//FunctionExpression: function=function; //don't allow random functions
UnaryExpression:
op=unop ('(' expr=Expression ')')|expr=Expression;
BinaryExpression:
'or'? AndOp; //or op
AndOp:
'and'? ComparisonOp;
ComparisonOp:
('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;
ConcatOp:
'..'? AddSubOp;
AddSubOp:
('+' '-')? MultDivOp;
MultDivOp:
('*' '/')? ExpOp;
ExpOp:
'^'? (('(' expr=Expression ')')|expr=Expression);
ExprSideOne : Variable|NilExpression|FalseExpression|TrueExpression|
NumberExpression|StringExpression|UnaryExpression;
Expression:
(
'('
expression1=ExprSideOne expression2+=BinaryExpression*
')'
)
|
(expression1=ExprSideOne expression2+=BinaryExpression*)
;
...
А вот список разборов/не удается:
c = ((b)); //fails
c = ((a not b)); //fails
c = b; //parses
d = (b); //parses
Нужна рекурсия. Просто из любопытства, почему ваши правила двоичного оператора написаны как унарные операторы? Является ли nil> = .. + * (1) что-то значимым? –