【转】antlr使用

本文介绍ANTLR解析器的基础知识,包括词法、语法和语义分析,并通过实例演示如何使用ANTLR处理简单的数学表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概念:
      antlr是 another tool for language recongnition,用于 词法、语法和语义分析。如果大家仔细看一些开源项目的lib包,会经常看到其包含有antlr.jar文件。

2、使用场景:
        设想一个运算的场景,“1+3”为多少,如果通过程序解析这个字符串,可以尝试使用拆解字符串的方法,识别其中的运算符“+”,然后将结果输出,感觉很简单。但是,如果场景变化呢?“1+3-6/2”这个样子的呢,也得改程序?是不是有些头大呢?那么antlr就可以帮助你来解决这个头大的问题。

3、主要内容:
          antlr重要包含三个重要的内容,分别是 词法分析、语法分析、语义分析,其各个部分的用途主要如下所示:
          词法分析:  (识别出 “1”,“+”,“3”)

               (1)逐个字符读取公式源文件

               (2)识别公式源文件中的词法单元(Token)

                (3)将词法单元传递给语法分析器

               (4)词法分析器又叫扫描器(Scanner)  
        语法分析:(识别1+3)

                (1)从词法分析器获得词法单元

                (2)利用文法定义验证词法单元组合

               (3)构造语法分析树

                (4)将语法分析树传递给下一阶段

               (5)语法分析器又叫解析器(Parser)
         语义分析:(计算结果)
              (1)完成语义动作定义

              (2)一般在语法分析器中完成语义分析

       大致各部分的含义就是,首先 识别出 输入的字符是否正确,其次检验字符之间的运算关系,然后计算得出相关的结果。

4、主要工作:
         需要写两个.g的文件,分别是 Expr.g和Eval.g文件,前者生成词法、语法分析相关的java文件,通过编译生成ExprLexer.java、ExprParser.java 和 Expr.tokens文件,后者生成语义分析文件,分别为Eval.java和Eval.tokens文件。
         相关的编译方法为:java org.antlr.Tool Expr.g

5、开发环境搭建:
          1、配置java环境变量
          2、将antlr的相关jar包添加到环境变量中
          3、运行 java org.antlr.Tool 进行验证

6、简单代码展示,用于计算简答的加减运算
          1)、expr.g
grammar Expr;
options {
 language=Java;
 output=AST;
 ASTLabelType=CommonTree; // type of $stat.tree ref etc...
}
@header {
 package test.tool;
}

 prog: ( stat {/* System.out.println($stat.tree.toStringTree()); */})+ ;

stat
 : expr  NEWLINE -> expr
 | NEWLINE    ->
 ;
expr: multExpr (('+' ^|'-' ^) multExpr)* ;
multExpr
 : atom (('/' ^|'*' ^) atom)*
 ;
 
atom

 : INT
 | DOUBLE
 | ID
 | '(' ! expr ')' !
 ; 

ID  :   ('N'|'R'|'A'|'C'|'I'|'D')'B'('S'|'H');
INT :   '0'..'9'+ ;
WS  :   (' '|'\t')+ {skip();} ;
NEWLINE:'\r'? '\n' ;
DOUBLE : (('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') ('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9')*) '.' (('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') ('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9')*); 

        2)Eval.g
           

tree grammar Eval;     
options {
 tokenVocab=Expr;    // read token types from Expr.tokens file
 ASTLabelType=CommonTree;  // what is Java type of nodes?
}
@header {
 package fanxiqian.tool;(可在此处添加 package和import等相关信息)
}
@members {
       …………(可在此处添加java方法) 
}

prog: stat+ ;
stat: expr+;

expr returns [double value]
 : ^('+' a=expr b=expr) {$value = a+b;}  //此处定义了 相关运算符的含义
 | ^('-' a=expr b=expr) {$value = a-b;}
 | ^('*' a=expr b=expr) {$value = a*b;}
 | ^('/' a=expr b=expr) {$value=a/b;}
 | INT {$value = Integer.parseInt($INT.text);}
 | DOUBLE {$value = Double.parseDouble($DOUBLE.text);}
 ; 

         3)通过编译命令,生成相关的java文件
                       java org.antlr.Tool Expr.g
                       java org.antlr.Tool Eval.g  

          4)编写相关的测试类
