如何在词法分析器中的其他标记之间匹配所有剩余的文本?
这是我的代码:
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'
这与编程语言中经常处理注释和字符串的方式非常相似,其中有一个开始和结束分隔符,中间的所有内容都被标记为一个大标记。 通常对于评论,我们会丢弃它们,但在这里我们像保留字符串一样保留它们。 希望这有帮助。