2012-01-22 22 views
1
NAME: ('a'..'z')+; 
QUOTED_NAME: Q NAME Q; 
Q: '"'; 

name : NAME | QUOTED_NAME; 

mytext结果是mytext在Antlr3中更改词法分析器行为?

"mytext"结果是"mytext"

有什么办法考虑Q当词法源字符串,但是消灭它当请求QUOTED_NAME的结果呢?所以,我需要的是:

mytext结果是mytext

"mytext"结果是mytext

请,没有内嵌Java的解决方案

回答

1

有什么办法在检索源字符串时考虑Q,但在请求QUOTED_NAME的结果时将其删除?

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

但是我并没有真正看到需要:在稍后阶段,您将处理来自您的令牌的文本,您为什么不能在该阶段删除引号并将它们留在那里,阶段?

您可以让解析器创建一个带引号的名称,然后让解析器生成一个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 

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