Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48613
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 146
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-29 11:36
个人简介

微博 https://www.weibo.com/huang007

文章分类

全部博文(13)

文章存档

2018年(1)

2014年(12)

我的朋友

分类: Java

2014-03-05 19:56:37

因为工作关系,要设计一个语法分析器,来做为一个数据分析产品的人机界面。

将所有的分析需求抽象成一系列的命令(cmd),通过一个相对readable的语法将命令组合,后端分析集群接收到这个语法,执行相应操作,返回前端结果。

这样做的由头是因为前端分析需求实在是变化太快,之前的做法是均由程序员coding来实现,费时费力,效率也不高。

这个设想如果能实现,那么,前端的需求就可以即时转化成结果,并也可以由前端人员自行调整。

前后接触了三个语法分析器,javacc,antlr,jparsec。

从stackoverflow上发现的jparsec,有个哥么重点推荐,答案被顶了17次,说jparsec异常简单,我信以为真,跑去研究了半天,复杂的不行,中间抽象的概念晦涩难懂,放弃!

重点说下javacc。

使用javacc可按如下步骤进行,简称我的最佳实践吧^_^

1.写好jjt文件,将语法分析成抽象语法树(AST),标准程序

点击(此处)折叠或打开

  1. <S_IDENTIFIER> {jjtThis.names.add(token.image);}

2.将AST_Start(root节点)改写,添加如下方法:

点击(此处)折叠或打开

  1. public class AST_Start extends SimpleNode {
  2.   public int getType() {
  3.     return ((SimpleNode) children[0]).id;
  4.   }
  5.   /**
  6.    * Gets the default statement node.
  7.    */
  8.   public Node getStmt() {
  9.     return children[0];
  10.   }
  11. }
3.根据生成好的AST node进行自定义扩充(关键一步,key step!!),编写相关成员函数,得到相应的如下所示:

点击(此处)折叠或打开

  1. public class AST_Top extends SimpleNode {
  2. /**  Gets the options */
  3.   public String[] getOptions() {
  4.     return ((AST_IdentList) children[0]).getNames();
  5.   }
  6.   /** Gets the fields.*/
  7.   public String[] getFields() {
  8.     return ((AST_IdentList) children[1]).getNames();
  9.   }
  10. }
4.这个时候,从文本分析出相关指令。撰写一个class,执行相关实际分析操作,如下所示:

点击(此处)折叠或打开

  1. class Top implements Plan {
  2.     private String options[];
  3.     private String fields[];
  4.     public Select(AST_Select tree) throws QueryException {
  5.       
  6.       options = tree.getOptions();
  7.       fields = tree.getFields();
  8.     }
  9.     public void execute(){
  10.       /** do some jobs
  11.             可以进行真正的操作了
  12.       */
  13.    }
  14. }


好了,个人觉得如上布局应该可扩展性还不错,嗯。

 
 
阅读(1848) | 评论(0) | 转发(0) |
0

上一篇:inode浅析

下一篇:Git 操作备忘

给主人留下些什么吧!~~