我尝试使用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注册为终端而不是标识符吗?
答案 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的信息 语法。