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解决方案
答案 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:
输入:
"mytext" mytext
有关使用ANTLR创建AST的更多信息:How to output the AST built using ANTLR?