知乎原文

此文涉及的源码版本: program-in-chinese/quan2

声明 代码来源 How to Create Language Using Antlr4

本作主要作为学习Antlr, 以及实践中文命名之用. 目标不是一个实用的编程语言.

个人感觉这样可以比较容易的用原型来尝试和演示不同语法设计, 如果有更简单的途径请不吝赐教. 欢迎各种自行修改~碰到任何问题也欢迎一同探讨.

下面是"圈2"语言的示例代码:

开始使 甲 为 5使 乙 为 10加 3 到 乙加 乙 到 甲加 甲 到 乙打印 乙打印 3
结束

附上需要自行编写的三个文件:
Antlr4的语法定义文件:

按照README说明, Antlr可以据此自动生成四个分析器相关类文件. T前缀是由于Antlr约定大写开头是Token定义. 标识符支持中文.

grammar 圈2;
程序   : '开始' 声明+ '结束';声明 : 赋值 | 加 | 打印 ;赋值    : '使' T标识符 '为' (T数 | T标识符) ;
打印     : '打印' (T数 | T标识符) ;
加       : '加' (T数 | T标识符) '到' T标识符 ;T标识符     : ('a' .. 'z' | 'A' .. 'Z' | '\u4E00'..'\u9FA5' | '\uF900'..'\uFA2D')+ ;
T数 : [0-9]+ ;
T空白     : [ \n\t]+ -> skip;

定制监听器:

通过对每种语句分析后进行对应处理, 实质上起了解释器的作用.

public class 定制监听器 extends 圈2BaseListener {private Map<String, Integer> 变量表;public 定制监听器() {变量表 = new HashMap<>();}@Overridepublic void exit赋值(赋值Context 上下文) {// 赋值语句分析结束时运行此方法String 变量名 = 上下文.T标识符(0).getText();// 如果语句中有两个变量(标识符), 那么取第二个变量的值, 否则取数的值int 值 = 上下文.T标识符().size() > 1? 变量表.get(上下文.T标识符(1).getText()): Integer.parseInt(上下文.T数().getText());// 更新变量值变量表.put(变量名, 值);}@Overridepublic void exit加(加Context 上下文) {// 加语句分析结束时运行此方法String 变量名 = 上下文.T标识符().size() > 1 ? 上下文.T标识符(1).getText() : 上下文.T标识符(0).getText();int 添加值 = 上下文.T标识符().size() > 1 ? 变量表.get(上下文.T标识符(0).getText()): Integer.parseInt(上下文.T数().getText());变量表.put(变量名, 变量表.get(变量名) + 添加值);}@Overridepublic void exit打印(打印Context 上下文) {// 打印语句分析结束时运行此方法String 输出 = 上下文.T标识符() == null ? 上下文.T数().getText() : 变量表.get(上下文.T标识符().getText()).toString();System.out.println(输出);}
}

运行器:

读取文件输入, 调用附着了定制监听器的分析器

public class 运行器 {public static void main(String[] 参数) {try {ANTLRInputStream 输入 = new ANTLRInputStream(new FileInputStream(参数[0]));圈2Lexer 词法分析器 = new 圈2Lexer(输入);圈2Parser 语法分析器 = new 圈2Parser(new CommonTokenStream(词法分析器));语法分析器.addParseListener(new 定制监听器());// 开始分析语法分析器.程序();} catch (IOException e) {e.printStackTrace();}}
}

尚未探索如何用Antlr4实现无空格语法设计(不允许标识符中出现关键字应该可以做到, 但那样限制太多)

编程语言试验之Antlr4+Java实现圈2相关推荐

  1. 2017-11-26 编程语言试验之Antlr4+Java实现圈2

    "中文编程"知乎专栏原文 此文涉及的源码版本: program-in-chinese/quan2 声明 代码来源 How to Create Language Using Antl ...

  2. 编程语言试验之Antlr4+JavaScript实现圈4

    参考: ANTLR4: Making a compiler with the JavaScript runtime 演示效果虽弱, 还是先上图吧: 在线演示: 地址. 源码库: program-in- ...

  3. 求职中最吃香的编程语言:JavaScript、Java 和 Python

