zoukankan      html  css  js  c++  java
  • ANTLR初探

    ANTLR初探

    1.下载ANTLR放在安装目录下

    地址:https://www.antlr.org/download/index.html

    D:DevSrcCodeantlrantlr-4.5.3-complete.jar
    D:DevSrcCodeantlrantlr4.bat
    
    2.编写bat脚本
    java org.antlr.v4.Tool %*
    
    3.添加环境变量到classpath
    .;%JAVA_HOME%lib;%JAVA_HOME%libdt.jar;%JAVA_HOME%	ools.jar;D:DevSrcCodeantlrantlr-4.5.3-complete.jar
    

    添加变量路径到path

    D:DevSrcCodeantlr
    
    4.添加依赖到项目
    <dependency>
        <groupId>org.antlr</groupId>
        <artifactId>antlr4-runtime</artifactId>
        <version>4.5.3</version>
    </dependency>
    
    5.编写ANTLR文件,LearnAntlr.g4
    grammar LearnAntlr ;         // grammer是规则文件的头,要和文件名一样
    @header{                    //header代表生成的代码放在哪个包里面
    package com.antlr4;
    }
    r  : 'hello' ID;           //r代表的是语法树的根结点
    ID : [a-z]+ ;
    WS : [ 	
    ]+ -> skip ;  //ID代表未知的值
    
    6.执行g4文件
    D:DevSrcCodeantlr> antlr4 ..	ech-climbing-commonasic-tech-bigdatasrcmainjavacomantlr4LearnAntlr.g4
    

    生成如下文件

    7.新建ListenerRewrite继承LearnAntlrBaseListener
    public class ListenerRewrite extends LearnAntlrBaseListener {
        @Override
        public void exitR(LearnAntlrParser.RContext ctx) {
            final String a = ctx.getChild(0).getText().toLowerCase();
            final String b = ctx.getChild(1).getText().toLowerCase();
            System.out.println(a + " " + b);
        }
    }
    
    8.词法语法解析测试
    import org.antlr.v4.runtime.ANTLRInputStream;
    import org.antlr.v4.runtime.CommonTokenStream;
    import org.antlr.v4.runtime.tree.ParseTreeWalker;
    
    public class Antlr4Test {
        public static void main(String[] args) throws IOException {
            //输入文本hello world
            ANTLRInputStream inputStream = new ANTLRInputStream(" hello world");
            //词法分析器
            LearnAntlrLexer lexer = new LearnAntlrLexer(inputStream);
            //新建词法符号缓冲区,用于存储词法分析器生成的词法符号
            CommonTokenStream tokenStream = new CommonTokenStream(lexer);
            //新建语法分析器,处理词法符号缓冲区内容
            LearnAntlrParser parser = new LearnAntlrParser(tokenStream);
            //正对规则开始词法分析
            LearnAntlrParser.RContext context = parser.r();
            //构建监听器
            ListenerRewrite listener = new ListenerRewrite();
            //使用监听器初始化对词法分析树遍历
            ParseTreeWalker.DEFAULT.walk(listener, context);
        }
    }
    

    输出hello world

    Reference
  • 相关阅读:
    1023. 组个最小数 (20)
    1048. Find Coins (25)
    1050. String Subtraction (20)
    1041. Be Unique (20)
    1047. 编程团体赛(20)
    1043. 输出PATest(20)
    Java基础学习总结(8)——super关键字
    Java基础学习总结(8)——super关键字
    Java基础学习总结(7)——Object类
    Java基础学习总结(7)——Object类
  • 原文地址:https://www.cnblogs.com/wat1r/p/13636883.html
Copyright © 2011-2022 走看看