Question

Comment est la priorité des opérateurs mis en œuvre ANTLR?

J'utilise le paquet XText / Antlr pour le moment.

Edit:

Je l'ai fait ce que sepp2k a suggéré, et la priorité des opérateurs fonctionne maintenant, mais des choses comme 3 + * travaille aussi maintenant. Les opérateurs sont essentiellement « tomber dans » l'arbre.

En outre, j'ai essayé la grammaire C sur le site Web de ANTLR et la même chose est arrivé à ANTLRworks.

Quelqu'un sait ce que la question est?

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

AndOp:
  'and'? ComparisonOp;

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

ConcatOp:
  '..'? AddSubOp;

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

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

ExpOp:
  '^'? expr=Expression;
Était-ce utile?

La solution

Avec ANTLR vous encodez la priorité dans les règles de grammaire. Comme:

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

Cela analyser "1 + 2 * 3 + (4 * 5 + 6)" comme "(1 + (2 * 3)) + ((4 * 5) + 6)"

Autres conseils

Puisque vous utilisez Xtext, je vous recommande d'utiliser le concept d'action de Xtext. Autrement dit, une grammaire simple expression ressemblerait généralement semblable à celui-ci:

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

S'il vous plaît consulter le docs pour plus de détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top