antlr4环境配置及入门 - datakv/wiki_language GitHub Wiki

antlr4环境配置及入门

2020-6-21 10:28:42

官网 https://www.antlr.org/

选择一个工作目录, 以下所有操作都是基于此目录,比如

C:\wpc\OneDrive - Microsoft\LightAntlr

从官网下载

https://www.antlr.org/download/antlr-4.8-complete.jar

创建文件

  • start.bat:
echo (%~dp0)
SET CLASSPATH=;%~dp0\antlr-4.8-complete.jar;
SET PATH=;%~dp0;%PATH%
cmd

  • antlr4.bat:
java org.antlr.v4.Tool -visitor %*
  • grun.bat:
java org.antlr.v4.gui.TestRig %*

创建目录 Calc, 并且在此目录下创建以下文件:

  • BasicTypes.g4:
lexer grammar BasicTypes;

fragment DIGIT: [0-9]; 
//Fragment修饰的方法,到时候在程序里不会生成 DIGIT()。
//而下面的NUMBER没有fragment, 则可以通过 NUMBER() 来访问。

fragment S_QUOTE: '\'';
fragment QUOTE: '"';
fragment ALPHABET: [A-Za-z_];

NUMBER: DIGIT+('.'DIGIT+)? ; //数字类型,包括浮点和整型

// 两种模式,一种是单引号,一种是双引号
STRING: S_QUOTE (~'\'')* S_QUOTE //单引号字符串
    | QUOTE ('\\"'|~'"')* QUOTE //双引号字符串
    ;

ID: ALPHABET+(DIGIT(ALPHABET)*)*;

WS: [ \r\t\n]+ -> skip; // Skip all the white spaces.

  • Operators.g4:
lexer grammar Operators;

MUL: '*';
DIV: '/';
ADD: '+';
SUB: '-';
POW: '^';
MOD: '%';

  • Expr.g4:
grammar Expr;

import Operators, BasicTypes; //导入之前定义的符号 和 数据类型

// 加入`#`,叫Annotation, 生成的Listener和visitor会有相应的方法来触发这个事件。
// 我认为这个应该叫 触发器注解。
// 注意,这个注解要么一个都不写,要么整条规则每一个模式都要写。
expr: SUB NUMBER                #NegativeNumber
    | expr POW expr             #Pow
    | expr (MUL|DIV|MOD) expr   #Mul_Div_Mod
    | expr (ADD|SUB) expr       #Add_Sub
    | ID                        #Identifier
    | NUMBER                    #Number
    | '(' expr ')'              #Parentheses
    ;

回到工作目录, 双击执行start.bat, 执行:

cd Calc
antlr4 Expr.g4

此时生成了

Expr.interp  
ExprBaseListener.java  
ExprLexer.interp  
ExprLexer.tokens   
ExprParser.java   
Expr.tokens  
ExprBaseVisitor.java   
ExprLexer.java    
ExprListener.java  
ExprVisitor.java

紧接着执行 grun Expr expr -gui, 输入测试数据21 + 12*(9 + 7) / 4 - 6 + 5 ^ 3; 或者把测试数据21 + 12*(9 + 7) / 4 - 6 + 5 ^ 3写入abcdef.txt, 执行grun Expr expr -gui abcdef.txt, 此时能看到语法树的图.