Antlr between运算符的语法

Antlr between运算符的语法,antlr,antlr4,Antlr,Antlr4,我正在尝试为以下场景创建一个ANTLR4语法: column < 3.2 column < 5 > 2.2 column > 2 < 5.2 我不明白为什么。列2不起作用,因为元字符匹配任何字符。因此,直接跟在2后面的会被它匹配。您需要匹配文本: DECIMAL : [0-9]+ '.'? [0-9]*; 列通道(隐藏); 它就像一个符咒,我甚至明白为什么。谢谢你,先生!如何在访问者中获取VisitSimple方法中的运算符值?谢谢您最好获取令牌的类型。类似于c

我正在尝试为以下场景创建一个ANTLR4语法:

column < 3.2
column < 5 > 2.2
column > 2 < 5.2

我不明白为什么。

列<2>2
不起作用,因为
元字符匹配任何字符。因此,直接跟在
2
后面的
会被它匹配。您需要匹配文本

DECIMAL : [0-9]+ '.'? [0-9]*;
列<2
不起作用,因为在
简单
备选方案中使用的令牌
运算符
只会与
=
匹配。所有其他的将由小于或大于
匹配。这就是lexer的工作原理:如果两个或多个lexer规则匹配相同数量的字符,那么首先定义的规则将获胜

请尝试以下方法:

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);
prog:expr+EOF;
expr:列小于或大于小数#范围的小数
|大于十进制的列小于十进制的#反向范围
|列运算符十进制#简单
;
运算符:小于等于;
列:“全部”?(“列”|“其他列”)
十进制:[0-9]+'.'?[0-9]*;
LESSTHAN:“=”;
等于:'=';
WS:[\r\n\t]->通道(隐藏);

它就像一个符咒,我甚至明白为什么。谢谢你,先生!如何在访问者中获取VisitSimple方法中的运算符值?谢谢您最好获取令牌的
类型。类似于
context.GetStart().GetType()
的内容,您可以将其与
myGrammarLexer.LESSTHAN
(未测试!)
column < 2
column < 2> 2
DECIMAL : [0-9]+ '.'? [0-9]*;
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);