C 语法中的函数定义有问题

C 语法中的函数定义有问题,c,function,antlr,grammar,multiplication,C,Function,Antlr,Grammar,Multiplication,我的C语法中的函数定义有一个问题,可以在这里找到,它没有正确定义,我不能将它乘以一些东西。 我试图输入的代码如下: int factorielle(int n) { int x; if ( n == 0) return 1; else return n*factorielle(n-1); } function_definition : declaration_specifiers declarator compound_statement | decla

我的C语法中的函数定义有一个问题,可以在这里找到,它没有正确定义,我不能将它乘以一些东西。 我试图输入的代码如下:

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
    ;
函数定义如下:

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
    ;
声明_说明符应链接到int,声明符链接到factorielle(int n),为此,我替换了以下内容:

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

但这并没有多大帮助

至于乘法运算,我不知道如何避免冲突。
有什么办法可以解决这个问题吗?

我可能已经找到了解决问题的第一部分的方法

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

并将其添加到direct_声明器:

| ID '(' parameter_type_list ')'

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

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

原因是,。(虽然参考答案似乎是关于LR(1)解析器的,但实际上是关于无法处理歧义的解析器;ANTLR不能)


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

我明白你的意思,至于上下文,我将看看是否可以学习它。但是输入代码通常很简单,我使用的示例应该是语法中输入的最复杂的示例之一。但我确实有很多模糊性的问题。大多数程序(工具)的困难在于“输入通常很简单”,但实际上它们必须处理最复杂的情况才能在实践中发挥作用。如果你不能铁一般的控制人们拿你的工具,他们会把这个星球上最丑陋的东西拿给你,当它失败时,你会抱怨。如果你是为了教育目的制作玩具,你可以忽略所有令人讨厌的复杂情况,只要你知道你在哪里作弊。我明白了,似乎即使是简单的陈述也很难管理。但是我不认为我对Antlr有什么了解,我会尝试使用Antlr 3解析真正的C代码。我在ANTLR网站上写了一个ANTLR 2语法。您可以看到如何使用语义谓词处理其中的typedef,以及如何使用语法谓词处理声明/函数歧义@monty0:是的,我相信你可以用ANTLR来做,但是你必须有上下文检查黑客。这就是我所说的“纯语法不行”的意思。OP的问题在于他的实施,而不是你的:-{