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'
这是非常相似的评论和字符串通常以编程语言进行处理,其中有一个起始和结束分隔符,并且其中的所有内容都被标记为一个大标记。通常我们会抛弃它们的评论,但在这里我们保留它们,就像我们将一个字符串一样。希望这可以帮助。
它确实有帮助,谢谢。不过,这会迫使我改变我的查询语言。试图不这样做。 – ccleve