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

时间:2017-08-28 02:31:47

标签: antlr antlr4 lexical-analysis

如何匹配词法分析器中其他标记之间的所有剩余文本?

这是我的代码:

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令牌。

1 个答案:

答案 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'

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