IDEA 中 ANTLR 4 的安装与使用

IDEA 中 ANTLR 4 的安装与使用,第1张

(1)在 File - Settings - Plugins 中,安装 ANTLR v4 插件

(2)创建 maven 项目

File - New - Project… 中,选择 maven,

然后一路 next 即可(当然,可以自己取个名字,换个位置)

(3)在 pox.xml 中添加 antlr 的依赖项

    
        
            org.antlr
            antlr4-runtime
            4.10.1
        
    

    
        
            
                org.antlr
                antlr4-maven-plugin
                4.10.1
                
                    
                        antlr
                        
                            antlr4
                        
                        none
                    
                
                
                    src/test/java
                    true
                    true
                
            
        
    

添加位置如下所示,注意在 的地方修改成自己的 antlr 版本!



    4.0.0

    org.example
    untitled1
    1.0-SNAPSHOT

    
        13
        13
    

    // 上面一坨粘在这里

(4)在 src\main\java 下新建一个 antlr 文法文件,以 .g4 为后缀名,

文件头部 grammer 关键字定义文法名字,必须与文件名相同,因此我们的文件就叫 demo.g4

此处定义一个语法,识别以 hello 开头的短句

grammar demo;            // Define a grammar called demo

parse : prog+ ;              // A program consists of at least one statement

prog : 'Hello' ID            // match keyword hello/Hello followed by an identifier
    | 'hello' ID
    ;

ID : [a-z]+ ;               // match lower-case identifiers

WS : [ \t\n\r]+ -> skip ;   // skip spaces, tabs, newlines, \r (Windows)

(5)右键 demo.g4 文件,选择 Configure ANTLR…,配置输出路径;

若不填写 output directory where all output is generated,默认会在根目录下生成 gen 文件夹;

Language 若不填写则默认生成 java 语言;

 (6)右键 demo.g4 选择 Configure ANTLR Recognizer,生成输出结果;

生成后的项目结构如图所示(同为整个项目的结构):

其中,demoLexer是词法分析器,demoParser是语法分析器,

demoVistor和demoListener是两种遍历树的机制,分别是访问者模式和监听器模式

(7)调用分析器进行测试

在 src\main\java\demo1 下新建 test 包(demo1是我自己新建的包),

在 test 包下新建 demoMain.java 文件

package demo1.test;

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;

import demo1.demo.demoLexer;
import demo1.demo.demoParser;

public class demoMain {
    public static void run(String expr) throws Exception{
        // 对每一个输入的字符串,构造一个 ANTLRStringStream 流 in
        ANTLRInputStream input = new ANTLRInputStream(expr);
        // 用 in 构造词法分析器 lexer,词法分析的作用是将字符聚集成单词或者符号
        demoLexer lexer = new demoLexer(input);
        // 用词法分析器 lexer 构造一个记号流 tokens
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        // 再使用 tokens 构造语法分析器 parser,至此已经完成词法分析和语法分析的准备工作
        demoParser parser = new demoParser(tokens);
        // 最终调用语法分析器的规则 parse(在demo.g4里定义的规则),完成对表达式的验证
        parser.parse();
    }

    public static void main(String[] args) throws Exception{
        String[] testStr={
                "Hello world",
                "hello world",
                "hi world"
        };
        for(String s : testStr){
            System.out.println("Input: " + s);
            run(s);
        }
    }
}

注意 run() 函数最后的 parse.parse() 语句修改为自己的文法规则名称

(此处规则为 parse,即 demo.g4 文件第一个表达式 parse : prog+ ; )

运行 demoMain.java,

当输入合法的表达式时,分析器没有任何输出;

当输入表达式违反文法规则时,分析器输出 line mismatched 信息提示;

(8)可视化文法

在 demo.g4 文件中选择一个文法规则,右键,选择 Text Rule parse

 在打开的 ANTLR Preview 中选择 input

输入表达式,即能够可视化的显示出该文法(以选中符号为根节点)的语法树

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/870689.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存