我的语法中的函数定义问题

时间:2013-03-08 23:01:23

标签: c function antlr grammar multiplication

我的C语法中的函数定义存在问题,可以在http://www.archive-host.com/files/1959635/24fe084677d7655eb57ba66e1864081450017dd9/cAST.txt找到,它没有正确定义,我不能用它来乘法。 我要输入的代码就是这个:

int factorielle(int n)
  { int x;
   if ( n == 0)
  return 1;
   else return n*factorielle(n-1);
  }

功能定义是这个:

function_definition
    : declaration_specifiers declarator compound_statement
    | declarator compound_statement
    ;

declaration_specifiers应该链接到int和declarator到factorielle(int n),为此我替换了这个:

direct_declarator
: ID ((direct_declarator '[' ']') | (direct_declarator '(' parameter_type_list ')') | (direct_declarator '(' identifier_list ')') | (direct_declarator '(' ')') )*

direct_declarator
: ID ((direct_declarator '[' ']') | (direct_declarator '(' parameter_type_list ')') | (direct_declarator '(' identifier_list ')') | (direct_declarator '(' ')')  | '(' parameter_type_list ')' )*

但它没有多大帮助。

至于乘法,我不知道怎么做而不会带来冲突。 有没有办法解决这个问题?

2 个答案:

答案 0 :(得分:1)

使用纯ANTLR的纯语法解析真正的C代码可能会很困难。

原因是certain declarations look like legitimate executable statements。 (虽然引用的答案似乎是关于LR(1)解析器,但实际上解析器无法处理歧义; ANTLR不能)。

区分它们的唯一方法是使用早期符号声明中提供的上下文信息。因此,您必须在解析时收集符号类型,并在语法规则缩减中检查该信息,以确定此类实例是语句还是声明。 (我不知道如何在ANTLR中实现这一点,尽管我相信它是可能的。)

答案 1 :(得分:0)

我可能通过重新启动找到问题第一部分的解决方案

compound_statement
  : '{' '}'
  | '{' statement_list '}'
  ;

compound_statement
  : '{' '}'
  | '{' statement_list '}'
  | '{' external_declaration+ '}'
  ;

并将其添加到direct_declarator:

| ID '(' parameter_type_list ')'

但我不知道它是否会带来一些冲突。