3

我正在尝试为以下代码编写产品( 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。

4

1 回答 1

3

无法为规则创建 ANTLR v3 语法:

FieldAccess -> Exp NAME
Exp         -> FieldAccess

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

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

(伪语法语法!)

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

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();};

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

在此处输入图像描述

编辑

规则:

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

无非就是这样:

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

除了第一个将为 input"a[i].b"创建一个这样的 AST:

        FA
       /  \
     IND   B
     / \
    A   I

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

        FA
       /  \
      B   IND
          / \
         I   A

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

于 2012-10-05T07:12:41.710 回答