中间运算符的语法
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
只会与 =
匹配。所有其他人将匹配 LESSTHAN
或 BIGGERTHAN
。这就是词法分析器的工作原理:如果 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);
我正在尝试为以下场景制作 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
只会与 =
匹配。所有其他人将匹配 LESSTHAN
或 BIGGERTHAN
。这就是词法分析器的工作原理:如果 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);