0

当我为 C# 调试我的语法时,我注意到一些非常不寻常的事情:一些不被完整语法接受的输入被相同的语法接受,但删除了一些独立的规则。我找不到合乎逻辑的解释。例如:

CS - 这个语法不接受输入a<a<a>><EOF>

CS' - 这个语法与CS基本相同,但删除了一些独立的规则(规则不重新排序)确实接受a<a<a>><EOF>

正如您所看到的,两种语法都以规则开头,start: namespaceOrTypeName EOF;因此它们应该调用同一组规则(CS永远不会调用那些在CS'中删除的规则)。我花了一天时间对此进行调试,删除或添加新规则,但找不到逻辑缺陷。任何帮助都会有用,谢谢。

统一码

编辑:将CS中的开始规则更改start: Identifier EOF;为语法后,开始拒绝method仅定义规则时通常接受的输入Identifier。所以我想,因为有一条规则attributeTarget: ...| 'method' | ...,在编译语法之后,一些短语会被保留,例如在这种情况下的“方法”,但我仍然不确定是否是这样。

4

1 回答 1

1

第一个语法包括overloadableBinaryOperator隐式定义>>标记的规则。由于>>是一个 2 字符标记,词法分析器永远不会将输入>>视为两个单独的 1 字符标记>, >. 如果您在 ANTLRWorks 2 中打开语法,您将看到每个隐式定义的标记的警告指示符。您应该通过以下方式删除所有这些警告:

  1. 为您打算出现在输入中的每个标记创建明确的词法分析器规则。
  2. 'new'如果文字存在相应的词法分析器规则,则仅在解析器规则中使用语法'new'
于 2013-07-29T11:13:18.547 回答