ANTLR根据以下标记更改令牌类型

时间:2013-04-11 21:43:12

标签: c# antlr

我已经阅读了Token type depends on following token,但是提问者试图总是得到相同的令牌忽略空格。

我的问题不同:我想根据上下文更改令牌。语法是内存中的搜索语法。以下是我正在解析的示例:

dog or [Notes] contains cat

这会创建一个这样的AST:

or // OR
    dog // WORD
    contains // CONTAINS
        [Notes] // PROP
        cat // WORD

这告诉搜索“查找带有'dog'的任何属性或包含'cat'的属性,但仅在'Notes'属性中查找。”

我想删除必须键入的括号来表示属性,我希望它看起来像这样:

dog or Notes contains cat
在这种情况下,

CONTAINS是一个比较运算符,其中有通常的:EQ,NEQ等。所以要点是我希望Notes被识别为PROP }。如上所述,如果我不在括号中,它将被识别为WORD

有没有办法说“如果此WORD后面跟CONTAINS|EQ|etc...,那么我希望令牌类型为PROP”?

编辑(格式文件)


grammar Search;

options { language = CSharp3; output = AST; } 
tokens { AND; }

@lexer::namespace { Symphony.Collections.Search } 
@parser::namespace { Symphony.Collections.Search } 

LPAREN : '('; 
RPAREN : ')'; 

AndNode
    : ('A'|'a')('N'|'n')('D'|'d')
    | '&&'
    ;
OR
    : ('O'|'o')('R'|'r')
    | '||'
    ;
NOT
    : ('N'|'n')('O'|'o')('T'|'t')
    ;
XOR
    : ('X'|'x')('O'|'o')('R'|'r')
    ;
EQ
    : '='
    ;
NEQ
    : '!=' | '<>'
    ;
LT
    : '<'
    ;
GT
    : '>'
    ;
LTE
    : '<='
    ;
GTE
    : '>='
    ;
CONTAINS
    : ('C'|'c')('O'|'o')('N'|'n')('T'|'t')('A'|'a')('I'|'i')('N'|'n')('S'|'s')
    ;
LIKE
    : ('L'|'l')('I'|'i')('K'|'k')('E'|'e')
    ;
PROP
    : '[' ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*  ']'
    ;
IDENT
    : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;
INT
    : '0'..'9'+
    ;
FLOAT
    : ('0'..'9')+ '.' ('0'..'9')*
    | '.' ('0'..'9')+
    ;
WS
    : ( ' ' | '\t' | '\r' | '\n' ) {$channel=Hidden;}
    ;
PHRASE
    : '"' (~('"') )* '"'
    | '\'' (~('\'') )* '\''
    ;
WORD
    : ( '!' | '#'..'&' | '*'..'~' | '\u0081'..'\u00FF' )+
    ;

op
    : EQ | NEQ | LT | GT | LTE | GTE | CONTAINS | LIKE
    ;

startExpression 
    : andExpression
    ;

/*
Implicit AND when two expressions are side-by-side
*/
andExpression 
    :  (xorExpression        -> xorExpression) 
     (AndNode? a=xorExpression -> ^(AND $andExpression $a))*  
    ;

xorExpression
    : orExpression (XOR^ orExpression)*
    ;

orExpression
    : expression (OR^ expression)*
    ;

expression
    : (NOT^)? atomicExpression
    ;

atomicExpression
    : PHRASE | WORD | IDENT | INT | FLOAT | parenExpression | opExpression
    ;

parenExpression
    : LPAREN! (WS!)* andExpression (WS!)* RPAREN!
    ;

opExpression
    : PROP (WS!)* (op^) (WS!)* (INT|FLOAT|PHRASE|WORD|IDENT|PROP)
    ;

0 个答案:

没有答案