中间运算符的语法

Grammar for a between operator

我正在尝试为以下场景制作 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 和第二个运算符之间没有 space,它也不起作用。

column < 2> 2

我不明白为什么。

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

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

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

试试这样的方法:

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         : [ \r\n\t] -> channel(HIDDEN);