• 京京beaver
    2019-09-10
    1. windows环境下配置
    可执行文件,放在D:\tools\antlr\antlr-4.7.2-complete.jar下面

    2.配置环境文件
    CLASSPATH=%CLASSPATH%;D:\tools\antlr\antlr-4.7.2-complete.jar
    PATH=%PATH%n;D:\tools\antlr

    3.手写文件antlr4.bat和grun.bat
    antlr4.bat
    java org.antlr.v4.Tool %*

    grun.bat
    @ECHO OFF
    SET TEST_CURRENT_DIR=%CLASSPATH:.;=%
    if "%TEST_CURRENT_DIR%" == "%CLASSPATH%" ( SET CLASSPATH=.;%CLASSPATH% )
    @ECHO ON
    java org.antlr.v4.gui.TestRig %*

    4.然后就可以执行antlr4和grun命令了
    比如antlr4 Hello.g4, javac Hello*.java,
    $ grun Hello r -gui
    hello parrt
    ^Z (windows)

    5.java执行路径要注意事项
    在命令行执行java命令,记得把目录设置到src/main/java这里,然后输入包名.类名,才能找到。
    这是java执行的基本规则,一般IDE里面替你做了路径转换,在命令行要自己敲入。切记。

    例如
    F:\study_repo\mygeek_time\myclang-03-grammar-analysis\src\main\java>
    grun com.babayetu.myclang03gramm
    aranalysis.antlrtest.PlayScript expression -gui
    展开

    作者回复: 非常感谢你的整理!
    其他同学可以参考你的配置方法!

     2
     6
  • Smallfly
    2019-09-05
    这一讲走的有点艰难,记录一下:

    1、
    开始执行下面的命令,报找不到 CommonLexer。

    antlr PlayScript.g4

    看了下 Github 才发现有这个文件。

    import CommonLexer, 在语法规则文件 PlayScript.g4 中导入词法规则。

    2、

    antlr PlayScript.g4

    上面的命令后应该先 cd .. 回退一级目录,再执行:

    javac antlrtest/*.java

    或者,直接:

    javac ./*java

    3、

    grun antlrtest.PlayScript expression -gui

    文中说执行这条命令结果会以图形化界面显示,我执行之后什么都没有输出,以为前面步骤有什么问题,重新来了一次,还是这样,往下看才意识到没输出才是正常的。。。

    ——

    看到最后弹出的 AST 树还是蛮有意思的。

    我写了一版简单的 Swfit 规则文件:

    https://github.com/iostalks/PlayWithCompiler/tree/lecture-6/PlayWithCompiler/Antlr
    展开

    作者回复: 哇,练习自己写规则,太帮了!
    自己动手所获得的感觉是难以替代的。
    中间过程遇到的每个坑,都是自己的积累!

    另外,这里也有几个swift的规则文件可以参考:
    https://github.com/antlr/grammars-v4

    
     2
  • PythonAI
    2019-08-26
    ➜ antlr grun antlrtest.PlayScriptexpression -gui

    Can't load antlrtest.PlayScriptexpression as lexer or parser

    作者回复: expression前要有空格,前面没有antlr。
    grun antlrtest.PlayScript expression -gui
    我请编辑把那个空格加上。

     2
     2
  • 七月有风
    2019-12-25
    不知道是什么问题?
    $ grun Hello tokens -tokens Hello.play
    Exception in thread "main" java.lang.NoClassDefFoundError: antlrtest/Hello (wrong name: Hello)
            at java.base/java.lang.ClassLoader.defineClass1(Native Method)
            at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
            at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
            at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802)
            at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700)
            at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623)
            at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
            at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
            at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
            at org.antlr.v4.gui.TestRig.process(TestRig.java:135)
            at org.antlr.v4.gui.TestRig.main(TestRig.java:119)
    展开

    作者回复: 可能是CLASSPATH设置的问题,或者是运行grun命令的目录不对。参见我整理的一篇文字,梳理了antlr使用的要点:
    https://github.com/RichardGong/PlayWithCompiler/blob/master/antlr_install.md

    
     1
  • 七月有风
    2019-12-23
    macOS下,需要将把 Antlr 的 JAR 文件设置到 CLASSPATH 环境变量中:
    如果是用Homebrew 安装的 Antlr,安装路径是:/usr/local/Cellar/antlr/4.7.2/antlr-4.7.2-complete.jar;
    可以使用vi ~/.bash_profile命令打开bash_profile文件,将export CLASSPATH=".:/usr/local/Cellar/antlr/4.7.2/antlr-4.7.2-complete.jar:$CLASSPATH"这段代码复制到里面。
    然后就可以运行javac *.java了

    作者回复: 感谢分享!
    我这两天整理了Antlr使用的要点,可以参见这里:
    https://github.com/RichardGong/PlayWithCompiler/blob/master/antlr_install.md

    
     1
  • mudfrog
    2019-09-01
    老师,我的程序能编译通过,也能正常运行,能正常的解析和运算出来,但就是想看看语法树直观一些。我使用grun的时候总是提示Can't load CalExpr as lexer or parser,这里CalExpr到底是G4文件还是tokens文件呢,我把这两个文件都拷贝到src目录下了。我用的是win7底下的eclipse,

    作者回复: 1.grun是用的Class文件,是java类。
    2.但运行grun的时候,最好就在CLASSPATH的目录下。
    假设,class和g4文件位于:
    playscript-java/src/main/play

    其中play是包名,而CLASSPATH设置的是:
    playscript-java/src/main
    那么你就在main这个目录下运行grun。

    如果都不带包,就更简单一些,让grun就在带有class和.g4的目录中运行就好。

    如果还有问题的话,请继续再问!

     1
     1
  • 沉淀的梦想
    2019-08-29
    老师,为什么我用antlr生成的AdditiveExpressionContext就没有示例程序中的ADD() SUB()这些直接以token名字命名的方法呢?

    作者回复: 再检查一下规则文件。
    你看看你的词法规则里是否给加号和减号起了ADD和SUB这样的名字,就像下面这样。
    ADD : '+';
    SUB : '-';
    只要有这样的定义,在语法里无论用ADD还是用'+',都会生成ADD()这样的方法。

     1
     1
  • kaixiao7
    2019-08-26
    在Windows下需要用 ^z 即Ctrl+z 来弹出AST窗口

    That ^D means EOF on unix; it's ^Z in Windows.

    作者回复: windows下用^Z?我都没注意到这点。
    好的,一个有用的知识,应该加到文稿中去。
    谢谢你的提醒!
    20年前开始学unix命令的时候,就一直用^D,完全没注意到在windows下的用法:-D

    
     1
  • 瓜瓜
    2020-02-01
    ANTLR Tool version 4.8 used for code generation does not match the current runtime version 4.7.2
    win7的系统 class_path:%TOOL_HOME%\antlr-4.7.2-complete.jar;
    path:D:\antlr;

    D:\antlr>dir
     驱动器 D 中的卷没有标签。
     卷的序列号是 BE10-222B

     D:\antlr 的目录

    2020/02/01 10:04 <DIR> .
    2020/02/01 10:04 <DIR> ..
    2020/01/29 10:07 2,079,769 antlr-4.7.2-complete.jar
    2020/01/29 10:20 25 antlr.bat
    2020/01/29 12:09 32 grun.bat
                   3 个文件 2,079,826 字节
                   2 个目录 18,834,886,656 可用字节
    为什么总是报这个警告,我第一次下载了一个4.8版本的,放在了这个目录下,后来把4.8版本的删除了,望老师帮忙解答下,感谢
    展开
    
    
  • 火火
    2019-11-28
    Hello.java:2: 错误: 程序包org.antlr.v4.runtime不存在
    import org.antlr.v4.runtime.Lexer;
                               ^
    Hello.java:3: 错误: 程序包org.antlr.v4.runtime不存在
    import org.antlr.v4.runtime.CharStream;
                               ^
    Hello.java:4: 错误: 程序包org.antlr.v4.runtime不存在
    import org.antlr.v4.runtime.Token;
                               ^
    Hello.java:5: 错误: 程序包org.antlr.v4.runtime不存在
    import org.antlr.v4.runtime.TokenStream;
                               ^
    Hello.java:8: 错误: 程序包org.antlr.v4.runtime.dfa不存在
    import org.antlr.v4.runtime.dfa.DFA;
                                   ^
    Hello.java:12: 错误: 找不到符号
    展开

    作者回复: 这个问题的原因是antlr的jar包没有放到CLASSPATH中。
    我这两天整理了antlr安装、配置、使用的一些信息,写了一个说明文件,你可以参考一下:
    https://github.com/RichardGong/PlayWithCompiler/blob/master/antlr_install.md

    
    
  • 小乙哥
    2019-11-10
    mac下面按照antlr的命令:: brew install Antlr
    按照完成Antlr之后,需要配置一下CLASSPATH,不然使用antlr命令的时候会提示找不到antlr相关类

    export ANTLR_HOME=/usr/local/Cellar/antlr/4.7.2
    export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib:$ANTLR_HOME/antlr-4.7.2-com plete.jar

    作者回复: 感谢经验分享!
    还有一个同学建议用maven管理项目,pom里面加上对antlr的依赖就行了,这样开发环境的维护会比较简单。
    但是要用命令行工具的话,还是要像你一样做一下环境变量的配置。

    
    
  • Sudouble
    2019-10-18
    按着顺序操作下来,词法分析这块的理解清晰很多。中文编程,在词法分析下,和英文编程几乎等价。感谢留言中筒靴的配置指南。

    一个小Tip:windows下配置好环境变量,记得注销或重启,让环境变量生效。

    作者回复: 也感谢你留的小Tip!

    
    
  • 庆霖
    2019-10-12
    哎呀,稀碎一个ANTLR4配了两天超低效率一顿踩坑最后终于在这个教程找到了坑在哪https://blog.csdn.net/shine_journey/article/details/17952163,那两个bat要放到C盘的system和system32才会生效(* ̄m ̄),我一直以为是我环境变量设置的有问题我寻思着复制粘贴都有问题可咋整。另,宫老师我解决了vscode输出提示的COLON,目测是其中有些字符中文输入法输入了,找其他一样的地方复制粘一下就好了😁

    作者回复: 太好了,其他同学可以参考你这篇文章!
    分号的问题,原来是输入法导致的....也好,又增长了一个经验!

     1
    
  • 庆霖
    2019-10-11
    vscode的插件输出是这样的
    error(50): f:\antlr4test\Hello.g4:36:26: syntax error: missing COLON at '[ \t]' while matching a lexer rule
    老师请问我是在哪里缺了符号
    
    
  • 庆霖
    2019-10-10
    宫老师,我在写hello.g4的时候空白字符抛弃里[ \t]这里vscode的输出说这里缺少COLON这是为什么呢,求解答

    作者回复: Antlr语法规则,每行后面都要有分号。是不是有哪句忘了写分号呢?

    
    
  • 阿尔伯特
    2019-09-30
    This is really COOL!

    作者回复: 看来你真的比较喜欢编译技术:-)

    
    
  • wj
    2019-09-19
    请教老师, Abstract Tree Matching 有已经实现的算法可以用吗? 网上我只找到相关的论文, 我在想比较两个 java 文件的结构, 可能比较 AST 树会更直接一些?

    作者回复: 据我所知,Tree Pattern Matching这类问题,从上世纪80年代就有研究,所以有很多这样的算撒。我们后端的指令选择问题,本质上也是树匹配。

    有人用树的匹配去分析源代码。这样的话,源代码会变成结构化的信息,因此能带来额外的优势。

    我相信,把源代码先变成结构化的数据(AST),然后再分析,也会用于人工智能编程领域。

    
    
  • 曾经瘦过
    2019-09-18
    今晚回去后跟着操练操练,感觉很酷

    作者回复: 多动手才会有感觉!

    
    
  • 长方体混凝土移动工程...
    2019-09-09
    Letter LetterOrDigit* 这个中间加个空格 是什么意思?

    作者回复: 意思是:第一个字符必须是字母,之后的字符可以是字母或数字。

    
    
  • 夜行观星
    2019-08-29
    学到很多,期待后续的课程

    作者回复: 一起努力!

    
    
我们在线,来聊聊吧