c - 如何将 ANTLR C 语法中的 postfix_expression 转换为 AST?

标签 c antlr grammar antlr3

我正在通过修改 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 部分添加一些 ^ 和/或 ! 符号。

最佳答案

我会选择这样的东西:

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:

enter image description here

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

关于c - 如何将 ANTLR C 语法中的 postfix_expression 转换为 AST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7701411/

相关文章:

C-Compiler 在将字符串分配给 char 数组时说 "Cannot convert char * to char"

java - 从 Java 生成 Antlr4 Lexer

java - ANTLR:找不到符号

c - 编写读取 CFG 并删除左递归的解析器的建议

grammar - 创建 "Context Free Grammar"的提示

c - 为什么我的 C 代码中的 pipe() 不断返回 -1

c - 在C语言中使用套接字创建服务器和客户端应用程序检查文件

c# - ANTLR 语法给出了意想不到的结果

ANTLR4:词法分析器规则:任何字符串,只要它不包含这两个并排的字符?

c - 为什么我的 'if' 语句被跳过?