ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

遵循JAVA谓词的语法

2019-11-27 15:01:51  阅读:228  来源: 互联网

标签:antlr java


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

(伪语法语法!)

但第4版也无法处理您的间接左递归规则:

FieldAccess -> Exp NAME
Exp         -> FieldAccess

我敢肯定,就像Eclipse使用一些精美的AST重写规则一样,您可以使ANTLR创建AST,但是您将编辑问题并为输入的AST“画”(或张贴图片)所需的AST. [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:

编辑

规则:

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

(当然,FA和IND不在最后一个AST中,因为它们不在array_index和field_access规则中,但是如果将它们放在那里,它将具有该结构).

标签:antlr,java
来源: https://codeday.me/bug/20191127/2075117.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有