独立的规则会相互影响吗?

时间:2013-07-28 08:43:31

标签: antlr

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

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

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

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

Unicode

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

1 个答案:

答案 0 :(得分:1)

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

  1. 为您打算在输入中显示的每个标记创建显式词法规则。
  2. 如果文字'new'存在相应的词法分析规则,则仅在解析器规则中使用语法'new'