我在antlr3中遇到一个问题,我想描述单引号字符串,双引号字符串和复合引号字符串。但是代码无法编译。

SingleQuoteString
    :
    '\'' ( ~('\''|'\\') | ('\\' .) )* '\''
    ;

DoubleQuoteString
    :
    '\"' ( ~('\"'|'\\') | ('\\' .) )* '\"'
    ;

StringLiteral
    :
    (SingleQuoteString|DoubleQuoteString)+
    ;


报告的错误是SingleQuoteString与StringLiteral有冲突。

三种字符串可以在不同的时间使用。

最佳答案

DoubleQuoteStringStringLiteral之间确实存在冲突,并且SingleQuoteStringStringLiteral之间确实存在冲突-StringLiteral可以匹配SingleQuoteString可以匹配的任何东西(甚至更多)。

请记住,我们在谈论的是词法分析器规则,而不是解析器规则(ANTLR约定说大写首字母表示词法分析器规则)。而且lexer不能根据任何上下文来做出决定。它必须发出令牌。例如,在读取'abc'时应发出哪个令牌?它应该发出SingleQuoteString还是StringLiteral?输入匹配两者,并且lexer没有其他上下文。

解决方法是使StringLiteral成为解析器规则,而不是词法分析器规则。

09-13 12:24