2 votes

Comment transformer l'expression postfixe en grammaire C ANTLR en AST ?

J'apprends ANTLR en modifiant la grammaire C et en essayant quelque chose qui m'intéresse. La grammaire C avec laquelle j'ai commencé est de : http://www.antlr.org/grammar/1153358328744/C.g

Maintenant, je veux transformer postfix_expression à son AST correspondant mais je n'ai rien connu concernant la transformation de la forme xx (aa|bb|cc)* yy

...
unary_expression
  : postfix_expression
  | unary_operator^ unary_expression
  ;

postfix_expression
  : primary_expression
  ( '[' expression ']'
  | '(' ')'
  | '(' argument_expression_list ')'
  | '.' ID
  )*
  ;

unary_operator
  : '+'
  | '-'
  | '~'
  | '!'
  ;
...

Pouvez-vous m'aider à résoudre ce problème ? Vous pouvez juste ajouter quelques ^ et/ou ! aux notations de l postfix_expression dans la grammaire.

1voto

Bart Kiers Points 79069

Je choisirais quelque chose comme ça :

grammar T;

options {
  output=AST;
}

tokens {
  ROOT;
  MEMBER;
  INDEX;
  CALL;
}

parse
  :  unary_expression EOF -> ^(ROOT unary_expression)
  ;

unary_expression
  :  postfix_expression
  |  unary_operator unary_expression -> ^(unary_operator unary_expression)
  ;

postfix_expression
  :  primary_expression tail* -> ^(primary_expression tail*)
  ;

tail
  :  '[' expression ']'                -> ^(INDEX expression)
  |  '(' argument_expression_list? ')' -> ^(CALL argument_expression_list?)
  |  '.' ID                            -> ^(MEMBER ID)
  ;

primary_expression
  :  ID
  |  '(' expression ')' -> expression
  ;

argument_expression_list
  :  expression (',' expression)* -> expression+
  ;

unary_operator
  :  '+'
  |  '-'
  |  '~'
  |  '!'
  ;

expression
  :  NUMBER
  |  ID
  ;

NUMBER : '0'..'9'+;
ID     : ('a'..'z' | 'A'..'Z')+;

qui va analyser l'entrée :

a.b.c(foo,42)[123]

dans l'AST suivant :

enter image description here

ce qui permet d'évaluer facilement l'expression de gauche à droite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X