我已经阅读了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)
;