我正在尝试为以下场景制作ANTLR4语法:
column < 3.2
column < 5 > 2.2
column > 2 < 5.2
可以是一个范围,也可以是一个简单的比较。
这是我的语法文件
grammar myGrammar;
@parser::members
{
protected const int EOF = Eof;
}
@lexer::members
{
protected const int EOF = Eof;
protected const int HIDDEN = Hidden;
}
/*
* Parser Rules
*/
prog: expr+ ;
expr : COLUMN LESSTHAN DECIMAL BIGGERTHAN DECIMAL # range
| COLUMN BIGGERTHAN DECIMAL LESSTHAN DECIMAL # inversedRange
| COLUMN OPERATOR DECIMAL # simple
;
/*
* Lexer Rules
*/
COLUMN: ('all')?('columns' | 'otherColumn')
DECIMAL : ([0-9]+.?[0-9]*);
LESSTHAN : ('<'|'<=');
BIGGERTHAN : ('>'|'>=');
OPERATOR : ('<'|'<='|'>'|'>='|'=');
WS
: (' ' | 'r' | 'n') -> channel(HIDDEN)
;
只适用于
column < 5.2 > 2
column > 2.2 < 5
但是
不起作用column < 2
表示expecting biggerthan
。它不匹配简单的比较
也不起作用。
column < 2> 2
我不知道为什么。
column < 2> 2
不工作,因为.
元字符匹配任何字符。所以直接跟在2
后面的>
和它匹配。您需要匹配文字.
:
DECIMAL : [0-9]+ '.'? [0-9]*;
column < 2
不起作用,因为在simple
替代方案中使用的令牌OPERATOR
只会匹配=
。所有其他的将由LESSTHAN
或BIGGERTHAN
匹配。这就是词法分析器的工作原理:如果两个或多个词法分析器规则匹配相同数量的字符,则先定义的规则将获胜。
试试这样:
prog : expr+ EOF;
expr : COLUMN LESSTHAN DECIMAL BIGGERTHAN DECIMAL # range
| COLUMN BIGGERTHAN DECIMAL LESSTHAN DECIMAL # inversedRange
| COLUMN operator DECIMAL # simple
;
operator : LESSTHAN | BIGGERTHAN | EQUALS;
COLUMN : 'all'? ('columns' | 'otherColumn')
DECIMAL : [0-9]+ '.'? [0-9]*;
LESSTHAN : '<' | '<=';
BIGGERTHAN : '>' | '>=';
EQUALS : '=';
WS : [ rnt] -> channel(HIDDEN);