【问题标题】:C99 grammar in Irony - declaration/statement conflictsIrony 中的 C99 语法 - 声明/语句冲突
【发布时间】:2014-08-23 22:22:45
【问题描述】:

我正在尝试使用Irony 来解析C99,以及I found a grammar online to guide me

我在声明与声明的冲突方面遇到困难。以下规则未能检测到带有初始化程序的指针声明。

blockItemList.Rule = MakePlusRule(blockItemList, blockItem);
blockItem.Rule = declaration | statement;

失败的线路类型是:

MyType *x = foo();

当我从语句的规则中删除labeledStatement 和expressionStatement(两者都可能以标识符开头)时,这种类型的声明被正确识别。

在尝试声明之前强制 Irony 用尽声明规则的最佳方法是什么?或者,我可以在 Irony 解析时添加到语法中,以便它可以将 MyType 注册为终端而不是标识符?

【问题讨论】:

    标签: c# parsing grammar lalr irony


    【解决方案1】:

    我记得在函数调用和标识符方面有类似的问题。不要认为你做错了什么,这只是语法的工作方式。您需要针对 Irony 对其进行“微调”。据我所知,Irony 是 LALR(1) 解析器,例如在做决定时只向前看一个符号。这可能意味着您需要做的工作不仅仅是定义给定的语法。

    我遇到了语法冲突的情况,我通过降低语法的“精确度”来解决它。实际精度后来通过 AST 节点恢复。

    Ps,你也可以:

    使用 Irony GrammarExplorer 看看你的语法有什么冲突。您有时可以使用 PreferSHiftHere() 或 ReduceHere() 解决冲突

    还有一些我认为有趣的链接:

    http://irony.codeplex.com/discussions/400830

    http://irony.codeplex.com/discussions/80134

    https://irony.codeplex.com/discussions/551074

    上下文无关的语法理解是不够的——你必须知道 关于 LR、LALR(1)、LL 等解析方法的信息。具有讽刺意味的是 LALR(1),而 Antlr 是 LL。语法规则应针对 具体方法。具有讽刺意味的“坚持”某些“错误”的意思是 它采取了两种同样可能的选择之一 它报告的歧义(冲突!)。所以没有必要尝试解析 在你解决冲突之前。为此 - 阅读有关 LALR 的更多信息 语法。

    【讨论】:

      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多