(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
添加位置如下所示,注意在
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
输入表达式,即能够可视化的显示出该文法(以选中符号为根节点)的语法树
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)