【问题标题】:How to transform postfix_expression in ANTLR C grammar to AST?如何将 ANTLR C 语法中的 postfix_expression 转换为 AST?
【发布时间】:2011-10-09 04:11:00
【问题描述】:

我正在通过修改 C 语法并尝试自己感兴趣的东西来学习 ANTLR。我开始的C语法来自:http://www.antlr.org/grammar/1153358328744/C.g

现在我想将postfix_expression 转换为其对应的AST,但不知道与xx (aa|bb|cc)* yy 形式的转换相关的任何事情

...
unary_expression
  : postfix_expression
  | unary_operator^ unary_expression
  ;

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

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

你能帮我解决这个问题吗?您可以在语法中的postfix_expression 部分添加一些^ 和/或! 符号。

【问题讨论】:

    标签: c antlr grammar antlr3


    【解决方案1】:

    我会选择这样的:

    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')+;
    

    它将解析输入:

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

    进入以下 AST:

    使从左到右计算表达式变得容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多