Domanda

Come viene precedenza degli operatori implementato in ANTLR?

Sto usando il pacchetto xtext / Antlr al momento.

Modifica:

Ho fatto quello che sepp2k suggerito, e precedenza degli operatori funziona ora, ma roba come 3 + * lavoro anche oggi. Gli operatori sono fondamentalmente "cadendo attraverso" l'albero.

Inoltre, ho provato la grammatica C sul sito web di ANTLR e la stessa cosa è successa in ANTLRworks.

Qualcuno sa qual è il problema?

BinaryExpression:
  'or'? AndOp; //or op

AndOp:
  'and'? ComparisonOp;

ComparisonOp:
  ('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;

ConcatOp:
  '..'? AddSubOp;

AddSubOp:
  ('+' | '-')? MultDivOp;

MultDivOp:
  ('*' | '/')? ExpOp;

ExpOp:
  '^'? expr=Expression;
È stato utile?

Soluzione

Con ANTLR si codifica la precedenza nelle regole grammaticali. Come:

expr:  mult ('+' mult)* ;
mult:  atom ('*' atom)* ;
atom:  INT | '(' expr ')' ;

Ciò parse "1 + 2 * 3 + (4 * 5 + 6)" come "(1 + (2 * 3)) + ((4 * 5) + 6)"

Altri suggerimenti

Dal momento che si utilizza xtext, mi consiglia di utilizzare il concetto di azione di xtext. Cioè, una semplice grammatica espressione tipicamente simile a questa:

Sum: Product ({Sum.left=current} operator=('+'|'-') right=Product)*;
Product: Atom ({Product.left=current} operator=('+'|'-') right=Atom)*;
Atom: Number | Paren;
Paren: '(' Sum ')';
Number: value=INT;

Si prega di dare un'occhiata alla docs per i dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top