between操作符的语法



我正在尝试为以下场景制作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。它不匹配简单的比较

如果第一个数字是整数而不是小数,并且如果第一个int和第二个操作符之间没有空格,

也不起作用。

column < 2> 2

我不知道为什么。

column < 2> 2不工作,因为.元字符匹配任何字符。所以直接跟在2后面的>和它匹配。您需要匹配文字.:

DECIMAL : [0-9]+ '.'? [0-9]*;

column < 2不起作用,因为在simple替代方案中使用的令牌OPERATOR只会匹配=。所有其他的将由LESSTHANBIGGERTHAN匹配。这就是词法分析器的工作原理:如果两个或多个词法分析器规则匹配相同数量的字符,则先定义的规则将获胜。

试试这样:

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);

相关内容

  • 没有找到相关文章

最新更新