gpt4 book ai didi

java - ANTLR 语法第 1 行 :6 mismatched input '' expecting '.'

转载 作者:行者123 更新时间:2023-11-30 06:41:55 26 4
gpt4 key购买 nike

我正在玩 antlr4 语法文件,我想自己写 jsonpath语法。

我想出了这个:

grammar ObjectPath;

objectPath : dnot;

dnot : ROOT expr ('.' expr)
| EOF
;

expr : select #selectExpr
| ID #idExpr
;

select : ID '[]' #selectAll
| ID '[' INT ']' #selectIndex
| ID '[' INT (',' INT)* ']' #selectIndexes
| ID '[' INT ':' INT ']' #selectRange
| ID '[' INT ':]' #selectFrom
| ID '[:' INT ']' #selectUntil
| ID '[-' INT ':]' #selectLast
| ID '[?(' query ')]' #selectQuery
;

query : expr (AND|OR) expr # andOr
| ALL # all
| QPREF ID # prop
| QPREF ID GT INT # gt
| QPREF ID LT INT # lt
| QPREF ID EQ INT # eq
| QPREF ID GTE INT # gte
| QPREF ID LTE INT # lte
;

/** Lexer **/
ROOT : '$.' ;
QPREF : '@.' ;
ID : [a-zA-Z][a-zA-Z0-9]* ;
INT : '0' | [1-9][0-9]* ;
AND : '&&' ;
OR : '||' ;
GT : '>' ;
LT : '<' ;
EQ : '==' ;
GTE : '>=' ;
LTE : '<=' ;
ALL : '*' ;

在一个简单的表达式上运行之后:

CharStream input = CharStreams.fromString("$.name");
ObjectPathLexer lexer = new ObjectPathLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);

ObjectPathParser parser = new ObjectPathParser(tokens);
ParseTree parseTree = parser.dnot();
ObjectPathDefaultVisitor visitor = ...
System.out.println(visitor.visit(parseTree));
System.out.println(parseTree.toStringTree(parser));

输出正常,这意味着“名称”实际上是从 json 中检索到的,但是有一个我无法解释的警告:

line 1:6 mismatched input '<EOF>' expecting '.'

我读到我需要明确地在我的起始规则中添加一个 EOF 规则 (dnot),但这似乎不起作用。

知道我能做什么吗?

最佳答案

您的输入 $.name 无法被您的规则解析:

dnot            : ROOT expr ('.' expr)
| EOF
;

$.name 产生 2 个标记:

  1. ROOT
  2. ID

但您的第一个替代方案 ROOT expr ('.' expr) 需要 2 个由 . 分隔的表达式。也许你打算让第二个 expr 可选,像这样:

dnot            : ROOT expr ('.' expr)*
| EOF
;

并且 EOF 通常添加在开始规则的末尾,以强制解析器使用所有标记。正如您现在所做的那样,解析器成功解析了 ROOT expr,但随后无法进一步解析,并产生您看到的警告(预期为“.”)。

因为 objectPath 似乎是你的开始规则,我认为这就是你想要做的:

objectPath      : dnot EOF;

dnot : ROOT expr ('.' expr)?
;

此外,像这些 []'[?(' 等标记看起来很可疑。我对对象路径不是很熟悉,但是通过粘贴这些字符对于彼此,这样的输入 [ ]([] 由空格分隔)将不会被 []< 匹配。所以如果 foo[ ] 有效,我会这样写:

select          : ID '[' ']' #selectAll
| ...

并在词法分析器中跳过空格:

SPACES : [ \t\r\n]+ -> skip;

关于java - ANTLR 语法第 1 行 :6 mismatched input '<EOF>' expecting '.' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54333686/

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