【问题标题】:issue with the function definition in my grammar我的语法中的函数定义问题
【发布时间】:2013-03-08 23:01:23
【问题描述】:

我的 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 ')' )*

但这并没有多大帮助。

至于乘法,我不知道该怎么做才不会带来冲突。 请问有办法解决吗?

【问题讨论】:

    标签: c function antlr grammar multiplication


    【解决方案1】:

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

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

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

    【讨论】:

    • 我明白你的意思,至于上下文我会看看我是否可以学习它。但是输入代码通常很简单,我使用的示例应该是语法中输入的最复杂的示例之一。但确实,我对歧义有很多问题。
    • 大多数程序(工具)的困难在于“输入通常很简单”,但实际上它们必须处理最复杂的情​​况才能在实践中发挥作用。如果你不能严格控制人们给你的工具是什么,他们会把它交给这个星球上最丑陋的东西,并在它失败时抱怨。如果您是出于教育目的而制作玩具,则可以忽略所有令人讨厌的并发症,只要您了解自己在哪里作弊。
    • 我明白了,似乎即使是简单的语句也难以管理。但我不认为我对 Antlr 有“铁腕控制”的知识,但我会尝试。
    • 用 ANTLR 3 解析真正的 C 代码当然是可能的。我写了一个 ANTLR 2 语法,它在 antlr 网站上。您可以看到如何使用语义谓词处理其中的 typedef,以及如何使用句法谓词处理声明/函数的歧义。 antlr3.org/grammar/cgram
    • @monty0:是的,我相信你可以用 ANTLR 做到这一点,但你必须有上下文检查技巧。这就是我所说的“不能用纯语法做到”。 OP 的问题在于 his 实现,而不是 yours :-{
    【解决方案2】:

    我可能通过替换找到了问题第一部分的解决方案

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

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

    并将其添加到 direct_declarator:

    | ID '(' parameter_type_list ')'
    

    但不知道会不会带来一些冲突。

    【讨论】:

      猜你喜欢
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2019-08-09
      相关资源
      最近更新 更多