public class Test 
{
    public static void main(String[] args) throws Exception 
    {
     ANTLRStringStream input;
     ExprLexer lexer;
     CommonTokenStream tokens;
     ExprParser parser;
      String formula="1+3";
   //开始解析

  formula += "\n";
   input = new ANTLRStringStream(formula);
   lexer = new ExprLexer(input);
   tokens = new CommonTokenStream(lexer);
   parser = new ExprParser(tokens);
   ExprParser.prog_return r = parser.prog();
   // walk resulting tree
         CommonTree t = (CommonTree)r.getTree();
         CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
         Eval walker = new Eval(nodes);
         System.out.println(walker.expr());
//  }   

即可得到输出结果为4。

7,总结
       antlr是个强大的公式解析工具,本文只是简单的一个小结,以后遇到相关的使用继续补充吧,欢迎大家补充添加吧。
### ANTLR4 使用教程:开始入门 ANTLR(Another Tool for Language Recognition)是一个强大的语言识别工具,可以用于构建自定义的解析器、编译器和解释器。它支持多种目标语言,包括 Java、Python、C#、JavaScript 等。以下是使用 ANTLR4 进行开发的基本入门步骤。 #### 安装 ANTLR4 在 Windows 上安装 ANTLR4 命令行环境需要以下步骤: 1. **下载 ANTLR JAR 文件** 从 [ANTLR 官方网站](https://www.antlr.org/download.html) 下载最新版本的 `antlr-4.x-complete.jar` 文件。 2. **设置环境变量** 将 ANTLR JAR 添加到系统类路径中,可以通过创建 `CLASSPATH` 环境变量来实现: ``` .;C:\path\to\antlr-4.x-complete.jar ``` 3. **创建批处理文件** 创建一个名为 `antlr4.bat` 的批处理文件,内容如下: ```bat @echo off java -Xmx500m org.antlr.v4.Tool %* ``` 4. **创建测试运行脚本** 创建一个名为 `grun.bat` 的脚本来运行生成的解析器: ```bat @echo off java org.antlr.v4.runtime.misc.TestRig %* ``` 5. **验证安装** 在命令行中输入以下命令以确认安装成功: ``` antlr4 -version ``` #### 配置 IDE 支持 如果使用的是 IntelliJ IDEA,可以通过插件来简化 ANTLR4 的开发流程: 1. **安装插件** 打开 IntelliJ IDEA,进入 `Settings > Plugins`,搜索 "ANTLR v4 grammar plugin" 并安装该插件。重启 IDEA 后即可使用。 2. **手动配置** 如果不使用插件,也可以通过命令行生成语法分析器和词法分析器,并在项目中手动导入生成的代码文件[^2]。 #### 编写语法规则 ANTLR4 使用 `.g4` 文件来定义语言的语法结构。以下是一个简单的 Lisp 语言解析器的语法示例: ```antlr grammar Lisp; expr: atom | '(' expr+ ')' ; atom: NUMBER | SYMBOL ; NUMBER: '-'? DIGIT+ ('.' DIGIT+)?; SYMBOL: [a-zA-Z]+; WS: [ \t\r\n]+ -> skip; fragment DIGIT: [0-9]; ``` 在这个语法中,`expr` 表示表达式,它可以是原子值或括号包围的表达式列表;`atom` 可以是数字或符号。此外,还定义了空白字符跳过规则以及辅助的数字和符号识别规则[^4]。 #### 生成解析器和词法分析器 使用 ANTLR 工具将 `.g4` 文件换为解析器和词法分析器代码: ```bash antlr4 Lisp.g4 ``` 该命令会生成多个 Java 文件,其中包括 `LispLexer.java` 和 `LispParser.java`,这些文件包含了基于语法定义的解析逻辑。 #### 测试语法解析 为了测试生成的解析器,可以使用 `TestRig` 工具进行交互式测试: ```bash grun Lisp expr -tree ``` 输入测试文本后,工具会输出对应的解析树结构,帮助开发者理解输入是否符合预期的语法格式[^4]。 #### 使用 Eclipse 插件进行图形化调试 对于 Eclipse 用户,可以安装 Antlr4IDE 插件来进行可视化调试: 1. **安装插件** 在 Eclipse 中,选择 `Help > Eclipse Marketplace`,搜索 "ANTLR v4 IDE" 并安装插件。 2. **创建 ANTLR4 项目** 选择 `File > New > Other > ANTLR4 > ANTLR4 Project`,然后按照向导创建新项目。 3. **查看解析树和语法图** 打开 `Parse Tree` 和 `Syntax Diagram` 视图,选择要测试的语法规则并输入测试文本,右侧将显示解析树结果[^3]。 #### Maven 集成 如果你正在使用 Maven 构建项目,可以利用 `antlr4-maven-plugin` 自动生成解析器代码: ```xml <build> <plugins> <plugin> <groupId>org.antlr</groupId> <artifactId>antlr4-maven-plugin</artifactId> <version>4.8</version> <executions> <execution> <goals> <goal>generate</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 执行 `mvn generate-sources` 命令后,插件会自动处理项目中的 `.g4` 文件并生成相应的解析器类[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值