编程语言试验之Antlr4+Java实现"圈2"

简介: 参考网文, 使用Antlr生成Java分析器, 实现一个简单的编程语言. Implement a pretotype programming language with Antlr4 and Java, based on an online article.

此文涉及的源码版本: 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

相关文章
|
1月前
|
Java 程序员 Linux
IT圈的“鄙视链”大揭秘:从Java到Go,编程语言之战!
IT圈的“鄙视链”大揭秘:从Java到Go,编程语言之战!
|
15天前
|
设计模式 前端开发 安全
Java是一种广泛使用的编程语言,其学习路径可以大致分为以下几个阶段
【4月更文挑战第9天】Java是一种广泛使用的编程语言,其学习路径可以大致分为以下几个阶段
15 1
|
1月前
|
人工智能 Java 开发者
Python与Java:两大编程语言的联系与区别
Python与Java:两大编程语言的联系与区别
36 2
|
2月前
|
前端开发 JavaScript Java
未来编程语言的演变趋势:从Java到WebAssembly
本文探讨了编程语言从Java时代经历的演变,直至WebAssembly的兴起。通过分析Java的普及原因、后端技术的发展、前端技术的革新以及WebAssembly的出现对未来编程模式的影响,我们旨在提供一个全面的视角来理解编程语言的发展趋势。不同于传统的技术文章,本文将从宏观的角度审视技术进步如何推动编程语言演变,以及这些演变对开发者社区和软件行业可能产生的长远影响。
23 1
|
2月前
|
边缘计算 人工智能 移动开发
未来编程语言的演进趋势:从Java到WebAssembly
本文探讨了编程语言的演进历程,特别是从Java的广泛应用到WebAssembly的兴起,揭示了技术发展的内在逻辑和趋势。我们不仅回顾了Java作为一种革命性语言的贡献,还分析了现代Web开发中WebAssembly的重要性,并预测了未来编程语言可能的发展方向。通过深入探讨这些技术的特点、优势及其对软件开发领域的影响,文章旨在为开发者提供对未来技术趋势的洞察,帮助他们做出更明智的技术选择和职业规划。
php案例:判断这个文件是什么编程语言代码的文件(判断java或者php)
php案例:判断这个文件是什么编程语言代码的文件(判断java或者php)
php案例:判断这个文件是什么编程语言代码的文件(判断java或者php)
|
3月前
|
Java 大数据 Android开发
探索Java编程语言的优势和应用领域
Java是一种广泛应用于软件开发领域的高级编程语言。它凭借其强大的功能和丰富的生态系统,在众多应用领域中得到了广泛应用。本文将为您介绍Java的优势以及它在各个领域中的应用。
166 2
|
3月前
|
Java 数据库连接 开发工具
探索Java编程语言的强大功能
Java是一种广泛应用于软件开发领域的高级编程语言。它的强大功能使得它成为了许多开发者的首选。本文将介绍一些Java的关键特性和优势。
|
3月前
|
分布式计算 Java Scala
Spark编程语言选择:Scala、Java和Python
Spark编程语言选择:Scala、Java和Python
Spark编程语言选择:Scala、Java和Python
|
4月前
|
人工智能 搜索推荐 Java
C# 最有可能摘得“年度编程语言”,Python、Java 正在让位,TIOBE 12 月编程语言榜单最新预测来了!
C# 最有可能摘得“年度编程语言”,Python、Java 正在让位,TIOBE 12 月编程语言榜单最新预测来了!
31 1