如何使用包含\“的STRING_LITERAL来使Java Antlr4变得贪婪?

时间:2017-01-03 14:13:14

标签: java parsing antlr grammar antlr4

我有一个像这样的简单语法

"STRING_LITERAL"(, "STRING_LITERAL")?

在lexer.g4中,我像这样定义STRING_LITERAL

STRING_LITERAL: '"'[a-zA-Z0-9!#$&.+-^_{}:\\\" ]+'"';

但是,它似乎会忽略两个单词之间的逗号(“,”),就像输入测试一样:“abc”,“\”cde \“” Anltr4将这两个STRING_LITERALs读作1个文本而不是2个文本

List<TerminalNode> params = ctx.STRING_LITERAL(); // Only have 1 String element ("abc", "\"cde\"")

如何在STRING_LIERAL中使用带有\“的antr4并用逗号(,)分隔它,然后params将包含2个元素(”abc“和”\“cde \”“)而不是?

1 个答案:

答案 0 :(得分:1)

我使用'"' ('\\"'|.)*? '"'作为我的STRING词法分析器规则,然后在params定义中使用它:

actionExpressions
    : exp += expression (COMMA exp += expression)*
    ;

expression可以是整数,布尔值,字符串,ID等等。您不应该尝试在STRING文字定义中集成拆分。字符串只是一系列字符。

在我的词法规则中?是&#34;处理&#34;非贪婪。