Antlr贪婪期权

Antlr贪婪期权,antlr,antlr3,Antlr,Antlr3,(我根据@Bart Kiers的第一条评论编辑了我的问题-谢谢!) 我的语法如下: SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;}; START : 'START:'; STRING_LITERAL : ('"' .* '"')+; rule : START STRING_LITERAL; 我想解析这样的语言:“START:”abcd“START:”img src=“test.jpg”“”(字符串文本可以在字符串文本中) 如果字符

(我根据@Bart Kiers的第一条评论编辑了我的问题-谢谢!)

我的语法如下:

SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};
START : 'START:';
STRING_LITERAL  : ('"' .* '"')+;
rule    :  START STRING_LITERAL;
我想解析这样的语言:“START:”abcd“START:”img src=“test.jpg”“”(字符串文本可以在字符串文本中)
如果字符串文字中有字符串文字,则上面定义的语法不起作用,因为对于语言“START:“img src=”test.jpg”“”而言,lexer将其转换为以下标记:START('START:')string_literal(“img src=”)test.jpg.

有什么方法可以定义一个语法来解决我的问题吗?

这里有两个错误:

  • 不能在解析器规则中使用
    片段
    规则。您将永远不会创建
    START
    标记
  • 解析器规则中的
    字符(点字符)匹配任何标记,而在lexer规则中,它匹配任何字符
  • 如果让
    *
    进行贪婪匹配(并且定义了一个匹配字符串文字的适当词法规则),则输入
    开始:“abcd”开始:“img src=”test.jpg”“
    将包含一个大字符串:
    “abcd”开始:“img src=”test.jpg”“
    (第一个和最后一个引号将匹配)

因此,不能使用相同的引号将字符串文字嵌入到字符串文字中。lexer无法确定引号是否用于关闭字符串,或者它是否是(新)嵌入字符串的开始。您需要在语法中更改它。

谢谢!我将我的原始问题更新为上面的问题。不幸的是,我不知道如何修复字符串文字问题中的字符串文字。我怎样才能改变语法提前谢谢。@user1286372,我的观点是您需要更改语法,这样就不可能在字符串中包含字符串(至少在不转义嵌套字符串的情况下)。换句话说:不可能支持它。为什么不将外部引号定义为单引号?是的,这将是一个可能的解决方案,但我希望在不改变语言的情况下这是可能的。不过还是非常感谢你!无法支持它的信息帮助了我!我还有一个基于解决方案的问题(将内部引号替换为单引号)。我的解决方案是在开始解析之前用单引号替换内部引号。有没有简单的方法可以用正则表达式定义的另一个字符串替换AntlInputStream(或之前)中的字符串?或者还有其他简单的解决方案吗?@user1286372,我不太明白。也许你可以提出一个新的问题,因为它与这个问题并不相关?