文档章节

antlr lexer二次开发实例

parker
 parker
发布于 2016/10/12 13:56
字数 397
阅读 18
收藏 0

使用antlr来进行词法分析,简单快速.本例子基于antlr3.

目标:

解析如下语句

load abc/abcd
  as  test1;
load abd as test2;
{[
begin:
select * from test1;
end;
]};

store to ddd;

其中分为三部分,

load子句,原来的sql子句,store 子句.

根据需求编写xxx.g文件,编写过程中需要注意:

1 可以使用@number来声明保存解析出来的字符串的内容.

2在定义语句时,可以使用var=LAB的方式,在接下来的大括号中,直接使用java代码方式将结果写入到第一步声明的变量中.

下面给出完成的代码:

lexer grammar ExtendSQL;
options{
filter=true;
}
@members{
    private java.util.Map<String,String> params;
    public ExtendSQL(CharStream input,java.util.Map<String,String> params){
        this(input);
        this.params=params;
    }
}
fragment
LoadSeg    :    'load' WS pi=PATH WS 'as' WS i=ID WS?';'{
    String inputs=null;
    if(!(null==params.get("inputs")||params.get("inputs").length()==0)){
        inputs=params.get("inputs")+";";
    }else{
        inputs="";
    }
    params.put("inputs",(inputs+pi.getText()+","+i.getText()));
};
fragment
SQLSeg    :    '{[' m=ANY ']};'{
    String str=m.getText();
    int start=str.indexOf("begin:");
    int end=str.indexOf("end;");
    if(start<end){
        params.put("sql",str.substring(start+6,end));
    }
};
fragment
ANY    :    WS? 'begin:'.*'end;'WS?;
fragment
SaveSeg    :    'store to' WS po=PATH WS?';'{
    params.put("output",po.getText());
};
fragment
WS    :    (' ' |'\t' |'\r' |'\n' )+;
fragment
ID     :     ('a'..'z' |'A'..'Z' |'_' ) ('a'..'z' |'A'..'Z' |'_' |'0'..'9' )*;
fragment
FILENAME:    ('.' | '..' |ID);
fragment
PATH    :    ('hdfs://' |'file://' |'/')?  (FILENAME '/'?)+;
fragment
CLASSNAME
    :    ID ('.' ID)*;
//fragment
Exit    :    (LoadSeg EOF)+ |SQLSeg EOF |(SaveSeg EOF);
fragment
EOL: '\n' | '\r' | '\r\n';

 

验证的java代码如下:

 public static void main(String[] args) {
        System.out.println("Hello world");

        try {
            String filename = "src/main/resources/errsql1.out";
            InputStream in = new FileInputStream(filename);
            ANTLRInputStream input = new ANTLRInputStream(in);
            Map<String, String> paras = new HashMap<String, String>();
            ExtendSQL lexer = new ExtendSQL(input, paras);
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            tokens.fill();
            for (String key : paras.keySet()) {
                System.out.print(key+":");
                System.out.println(paras.get(key));
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

 

© 著作权归作者所有

parker
粉丝 1
博文 13
码字总数 6310
作品 0
长春
私信 提问
Antlr(DSL)

Antlr Name:ANother Tool for language for Language Recognition Site: https://github.com/antlr/ https://theantlrguy.atlassian.net/wiki/display/ANTLR3/ANTLR+v3+documentation htt......

赵-猛
2016/10/26
59
0
使用 ANTLR 处理文本

简介: Antlr 是一个基于 Java 开发的功能强大的语言识别工具,其主要功能原本是用于识别编程语言,但是当我们遇到一些常规的文本处理工作时,使用 Antlr 做这些工作可能比单纯的使用正则表达...

IBMdW
2011/08/08
2.1K
1
antlrV3 第一次冲浪之旅

一、运行系统环境 centos6.3×64 java 6 二、资源下载 antlr-3.5-complete(www.r66r.net).jar 建议选择antlr3.1以上版本,原因是低版本需要包含很多独立文件,新版本已经全部打包。 PLSQL相关...

r66r
2013/06/06
597
0
扩展iQuery使其支持多种编程语言(四) – 兼编译器的语法错误处理简介

扩展iQuery使其支持多种编程语言(四) – 兼编译器的语法错误处理简介 iQuery是一个开源的自动化测试框架项目,有兴趣的朋友可以在这里下载:https://github.com/vowei/iQuery/downloads 源...

知平软件
2012/09/28
0
0
Hive Server对SQL语句的编译过程 : 前奏

上节说了,server接收到一个sql命令后,会编译此命令。 ====================================== 重点就在此了,继续往下看 ParseDriver pd = new ParseDriver(); ASTNode tree = pd.parse(co...

强子哥哥
2016/03/17
40
0

没有更多内容

加载失败,请刷新页面

加载更多

Feign输出Info级别日志

背景   spring cloud netfix组件中,feign相关的日志默认是不会输出的,需要自定义配置才能输出,并且Feign只对Debug基本的日志做出响应, 实际业务需要输出Info级别的日志,所以需要做自定...

xiaomin0322
12分钟前
2
0
面向解决问题的java编程,spring boot,mybatis generator和坑-1starter

1、start一个spring boot项目 第一课我们也不能免俗,要从starter开始,spring boot的起始项目脚手架可以从spring boot官方starter生成地址开始:https://start.spring.io/ 这张图列出了一个...

wphmoon
13分钟前
1
0
Linux虚拟化技术—CentOS7.4下KVM虚拟化一 安装配置及基本操作

Linux虚拟化技术—CentOS7.4下KVM虚拟化一 安装配置及基本操作 0行云流水00人评论61017人阅读2018-04-11 19:57:20 KVM的安装配置与基本操作 目录 第一部分 实验环境 第二部分 安装图形界面 ...

linjin200
16分钟前
1
0
php获取网站favicon.ico图标 api源码

 通常情况下,做网站的都会给自己的网站添加一个Icon,浏览器上一长排的标签页,用Icon来区分就显得更加醒目。现在想找一个没有Icon的网站并不好找,可见没有Icon的网站是多么的业余啊。"什...

xiaogg
19分钟前
1
0
双亲委派的认识

首先JVM中有三种类加载器 Bootstrap启动类加载器 Extension扩展类加载器(ExtClassLoader) System系统类加载器(AppClassLoader) 某个特定的类接到加载类的请求时候,首先将加载任务委托给...

最胖的瘦子
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部