1

(我根据@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""',词法分析器将其翻译成以下标记: START('START:') STRING_LITERAL("img src=") test.jpg。
有什么方法可以定义适合我的问题的语法吗?

4

1 回答 1

0

这里有几件事是错误的:

  • 您不能fragment在解析器规则中使用规则。您的语法永远不会创建START标记;
  • 解析器规则中的.char (DOT-char) 匹配任何标记,而在词法分析器规则中,它匹配任何字符
  • 如果您让.*匹配贪婪(并且您已经定义了一个与字符串文字匹配的正确词法分析器规则),则输入START: "abcd" START: "img src="test.jpg""中将包含一个大字符串:("abcd" START: "img src="test.jpg""将匹配第一个和最后一个引号)。

因此,您不能使用相同的引号将字符串文字嵌入到字符串文字中。词法分析器无法确定引号是否意味着关闭字符串,或者它是否是(新)嵌入字符串的开始。你需要在你的语法中改变它。

于 2012-04-04T06:57:50.923 回答