J'essaie d'implémenter une grammaire de gestion d'expression (qui traite les parenthèses imbriquées et autres). J'ai ce qui suit jusqu'à présent, mais ils ne peuvent pas traiter certains cas (les cas de réussite/échec apparaissent après le bloc de code suivant). Quelqu'un sait ce qu'il se passe?ANTLR Grammaire pour les expressions
Note: Le varname + = et varname = choses ne sont que des trucs d'aide supplémentaire de génération AST dans XText. Ne vous inquiétez pas pour eux pour le moment.
...
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*)
;
...
Et voici la liste des Parsis/échoue:
c = ((b)); //fails
c = ((a not b)); //fails
c = b; //parses
d = (b); //parses
Besoin de récurrence. Par pure curiosité, pourquoi vos règles d'opérateur binaire sont-elles écrites comme des opérateurs unaires? Est-ce que nil> = .. + * (1) est censé signifier quelque chose? –