    本文分享自百度开发者中心求职中最吃香的编程语言:JavaScript.Java 和 Python 程序员培训公司 CodinGame 发布的一份开发人员调查报告显示,在开发人员招聘中,拥有 JavaS ...

  4. Atitit。Cas机制 软件开发 编程语言 无锁机制 java c# php

    Atitit.Cas机制 软件开发 编程语言 无锁机制 java c# php 1. 为什么需要无锁操作1 2. 硬件支持 cas  atomic2 3. 无锁编程(Lock-Free)就是在某些应用 ...

  5. bs后端开发语言_哪种编程语言适合后端开发?Java和PHP的区别在哪?

    从技术上看在web开发上,Java和PHP哪个更好呢? 一位从多年PHP开发转Java的技术人员说,应是各有千秋,各有各的好处,这是非常实际的答案. java已经是一门很成熟的语言,曾经看到一篇文章, ...

  6. 机器人研发十大热门编程语言:不死 Java、不朽 C/C ++、新贵 Python

    流水的编程语言,铁打的 Java.C/C++. 进行人工智能机器人研发,应该选择哪种编程语言? 这是很多机器人专家在自身的职业生涯中都会存在的一个入门级思考.毕竟,在学习一门编程语言时,需要花费大量的 ...

  7. java能测圈复杂度_[Java教程]圈复杂度

    [Java教程]圈复杂度 0 2015-12-02 13:00:42 Cyclomatic Complexity 1. 概念 a. 圈复杂度是一种衡量代码复杂程度的标准. b. 圈复杂度高的害处: 圈 ...

  8. 哪种编程语言适合后端开发?Java和PHP的区别在哪?

    从技术上看在web开发上,Java和PHP哪个更好呢? 一位从多年PHP开发转Java的技术人员说,应是各有千秋,各有各的好处,这是非常实际的答案. java已经是一门很成熟的语言,曾经看到一篇文章, ...

  9. TIOBE 3 月编程语言排行榜:主流 Java、C++ 惨遭嫌弃,Python 势头迅猛

    取代不了的 Java.挡不住势头的 Python.吐槽不尽的 C++......数百种编程语言中也仅有那么几种当属主流语言,而如今这些主流的编程语言局势如何?身处其中的开发者又需要了解哪些内容? 本文 ...

最新文章

  1. BCH独立日最好的礼物——Token发行已实现
  2. Java并发编程 - Executor,Executors,ExecutorService, CompletionServie,Future,Callable
  3. 无线打印机 连接路由器连接到服务器,怎么通过无线路由器连到有的打印机线网络...
  4. mysql elt interval_mysql 区间分组 interval,elt 的运用
  5. Kafka消息系统基础知识索引消息
  6. 在php中新建一个系统,免费开源的PHP语言CMS系统充让您在一天内建立一个网站
  7. 《推荐系统实践》算法纯享(附代码链接)(四)—— UGC推荐篇
  8. 联想计计算机电源管理,联想电源管理软件energy manag
  9. 史上最全的爱情公寓Ⅰ、Ⅱ经典台词(搞笑+感动)
  10. Linux下获取外网IP地址的方法
  11. 贝恩分类法(行业集中度)
  12. 3D动作手游的辅助瞄准算法(三)
  13. 表格对决CSS--一场生死之战 (转自“清清月儿”)
  14. 如何实现一个地图库封装,可以快速切换地图
  15. MATLAB-矩阵的输入
  16. 连接网络-第三章测试
  17. php时间戳 中文,PHP时间戳-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
  18. 免费的几个CDN加速
  19. Oracle导出报错: unknown command beginning “exp SCOTT/...“ - rest of line ignored.
  20. Flutter-使用http请求数据并展示

热门文章

  1. 炫酷科技感登录页面css3+html5模板带动画
  2. 禅道 11.6版本 后台漏洞 复现和审计
  3. P7599 [APIO2021] 雨林跳跃
  4. SCAU 汇编语言 期末复习 (上)
  5. msp430g2553时钟
  6. 【图解SHA1杂凑算法】SHA1杂凑算法的Python实现保姆级教程 | 物联网安全 | 信息安全
  7. 美语音标 [ə]的几点注意
  8. too many levels of symbolic link 解决方案
  9. Prolog教程 5
  10. does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? Up