gpt4 book ai didi

java - 输入 ANTLR4 没有可行的替代方案

转载 作者:行者123 更新时间:2023-12-01 17:38:01 24 4
gpt4 key购买 nike

我正在设计一种语言,允许您对数据进行谓词。这是我的词法分析器。

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 生成错误。

no viable alternative at input tab [key] in

我该如何解决这个问题?

最佳答案

第一个 tab [key] 不会像您希望的那样生成 KEY token ,原因有两个:

  1. 它包含空格,并且 KEY 不允许有任何空格。解决这个问题的最佳方法是从词法分析器中删除 KEY 规则,并将其转换为解析器规则(这意味着您还需要将 [ ] 到他们自己的 token 中)。那么输入中的空格将位于标记之间,从而成功跳过。
  2. key 实际上并不是 NAMES 中列出的单词之一。

另一个问题是 in 被识别为 ID token ,而不是 IN token 。这是因为 IDIN 都会生成相同长度的匹配项,并且在这种情况下,首先列出的规则优先。因此,您应该在所有关键字之后定义 ID,否则关键字将永远不会匹配。

关于java - 输入 ANTLR4 没有可行的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61010712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com