反语中的C99语法 - 声明/声明冲突

时间:2014-07-29 01:33:06

标签: c# parsing grammar lalr irony

我尝试使用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注册为终端而不是标识符吗?

1 个答案:

答案 0 :(得分:1)

我记得有类似的函数调用和标识符问题。不要以为你做了一些特别错误的事情,这只是语法工作的方式。你需要为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。语法规则应该针对a进行微调   具体方法。反讽'坚持'某事'错'意味着   它采取了两种同样可能的替代方案之一   它报告的歧义(冲突!)。所以没有必要尝试解析   在解决冲突之前先解决问题。要做到这一点 - 阅读更多关于LALR的信息   语法。