"中文编程"知乎专栏原文

此文涉及的源码版本: 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<>();
} @Override
public void exit赋值(赋值Context 上下文) {
// 赋值语句分析结束时运行此方法 String 变量名 = 上下文.T标识符(0).getText(); // 如果语句中有两个变量(标识符), 那么取第二个变量的值, 否则取数的值
int 值 = 上下文.T标识符().size() > 1
? 变量表.get(上下文.T标识符(1).getText())
: Integer.parseInt(上下文.T数().getText()); // 更新变量值
变量表.put(变量名, 值);
} @Override
public 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(变量名) + 添加值);
} @Override
public 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实现无空格语法设计(不允许标识符中出现关键字应该可以做到, 但那样限制太多)

2017-11-26 编程语言试验之Antlr4+Java实现"圈2"的更多相关文章

  1. 2017-12-02 编程语言试验之Antlr4+JavaScript实现"圈4"

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

  2. [LOJ 6248]「CodePlus 2017 11 月赛」晨跑

    Description “无体育,不清华”.“每天锻炼一小时,健康工作五十年,幸福生活一辈子” 在清华,体育运动绝对是同学们生活中不可或缺的一部分.为了响应学校的号召,模范好学生王队长决定坚持晨跑.不 ...

  3. TIOBE 2017 8月编程语言排行榜 后院“硝烟四起”

    处于排名榜最前面的几个编程语言的分数长期以来一直都在下降:Java和C在TIOBE榜单中的分数一直比较低.而且几乎所有其他排名前十的语言每年都在下降. 那么哪个什么语言抓住了这个机遇呢?这发生在排行榜 ...

  4. jingchi.ai 2017.11.25-26 Onsite面试

    时间:2017.11.25 - 11.26 地点:安徽安庆 来回路费报销,住宿报销. day1: 大哥哥问了我一个实际中他们遇到的问题.有n个点,将点进行分块输出,输出各个块的均值点.具体就是100* ...

  5. 2017/11/3 Leetcode 日记

    2017/11/3 Leetcode 日记 654. Maximum Binary Tree Given an integer array with no duplicates. A maximum ...

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

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

  7. 2020年的六种编程语言排名中,java排第几只有不到1%的人知道

    前言 编程语言是开发的基础.有不同的类型和特征,并且开发人员针对不同的场景选择正确的语言,但是您知道使用哪种语言吗?中国和世界各地有多少开发人员正在使用它?他们的排名是多少?快来看看您知道多少个列表! ...

  8. 团队作业4——第一次项目冲刺(Alpha版本)2017.4.26

    2017.04.26 天气热. 时间:上午 9:35 ---10:10分 地点:陆大304实验室 会议内容:今天将昨天的的一些问题进行了讨论,以及针对助教提出的问题进行了分析,是因为我们昨天经过讨论后 ...

  9. [LOJ 6249]「CodePlus 2017 11 月赛」汀博尔

    Description 有 n 棵树,初始时每棵树的高度为 H_i,第 i 棵树每月都会长高 A_i.现在有个木料长度总量为 S 的订单,客户要求每块木料的长度不能小于 L,而且木料必须是整棵树(即不 ...

随机推荐

  1. uboot处理dtb

    目录 uboot处理dtb 传递参数给内核 dtb 地址选择 dtb修改 移植fdt title: uboot处理dtb date: 2019/4/28 17:18:19 toc: true --- ...

  2. python 使用 sorted 对 列表嵌套元组的数据进行排序

    在开发的过程可能会遇到这么一个需求,存在一个列表嵌套元组的数据: data = [(1, 'a'),(2, 'b'),(5, 'c'),(3, 'd'),(4, 'e')] 需要将这个列表按照元组的第 ...

  3. Laravel在进行表单验证时,错误信息未返回

    马上要毕业了,找了现在的这家公司,压力不大,自己也比较喜欢,唯一的遗憾就是手机号莫得换了(找不到换的借口). 进入正题: 之前自己的博客(http://lxiaoke.cn)是用ThinkPHP开发的 ...

  4. Dot & cross product

    https://www.khanacademy.org/math/linear-algebra/vectors-and-spaces/dot-cross-products/v/vector-dot-p ...

  5. SQL注入之重新认识

    i春秋作家:anyedt 原文来自:https://bbs.ichunqiu.com/thread-41701-1-1.html 引言 作为长期占据 OWASP Top 10 首位的注入,认识它掌握它 ...

  6. Android 框架式编程 —— 起篇

    一般的,在开发的时候,写过的代码在需求变更后,发现需要改动非常多的地方,那么说明之前的代码的架构肯定是存在问题的. 下面我们结合面向对象的六大基本原则谈Android 框架式编程.首先先介绍一下面向对 ...

  7. Zabbix-3-自定义脚本获取数据

    通过在agent中加入脚本,来获取数据,生成图形

  8. WCF绑定netTcpBinding寄宿到控制台应用程序

    契约 新建一个WCF服务类库项目,在其中添加两个WCF服务:GameService,PlayerService 代码如下: [ServiceContract] public interface IGa ...

  9. Golang Struct 声明和使用

    Golang Struct 声明和使用 Go可以声明自定义的数据类型,组合一个或多个类型,可以包含内置类型和用户自定义的类型,可以像内置类型一样使用struct类型 Struct 声明 具体的语法 t ...

  10. spring boot集成 servlet自动注册的两种方式

    有两种方式:(两种方式同时存在时,@Bean优先@ServletComponentScan实例化,生成两个对象) 1)通过@ServletComponentScan类注解 扫描 带有@WebServl ...