Antlr:如何匹配其他已识别令牌之间的所有内容?

问题描述:

如何匹配我的词法分析器中其他标记之间的所有剩余文本?Antlr:如何匹配其他已识别令牌之间的所有内容?

这里是我的代码:

grammar UserQuery; 

expr: expr AND expr 
    | expr OR expr 
    | NOT expr 
    | TEXT+ 
    | '(' expr ')' 
    ; 

OR : 'OR'; 
AND : 'AND'; 
NOT : 'NOT'; 
LPAREN : '('; 
RPAREN : ')'; 

TEXT: .+?; 

当我运行的“XX和YY”词法分析器,我得到这些令牌:

x type:TEXT 
x type:TEXT 
    type:TEXT 
AND type:'AND' 
    type:TEXT 
y type:TEXT 
y type:TEXT 

这个排序的作品,但我不”我希望每个角色都是一个令牌。我想将所有剩余文本合并为一个TEXT令牌。

我不认为这是可能没有一个分隔符,否则贪婪(?)词法记号匹配所有你的输入,包括您明确令牌的原则是最长的一场比赛的胜利与词法的令牌。

现在,如果你能接受一个分隔符是需要划定的文本,并增设了一个简单的空白规则来处理空间之间,那么你得到的东西是这样的:

[@0,0:14=''longest token'',<TEXT>,1:0] 
[@1,16:18='AND',<'AND'>,1:16] 
[@2,20:23=''yy'',<TEXT>,1:20] 
[@3,24:23='<EOF>',<EOF>,1:24] 

从这个语法:

grammar UserQuery; 

expr: expr AND expr 
    | expr OR expr 
    | NOT expr 
    | TEXT 
    | '(' expr ')' 
    ; 

OR : 'OR'; 
AND : 'AND'; 
NOT : 'NOT'; 
LPAREN : '('; 
RPAREN : ')'; 

TEXT : '\'' .*? '\''; 
WS: [ \t\r\n] -> skip; 

使用此输入:

'longest token' AND 'yy' 

这是非常相似的评论和字符串通常以编程语言进行处理,其中有一个起始和结束分隔符,并且其中的所有内容都被标记为一个大标记。通常我们会抛弃它们的评论,但在这里我们保留它们,就像我们将一个字符串一样。希望这可以帮助。

+0

它确实有帮助,谢谢。不过,这会迫使我改变我的查询语言。试图不这样做。 – ccleve