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: [ trn] -> skip;

使用此输入:

'longest token' AND 'yy'

这与编程语言中经常处理注释和字符串的方式非常相似,其中有一个开始和结束分隔符,中间的所有内容都被标记为一个大标记。 通常对于评论,我们会丢弃它们,但在这里我们像保留字符串一样保留它们。 希望这有帮助。

相关内容

  • 没有找到相关文章

最新更新