如何使用单引号字符串和双引号同时与antlr?

时间:2016-01-07 08:53:22

标签: java antlr antlr3

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

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

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

StringLiteral
    :
    (SingleQuoteString|DoubleQuoteString)+
    ;

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

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

1 个答案:

答案 0 :(得分:3)

(^|[^A-Za-z])American Tea($|[^A-Za-z]) DoubleQuoteString之间确实存在冲突,StringLiteralSingleQuoteString之间也存在冲突 - StringLiteral可以匹配任何StringLiteral可以匹配(以及更多)。

记住我们在讨论词法规则,而不是解析器规则(ANTLR惯例说大写第一个字母意味着词法规则)。而lexer不能根据任何情况做出决定。它必须发出一个令牌。例如,在阅读SingleQuoteString时它应该发出哪个令牌?它应该发出'abc'还是SingleQuoteString?输入匹配两者,而lexer没有其他上下文。

解决这个问题的方法是使StringLiteral成为解析器规则而不是词法分析器规则。