gpt4 book ai didi

java - Antlr4 - 无法获得岛屿语法吗?

转载 作者:行者123 更新时间:2023-12-02 03:27:41 24 4
gpt4 key购买 nike

问题

我正在使用 Antrl4 来解析类似 java 的语言,其中可以使用专有查询语言在括号内编写表达式。想象一下,在 Java 方法内部,应该允许使用以下行:

List<MyObject> items = [SELECT Field1,Field2 FROM MyObject];

任何表达式中都应该允许查询语言,例如

if ([SELECT Field1,Field2 FROM MyObject]!=null) {  }

也应该被允许。我的解析器需要使用两种模式的元素定义规则(在类 Java 模式下,在查询语言模式下)。

我的岛语法方法

我试图将其作为孤岛语法来处理,如 Definitive Antlr4 引用中所述,但是我无法让它工作。

我正在构建我的词法分析器语法,如下

OPEN_QUERY : '['    -> pushMode(INSIDE_QUERY);

JavaIdentifier: JavaLetter JavaLetterOrDigit* ;
// omitting fragments and loads of other lexer tokens for brevity

mode INSIDE_QUERY;

CLOSE_QUERY : ']' -> popMode ;
SELECT : 'select';
FROM : 'from';
QueryIdentifier: QueryLetter QueryLetterOrDigit*;
// omitting fragments definition for brevity

在我的解析器语法中,我试图做这样的事情:

expression: normalExpression | queryExpression;

queryExpression
: '[' SELECT QueryIdentifier FROM QueryIdentifier']'
;

但这会导致第一个括号字符出现标记识别错误。

这种做法有什么问题吗?谁能指出我所犯的错误?

最佳答案

如果您转储 token 流以查看词法分析器实际在做什么,则更容易诊断此类问题。在这里,左括号在词法分析器中被识别为 OPEN_QUERY 并被识别为 CLOSE_QUERY。因此,在解析器中指定为“[”和“]”的文字括号(作为隐式标记)不会出现在标记流中。

通过更改为简单修复

queryExpression
: OPEN_QUERY SELECT QueryIdentifier FROM QueryIdentifier CLOSE_QUERY
;

关于java - Antlr4 - 无法获得岛屿语法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38596379/

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