美文网首页
DSL从入门到放弃 - ANTLR之HelloWorld

DSL从入门到放弃 - ANTLR之HelloWorld

作者: 小校有来有去 | 来源:发表于2019-02-20 23:00 被阅读0次

    ANTLR是什么

    ANTLR 即 ANother Tool for Language Recognition

    • 框架,可以通过包含Java、C++、或C# Action的语法描述来构造语言识别器,编译器和解释器。
    • 本身是Java 开发的
    • 类似工具Lex、YACC,JavaCC等。
    • 使用上下文无关的描述语言。在Antlr中可以自动生成Lexer、Parser和Tree Parser。

    应用场景

    • 编程语言处理,DSL。
    • 本文处理:可以完成正则表达式无法完成的工作(如:左右括号匹配)。

    Hello World

    可以参考Getting Started with ANTLR v4

    准备材料

    • antlr-4.5.1-complete.jar

    环境搭建

    设置CLASSPATH

    CLASSPATH=.;%JAVA_HOME%\lib\rt.jar;%TOOL_HOME%\antlr-4.0-complete.jar;
    

    注:前面的 .; 不能少,否则后面的grun无法执行。

    创建bat并添加到Path

    antlr4.bat

    java org.antlr.v4.Tool %*
    

    grun.bat

    java org.antlr.v4.gui.TestRig %*
    

    验证

    >java org.antlr.v4.Tool
    ANTLR Parser Generator  Version 4.5.1
     -o ___              specify output directory where all output is generated
     -lib ___            specify location of grammars, tokens files
     -atn                generate rule augmented transition network diagrams
     -encoding ___       specify grammar file encoding; e.g., euc-jp
     -message-format ___ specify output style for messages in antlr, gnu, vs2005
    ...
    

    国际惯例,Hello World

    首先,需要写Hello.g4文件,内容如下

    grammar Hello;
    r  : 'hello' ID ;         // 匹配关键字 hello 以及之后的 ID
    ID : [a-z]+ ;             // 匹配小写字符串
    WS : [ \t\r\n]+ -> skip ; // 跳过空格、空行、Tab
    

    输入

    > antlr4 Hello.g4  #生成java文件
    

    输入

    > javac Hello*.java  #编译java文件
    

    可以测试了,输入

    > grun Hello r -tree
    hello world
    ^Z
    (r hello world)
    #The -tree option prints the parse tree in LISP notation.
    
    > grun Hello r -gui
    hello world
    ^Z
    #show parse tree inspector gui
    

    注: 执行grun时可能出现 Can’t load Hello as lexer or parser,是因为CLASSPATH设置问题

    注: 这些操作都可以使用antlrWorks实现

    语法简介

    首先要定义Antlr文法文件,V4版本以.g4为文件后缀,以前版本用.g。

    文件的头部是 grammar 关键字,定义文法的名字,必须和文件名称相同。

    grammar Hello;
    

    语法定义

    规定语法定义符号的第一个字母小写

    r  : 'hello' ID ;
    

    词法定义

    词法定义符号(Token)的第一个字母大写

    ID : [a-z]+ ;
    WS : [ \t\r\n]+ -> skip ;
    

    注: 这些在 AntlrWorks 中都可以做到可视化。

    其他

    除了 ANTLR 之外,还有大名鼎鼎的 JetBrains 开发的 MPS,Eclipse 的 TEXT。

    相关文章

      网友评论

          本文标题:DSL从入门到放弃 - ANTLR之HelloWorld

          本文链接:https://www.haomeiwen.com/subject/gznkyqtx.html