当我调试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' | ...
,在编译语法之后,在这种情况下会有一些短语被保留,例如“方法”,但我仍然不确定是否就是这种情况。
答案 0 :(得分:1)
第一个语法包括隐式定义overloadableBinaryOperator
令牌的>>
规则。由于>>
是2个字符的标记,因此词法分析器永远不会将输入>>
视为两个单独的1个字符标记>
,>
。如果您在ANTLRWorks 2中打开语法,您将看到每个隐式定义的标记的警告指示符。您应该通过以下方式删除所有这些警告:
'new'
存在相应的词法分析规则,则仅在解析器规则中使用语法'new'
。