Frage

Ich versuche, einen Ausdruck Umgang mit Grammatik (die mit verschachtelten Klammern und Sachen beschäftigt) zu implementieren. Ich habe folgend so weit, aber sie können nicht mit einigen Fällen (erfolgreich / Fehlerfälle erscheinen nach dem folgenden Code-Block) befassen. Wer weiß, was los ist?

Hinweis: Die varname + = und varname = Sachen sind nur einige zusätzliche AST Generation Helfer Sachen in XText. Mach dir keine Sorgen über sie für jetzt.

...

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* )
;
...

Und hier ist die Liste der Parsen / fehlschlägt:

c = ((b)); //fails
c = ((a not b)); //fails
c = b; //parses
d = (b); //parses
War es hilfreich?

Lösung

Was ist hier los ist, dass Ihr Ausdruck / Ausdrücke Einzel Klammer aber nicht mehr Klammer unterstützen (wie Sie geschlossen). Ich weiß nicht ANTLR spezifische Erfahrung haben, aber ich habe mit JavaCC gearbeitet, die viele ähnliche Konzepte teilt (I eine Grammatik für Prolog geschrieben ... fragen Sie nicht).

verschachtelte Klammern So behandeln Sie haben in der Regel etwas ähnliches wie:

ParenthesisExpression: '(' (ParenthesisExpression | Expression) ')';

Dies würde bedeuten, dass der Ausdruck entweder in Klammern gewickelt ist oder es ist nur ein roher Ausdruck. Was, wie die AST beschäftigt sich mit diesem, ein ParenthesisExpression ‚ist ein‘ Ausdruck, so kann es als eine Unterklasse oder eine Implementierung dargestellt werden (wenn Expression ist eine Schnittstelle / abstrakte Klasse von Sorten).

Andere Tipps

Verwendung der ^ Stelle platziert nach die Token / Regelname ist sehr nützlich Ausdrücke zu definieren.

    expression :    e1 (OR^ e1)* ;
    e1  :   e2 (AND^ e2)*;
    e2  :   e3 (PIPE^ e3)*;
    e3  :   e4 (ANDSYMB^ e4)*;
    e4  :   e5 ((EQUAL^|NOTEQUAL^) e5)*;
    e5  :   e6 ((LESS^|GREATER^) e6)*;
    e6  :   e7 ((PLUS^|MINUS^) e7)* ;
    e7  :   e8 ((STAR^|SLASH^) e8)* ;
    e8  :   e9 (NEW^ ID LPAREN RPAREN)*;
    e9  :   (NOT^)? e10;
    e10 :   e11 | call_def;
    e11 :   constant 
        | '(' expression ')' -> expression;

Ich habe diese Grammatik für einfache Ausdrücke verwendet: http: //fisheye2.atlassian .com / browse / ~ roh, r = 5.175 / antlr-Beispiele / C / polydiff / Poly.g

Ich habe auch die Grammatik für komplexere Ausdrücke in diesem Projekt enthält: http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top