gpt4 book ai didi

java - 以下 JAVA 谓词的语法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:55:38 25 4
gpt4 key购买 nike

我正在尝试为以下代码编写作品 ( LL )

a[i].b[a[p]].id.xyz.a[c].o = i;

在Eclipse中使用ASTView,产生式是这样的

FieldAccess -> Exp NAME
Exp -> FieldAccess
FieldAccess -> ArrayAccess NAME
ArrayAccess -> ArrayAccess Exp
ArrayAccess -> FieldAccess
Exp -> FieldAccess
.....

如何在 Antlr 中定义上述内容?它们是递归的,据我所知,JAVA 是 LL。

最佳答案

不可能为规则创建 ANTLR v3 语法:

FieldAccess -> Exp NAME
Exp -> FieldAccess

ANTLR v4 可以处理左递归,但只能直接左递归规则:

Exp -> Exp '*' Exp
| Exp '/' Exp
| Exp '+' Exp
...
| Name
...

(伪语法语法!)

但是 v4 也无法处理您的in直接左递归规则:

FieldAccess -> Exp NAME
Exp -> FieldAccess

我很确定您可以让 ANTLR 创建一个 AST,就像 Eclipse 使用一些奇特的 AST 重写规则所做的那样,但是您将编辑您的问题并“绘制”(或发布图片)所需的 AST输入 a[i].b[a[p].x].id.xyz.a[c].o = i;,我可能会尝试一下。

编辑

这是一个小演示,说明如何在与您发布的内容类似的 AST 中解析您的示例输入:

grammar T;

options {
output=AST;
}

tokens {
ASSIGN;
IND;
FA;
}

parse
: assign EOF -> assign
;

assign
: lookup '=' expr ';' -> ^(ASSIGN lookup expr)
;

expr
: lookup
;

lookup
: (NAME -> NAME) ( array_index -> ^(IND $lookup array_index)
| field_access -> ^(FA $lookup field_access)
)*
;

array_index
: '[' expr ']' -> expr
;

field_access
: '.' NAME -> NAME
;

NAME : 'a'..'z'+;
SPACE : ' ' {skip();};

当我使用输入 a[i].b[a[p].x].id.xyz.a[c].o = i; 在 ANTLRWorks 中调试解析器时,正在生成以下 AST:

enter image description here

编辑

规则:

lookup
: (NAME -> NAME) ( array_index -> ^(IND $lookup array_index)
| field_access -> ^(FA $lookup field_access)
)*
;

无非就是这样:

lookup
: NAME ( array_index^
| field_access^
)*
;

除了第一个,对于输入 "a[i].b",创建一个像这样的 AST:

        FA
/ \
IND B
/ \
A I

后者会创建一个“反向”AST:

        FA
/ \
B IND
/ \
I A

(当然,FAIND 不会在最后一个 AST 中,因为它们不在 array_indexfield_access 规则,但如果你把它们放在那里,它就会有那个结构)。

关于java - 以下 JAVA 谓词的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12718899/

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