Java antlr 学习

77 篇文章 0 订阅

在Java项目中常常见到这个,antlr-x.x.x.jar;

下面来认识antlr;

antlr是指可以根据输入自动生成语法树并可视化的显示出来的开源语法分析器。ANTLR—Another Tool for Language Recognition,其前身是PCCTS,它为包括Java,C++,C#在内的语言提供了一个通过语法描述来自动构造自定义语言的识别器(recognizer),编译器(parser)和解释器(translator)的框架。(摘自百度百科)


antlr-2.7.6.jar的作用

项目中如果没有添加antlr-2.7.6.jar,那么相关的hibernate映射不会执行hql语句,

并且会报NoClassDefFoundError:antlr/ANTLRException错误。


JPA标准中,面向对象的语法检查、识别:
如JPA 实现Hibernate中用到hql语句:from Person p
到数据库的时候它会转换成select * from person;

就是说antlr是一个开源语法分析器,并能可视化显示语法树;

在Java项目中引用是用来实现把hibernate的hql语句转换为标准SQL语句,应该是这样,这需要语法分析;

下载地址,

http://www.antlr.org/download/antlr-4.0-complete.jar

IDEA中有ANTLR插件, 提供可视化语法树;类似如下图,

antlr语法树
在使用ANTLR生成语法分析器时,可以利用其提供的树API来操作和处理语法分析生成的树。以下是一个简单的例子,展示了如何使用ANTLR v4的树API来遍历和操作语法树。

假设我们有以下的简单语法(Grammar.g4):

grammar Grammar;
 
prog: stat+;
 
stat: expr NEWLINE                # printExpr
    | ID '=' expr NEWLINE          # assign
    | NEWLINE                      # blank
    ;
 
expr: expr '+' expr                # add
    | expr '-' expr                # subtract
    | INT                          # int
    ;
 
INT :   [0-9]+;
ID  :   [a-zA-Z]+;
NEWLINE:'\r'? '\n';
SPACE: [ \t]+ -> skip;


以下是一个简单的Java代码片段,展示了如何使用ANTLR v4的Tree API来遍历和操作语法树:

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
 
public class MyApp {
    public static void main(String[] args) throws Exception {
        // 假设我们有一个输入字符串
        String input = "a = 3\n" + "b = 4\n" + "c = a + b\n";
        // 创建一个字符流和语言识别器
        CharStream stream = CharStreams.fromString(input);
        GrammarLexer lexer = new GrammarLexer(stream);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        // 解析输入
        GrammarParser parser = new GrammarParser(tokens);
        ParseTree tree = parser.prog(); // 获取语法分析树的根节点
 
        // 使用事件监听器来遍历语法树
        ParseTreeWalker walker = new ParseTreeWalker();
        MyListener listener = new MyListener();
        walker.walk(listener, tree);
    }
 
    // 自定义的监听器,用于处理语法树中的节点
    static class MyListener extends GrammarBaseListener {
        @Override
        public void exitPrintExpr(GrammarParser.PrintExprContext ctx) {
            System.out.println(ctx.expr().toStringTree(new GrammarParser(null)));
        }
 
        @Override
        public void exitAssign(GrammarParser.AssignContext ctx) {
            System.out.println(ctx.expr().toStringTree(new GrammarParser(null)));
        }
    }
}
在这个例子中,我们定义了一个名为MyListener的监听器类,它扩展了由ANTLR自动生成的基础监听器类GrammarBaseListener。我们覆盖了exitPrintExpr和exitAssign方法来处理语法树中的打印和赋值语句。ParseTreeWalker类用于遍历语法树,walker.walk(listener, tree)调用会触发监听器中相应的方法。

这个例子展示了如何使用ANTLR的Tree API来操作和处理语法树,这是自然语言处理和编译器设计等领域中一个非常有用的工具。

ANTLR官网
https://www.antlr.org/download.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值