java - 输入 ANTLR4 没有可行的替代方案
问题描述
我正在设计一种允许您对数据进行谓词的语言。这是我的词法分析器。
lexer grammar Studylexer;
fragment LETTER : [A-Za-z];
fragment DIGIT : [0-9];
fragment TWODIGIT : DIGIT DIGIT;
fragment MONTH: ('0' [1-9] | '1' [0-2]);
fragment DAY: ('0' [1-9] | '1' [1-9] | '2' [1-9] | '3' [0-1]);
TIMESTAMP: TWODIGIT ':' TWODIGIT; // représentation de la timestamp
DATE : TWODIGIT TWODIGIT MONTH DAY; // représentation de la date
ID : LETTER+; // match identifiers
STRING : '"' ( ~ '"' )* '"' ; // match string content
NEWLINE:'\r'? '\n' ; // return newlines to parser (is end-statement signal)
WS : [ \t]+ -> skip ; // toss out whitespace
LIST: ( LISTSTRING | LISTDATE | LISTTIMESTAMP ) ; // list of variabels;
// list of operators
GT: '>';
LT: '<';
GTEQ: '>=';
LTEQ:'<=';
EQ: '=';
IN: 'in';
fragment LISTSTRING: STRING ',' STRING (',' STRING)*; // list of strings
fragment LISTDATE : DATE ',' DATE (',' DATE)*; // list of dates
fragment LISTTIMESTAMP:TIMESTAMP ',' TIMESTAMP (',' TIMESTAMP )*; // list of timestamps
NAMES: 'filename' | 'timestamp' | 'tso' | 'region' | 'processType' | 'businessDate' | 'lastModificationDate'; // name of variables in the where block
KEY: ID '[' NAMES ']' | ID '.' NAMES; // predicat key
这是我语法的一部分。
expr: KEY op = ('>' | '<') value = ( DATE | TIMESTAMP ) NEWLINE # exprGTORLT
| KEY op = ('>='| '<=') value = ( DATE | TIMESTAMP ) NEWLINE # exprGTEQORLTEQ
| KEY '=' value = ( STRING | DATE | TIMESTAMP ) NEWLINE # exprEQ
| KEY 'in' LIST NEWLINE #exprIn
例如,当我做一个谓词时。
tab [key] in "value1", "value2"
ANTLR 生成错误。
在输入选项卡 [key] 中没有可行的选择
我能做些什么来解决这个问题?
解决方案
Firsttab [key]
不会产生KEY
您想要的令牌,原因有两个:
- 它包含空格并且
KEY
不允许任何空格。解决这个问题的最好方法是KEY
从词法分析器中删除规则,然后将其转换为解析器规则(这意味着您还需要将[
其]
转换为自己的标记)。然后输入中的空白将位于标记之间,因此成功跳过。 key
实际上不是 中列出的单词之一NAMES
。
然后另一个问题是in
被识别为ID
令牌,而不是IN
令牌。这是因为两者ID
和IN
都会产生相同长度的匹配,在这种情况下,首先列出的规则优先。因此,您应该ID
在所有关键字之后定义,否则关键字将永远不会匹配。
推荐阅读
- html - 下拉菜单在所有页面上都没有响应
- python - 每次运行我的python代码时都会出错
- python - 调用多个数据框列名来构建新的数据框 keyerror
- c++ - FindWindowA 没有找到一些窗口
- html - 如果文件未被另一个文件使用,如何删除该文件
- reactjs - ReactJS 复选框默认值
- mysql - MariaDB 左连接未返回预期结果
- reactjs - React Native ShouldComponentUpdate 不会在 Redux 道具更改之间触发
- node.js - 在 Dockerfile 中找不到命令“dotnet”
- python - Python - 限制 for 循环中的线程