改变Antlr3中的词法分析器行为?

时间:2012-01-22 08:41:38

标签: antlr antlr3

NAME: ('a'..'z')+;
QUOTED_NAME: Q NAME Q;
Q: '"';

name : NAME | QUOTED_NAME;

对于mytext,结果为mytext

对于"mytext",结果为"mytext"

有什么方法可以在输入源字符串时考虑Q,但在请求QUOTED_NAME的结果时将其消除?所以,我需要的是:

对于mytext,结果为mytext

对于"mytext",结果为mytext

请不要使用内联Java解决方案

1 个答案:

答案 0 :(得分:1)

  

在提取源字符串时是否有任何方法可以考虑Q,但是在请求QUOTED_NAME的结果时将其消除?

不,不是没有添加目标代码(Java或不同)。

但我真的没有看到需要:在稍后阶段你将要处理你的令牌中的文字,为什么你不能在那个阶段删除引号并将它们放在lexing-stage的那里?

您可以让解析器创建一个带引号的名称,然后让解析器生成AST而不是简单的解析树。使用AST,您可以告诉解析器从AST中包含哪些令牌(以及要删除哪些令牌)。然后,您可以从树中删除引号。但是,处理引用的文本实际上更像是一个属于词法分析器的任务。

无论如何,这是一个关于如何创建一个从树中删除引号的AST的小型演示:

grammar Test;

options {
  output=AST;
}

parse
 : name+ EOF -> name+
 ;

name
 : NAME 
 | quoted_name
 ;

quoted_name
 : Q NAME Q -> NAME
 ;

NAME  : ('a'..'z')+;
Q     : '"';
SPACE : ' ' {$channel=HIDDEN;};

创建以下AST:

enter image description here

输入:

"mytext" mytext

有关使用ANTLR创建AST的更多信息:How to output the AST built using ANTLR?