Antlr between运算符的语法
我正在尝试为以下场景创建一个ANTLR4语法: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
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);