ANTLR 4(一)Getting Started

1. 配置java环境

    安装jdk1.7以上版本,我装的是“jdk-8u181-windows-x64.exe”。

    设置 “C:\Program Files\Java\jdk1.8.0_181\bin" 到path环境变量。

    设置 "C:\Program Files\Java\jdk1.8.0_181" 到 JAVA_HOME 环境变量。

    设置  "%JAVA_HOME%\lib"和"."到  CLASSPATH 环境变量。

2. 配置ANTLR4环境

    从   “https://www.antlr.org/download/”  下载最新的4.9版本的ANTLR4 jar包 “antlr-4.9-complete.jar”。

    将“antlr-4.9-complete.jar”的本地文件路径加入到CLASSPATH 环境变量。

3. 测试

    1)使用上下文无关文法(巴克斯范式)来写一个最简单的定义整形变量的文法,保存为test1.g4,扩展名g4,应该是ANTLR4的规范

         使用options可以设置生成代码的语言类型,如果不设置,默认为java

grammar test1;
//options {language=Cpp;}
//options {language=CSharp;}
//options {language=Java;}
//options {language=Python3;}
int_variable  : 'int' ID '=' INTEGER ';' ;
ID : [a-z]+ ;
INTEGER: [0-9]+ ;
WS : [ \t\r\n]+ -> skip ;

    2)  生成语法解析器源码

 java org.antlr.v4.Tool test1.g4

   3)编译语法解析器源码

javac test1*.java

   4)启动语法解析器

java org.antlr.v4.gui.TestRig test1 int_variable -gui

  5)输入一个定义整形变量的语句,输入完毕后,回车,ctrl + z,回车

int abc = 123;

  6)语法解析树显示

4. 总结

     1)我们只需要使用巴克斯范式来对语言进行形式化的描述,并按ANTLR规范来编写g4文件,ANTLR即可帮我们生成多种语言源码的语法解析器,并且将语法解析树以图形化的方式显示出来,非常直观,比bison要好用,而且适合对我们自己编写的巴克斯范式进行调试排错。

     2)但是不知道如何用其生成java代码和我自己的程序结合,如果按照bison的方式,我们可以自己编写属性文法,即语义分析代码加入到bison帮我们创建的语法解析树中。因为属性文法本身就是基于上下文无关文法的,这样我就可以借助语法树来作我自己的语义分析,毕竟我们自己发明的语言的语义只有自己知道嘛。但是目前不知道ANTLR如何加入我们自己的语义代码。不过我觉得如果ANTLR应该不只是帮我分析我发明的文法的正确性,后续需要继续研究官方文档。

 

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThreadPoolExecutor源码学习(2)-- 在thrift中的应用

thrift作为一个从底到上除去业务逻辑代码,可以生成多种语言客户端以及服务器代码,涵盖了网络,IO,进程,线程管理的框架,着实庞大,不过它层次清晰,4层每层解决不同的问题,可…

ANTLR VS FLEXBISON

1. ANTLR可以一站式的解决词法与语法解析器的生成。 FLEX&BISON需要配合使用,一个实现词法解析器,一个实现语法解析器。 2. ANTLR通过在文法文件中的设置,可以生成多个语言代码。 options {languageCpp;} options {languageCSharp;} op…

[POJ 1742] Coins 【DP】

题目链接:POJ - 1742 题目大意 现有 n 种不同的硬币,每种的面值为 Vi ,数量为 Ni ,问使用这些硬币共能凑出 [1,m] 范围内的多少种面值。 题目分析 使用一种 O(nm) 的 DP (据说这是类多重背包?)&…

ubuntu 18.04 显卡驱动

1. 禁用ubuntu默认显卡驱动,在/etc/modprobe.d/目录下创建blacklist-nouveau.conf文件并添加以下内容 blacklist vga16fb blacklist nouveau blacklist rivafb blacklist nvidiafb blacklist rivatu 2. 刷新内核,重启 update-initramfs -u reboo…

UE4 查看打包文件内容

UnrealPak.exe pak文件 -list -cryptokeys工程下Crypto.json文件 >输出文件

