ANTLR的贪婪选项(Antlr greedy-option)

2019-10-16 14:07发布

(我编辑我的问题基础上@Bart煮布锅的第一个注释 - 谢谢!)

我有以下的语法:

SPACE : (' '|'\t'|'\n'|'\r')+ {$channel = HIDDEN;};
START : 'START:';
STRING_LITERAL  : ('"' .* '"')+;
rule    :  START STRING_LITERAL;

我想分析一样的语言:“开头:‘ABCD’开始:‘IMG SRC =’test.jpg放在‘’”(字符串文字可能是内部的字符串文字)。
上文所定义的语法是否存在字符串文字串内字面不起作用,因为该语言“START:‘IMG SRC =’test.jpg放在‘’”词法分析器将其翻译为以下标记:START(“START:”) STRING_LITERAL( “IMG SRC =”)test.jpg放在。
有没有什么办法来定义的语法是罚款,我的问题?

Answer 1:

有几件事情错在这里:

  • 你不能使用fragment规则,语法规则内。 你语法永远不会创建一个START令牌;
  • . 炭(DOT-炭)解析器规则内匹配任何令牌 ,而词法规则内时,它的任何字符相匹配;
  • 如果你让.*匹配贪婪(和你已经定义了一个字符串匹配合适的词法规则),输入START: "abcd" START: "img src="test.jpg""将不得不在这一个大字符串: "abcd" START: "img src="test.jpg""第一和最后一个引号将被匹配的)。

所以,你不能嵌入使用相同的引号字符串文字中的字符串文字。 词法分析器是不能够确定报价是指将关闭字符串,或者如果它是一个(新的)嵌入字符串的开始。 你将需要改变,在你的语法。



文章来源: Antlr greedy-option
标签: antlr antlr3