ANTLR解决非LL(*)问题和语法谓词
||
考虑解析器中的以下规则:
expression
: IDENTIFIER
| (...)
| procedure_call // e.g. (foo 1 2 3)
| macro_use // e.g. (xyz (some datum))
;
procedure_call
: \'(\' expression expression* \')\'
;
macro_use
: \'(\' IDENTIFIER datum* \')\'
;
和
// Note that any string that parses as an <expression> will also parse as a <datum>.
datum
: simple_datum
| compound_datum
;
simple_datum
: BOOLEAN
| NUMBER
| CHARACTER
| STRING
| IDENTIFIER
;
compound_datum
: list
| vector
;
list
: \'(\' (datum+ ( \'.\' datum)?)? \')\'
| ABBREV_PREFIX datum
;
fragment ABBREV_PREFIX
: (\'\\\'\' | \'`\' | \',\' | \',@\')
;
vector
: \'#(\' datum* \')\'
;
表达式规则中的procedure_call和macro_rule替代方案会生成非LL(*)结构错误。我可以看到问题了,因为(IDENTIFIER)
会同时解析为两者。但是即使我用+而不是*都定义了,即使上面的示例不应该再解析,它也会产生错误。
我想出了句法谓词的用法,但是我无法弄清楚如何使用它们来完成技巧。
就像是
expression
: IDENTIFIER
| (...)
| (procedure_call)=>procedure_call // e.g. (foo 1 2 3)
| macro_use // e.g. (xyz (some datum))
;
要么
expression
: IDENTIFIER
| (...)
| (\'(\' IDENTIFIER expression)=>procedure_call // e.g. (foo 1 2 3)
| macro_use // e.g. (xyz (some datum))
;
也不起作用,因为除了第一个规则外,什么都不会匹配。有解决这个问题的适当方法吗?
没有找到相关结果
已邀请:
1 个回复
脖呐
可以使用以下类进行测试:
并生成一个词法分析器和解析器,编译所有Java源文件并运行主类,请执行以下操作: bart @ hades:〜/编程/ ANTLR / Demos / R5RS $ java -cp antlr-3.3.jar org.antlr.Tool R5RS.g bart @ hades:〜/编程/ ANTLR / Demos / R5RS $ javac -cp antlr-3.3.jar * .java bart @ hades:〜/编程/ ANTLR / Demos / R5RS $ java -cp。:antlr-3.3.jar主要 bart @ hades:〜/编程/ ANTLR / Demos / R5RS $ 控制台上没有任何输出的事实意味着解析器(和词法分析器)在提供的源中未发现任何错误。 请注意,我没有单元测试,只测试了
类中的单个Scheme资源。如果您在ANTLR语法中发现错误,不胜感激,希望我能解决该语法。在适当的时候,我可能会将语法提交给官方的ANTLR Wiki。