我在antlr3中遇到一个问题,我想描述单引号字符串,双引号字符串和复合引号字符串。但是代码无法编译。
SingleQuoteString
:
'\'' ( ~('\''|'\\') | ('\\' .) )* '\''
;
DoubleQuoteString
:
'\"' ( ~('\"'|'\\') | ('\\' .) )* '\"'
;
StringLiteral
:
(SingleQuoteString|DoubleQuoteString)+
;
报告的错误是SingleQuoteString与StringLiteral有冲突。
三种字符串可以在不同的时间使用。
最佳答案
DoubleQuoteString
和StringLiteral
之间确实存在冲突,并且SingleQuoteString
和StringLiteral
之间确实存在冲突-StringLiteral
可以匹配SingleQuoteString
可以匹配的任何东西(甚至更多)。
请记住,我们在谈论的是词法分析器规则,而不是解析器规则(ANTLR约定说大写首字母表示词法分析器规则)。而且lexer不能根据任何上下文来做出决定。它必须发出令牌。例如,在读取'abc'
时应发出哪个令牌?它应该发出SingleQuoteString
还是StringLiteral
?输入匹配两者,并且lexer没有其他上下文。
解决方法是使StringLiteral
成为解析器规则,而不是词法分析器规则。