【iOS】Quartz2D图片剪切

一、使用Quartz2D完成图片剪切1.把图片显示在自定义的view中  先把图片绘制到view上。按照原始大小,把图片绘制到一个点上。  代码: 1 - (void)drawRect:(CGRect)rect 2 { 3 UIImage *image2[UIImage imageNamed:"me"]; 4 [image2…

InstallShield 2020

1.新建工程:HOME-New-Basic MSI 2.Gereral Information设置(根据需求自行设置,例如下图) 3.Files and Folders设置 a.将需打包工程拖拽至下方目标文件夹内 b.创建新的Feature c.设置结果如下 4.Shortcuts设置 a.Desktop右键-New…

iOS项目开发— CoreLocation的定位服务和地理编码与发编码实现

一、CoreLocation简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆、找酒店、找银行、找电影院 2.在上述应用中&#xff0c…

Target “xxx” links to target “Boost::filesystem“ but the target was not found

Boost::system Boost::thread Boost::timer等等替换为${Boost_LIBRARIES}即可

eclipse 断点调试快捷键

(1)CtrlM --切换窗口的大小(2)CtrlQ --跳到最后一次的编辑处(3)F2 --当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时…

cygwin和mingw的区别

1、使用区别: cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器。 cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygw…

轻量级web富文本框——wangEditor使用手册(4)——配置下拉菜单 demo

最新版wangEditor: 配置说明:http://www.wangeditor.com/doc.html demo演示:http://www.wangeditor.com/wangEditor/demo.html 下载地址:https://github.com/wangfupeng1988/wangEditor ----------------------------------------…

Linux下解决发布Qt程序报错:it could not find or load the Qt platform plugin “xcb” in “”

简述 用Qt5.8版本在ubuntu16.04版本下编写Qt应用程序,生成release版本并打包,到另一台无Qt环境的linux系统中运行。 网上通常是按以下几个步骤进行: 1、生成release程序。 2、拷贝release程序到一个新文件夹,执行一个脚本文件。脚…

ViewGroup之getScrollX()

举个例子,一个横向的ViewGroup,如果每个View的宽度为300,那么当前显示第一个View的时候getScrollX()返回值为0,当你 向左移动第一个View,移动距离为30,那么此时getScrollX()的返回值为30,如果当…

Linux环境中Qt程序的手工发布

Qt 5.7.0 编写的程序需要部署到一台没有安装Qt的目标机器上,程序采用C与QML混合编程,QML做界面,C写逻辑。 环境说明 开发环境 Ubuntu 16.04.1 LTS 运行环境 CentOS 7.2.1511 下面描述这个手工操作的发布过程。 1、在开发环境中采用Re…

VS2017编译UE4.19.2报错

error C4577: 在未指定异常处理模式的情况下使用了 "noexcept";不一定会在异常时终止。指定 /EHsc 修改 VCToolChain.cs, 在 AppendCLArguments_Global 函数中增加 Arguments.Add("/EHsc");

OpenGL-坐标系

笛卡尔坐标系 二维绘图:笛卡尔坐标有一个X轴和一个Y轴组成,X轴为水平方向,Y轴为垂直方向,X和Y相互垂直二维笛卡尔坐标系 三维绘图:笛卡尔坐标多了一个Z轴,Z轴同时垂直于X和Y轴。Z轴的实际意义代表着三维物…

Heap Sort

Heap(An array visualized as a complete binary tree): Heap Operations: Insert,                         O(log(n))  Add it to the end of the tree and bubble it up. Find Max(return the element with maximum key),   O(1)Extract Max(fi…

UML类图与类间六种关系表示

1.类与类图 类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性,操作,关系的对象集合的总称. 类图是使用频率最高的UML图之一. 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助开发人员理解系统,它是系统分析和设计阶段的重要产物,也是系统编码和测试…

C# 延迟初始化

一个对象的延迟初始化意味着该对象的创建将会延迟至第一次使用该对象时。(在本主题中,术语“延迟初始化”和“延迟实例化”是同义词。)延迟初始化主要用于提高性能,避免浪费计算,并减少程序内存要求。 以下是最常见的方…