2012-04-03 88 views
1

(我编辑基于@Bart煮布锅的第一个评论我的问题 - 谢谢!)ANTLR的贪婪选项

我有以下的语法:

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。
有没有什么办法来定义一个适合我的问题的语法?

回答

0

有几件事错在这里:

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

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

+0

谢谢!我将我的原始问题更新为上面的问题。 Unfortuanaltey我不知道如何解决字符串文字问题中的字符串文字。我怎么能改变语法? - 先谢谢你。 – user1286372 2012-04-04 09:07:05

+0

@ user1286372,我的观点是你需要改变你的语法,以便在字符串内部不可能有字符串(至少,不是没有转义嵌套字符串)。换句话说:它不可能支持它。为什么不将外部引号定义为单引号? – 2012-04-04 09:17:06

+0

是的,这将是一个可能的解决方案,但我希望没有任何语言变化是可能的。但是非常感谢你!无法支持它的信息帮助了我! – user1286372 2012-04-04 10:15:24