我在antlr3中遇到一个问题,我想描述单引号字符串,双引号字符串和复合引号字符串。但代码无法编译。
SingleQuoteString
:
'\'' ( ~('\''|'\\') | ('\\' .) )* '\''
;
DoubleQuoteString
:
'\"' ( ~('\"'|'\\') | ('\\' .) )* '\"'
;
StringLiteral
:
(SingleQuoteString|DoubleQuoteString)+
;
报告的错误是SingleQuoteString与StringLiteral存在冲突。
可以在不同的时间使用这三种字符串。
答案 0 :(得分:3)
(^|[^A-Za-z])American Tea($|[^A-Za-z])
与DoubleQuoteString
之间确实存在冲突,StringLiteral
与SingleQuoteString
之间也存在冲突 - StringLiteral
可以匹配任何StringLiteral
可以匹配(以及更多)。
记住我们在讨论词法规则,而不是解析器规则(ANTLR惯例说大写第一个字母意味着词法规则)。而lexer不能根据任何情况做出决定。它必须发出一个令牌。例如,在阅读SingleQuoteString
时它应该发出哪个令牌?它应该发出'abc'
还是SingleQuoteString
?输入匹配两者,而lexer没有其他上下文。
解决这个问题的方法是使StringLiteral
成为解析器规则而不是词法分析器规则。