如何匹配词法分析器中其他标记之间的所有剩余文本?
这是我的代码:
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 :(得分:1)
我认为如果没有分隔符,这是可能的,否则贪婪的(?)词法分析器令牌将匹配所有您的输入,包括您的明确代币,原则是最长匹配获胜用lexer令牌。
现在,如果您可以接受需要使用分隔符来描述文本,并添加一个简单的空格规则来处理其间的空格,那么您可以得到如下内容:
[@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'
它非常类似于编程语言中通常处理注释和字符串的方式,其中包含起始和结束分隔符,其间的所有内容都被标记为一个大标记。我们经常通过评论将其丢弃,但在这里我们将它们保留为字符串。希望这会有所帮助。