编程语言试验之Antlr4+Java实现"圈2"
此文涉及的源码版本: 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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
大数据学习难度大吗?哪些人适合学习呢?
互联网的快速发展,科技的不断进步,使得数据呈爆炸式增长,而大数据的价值也开始被各个领域所重视,各大企业都开始纷纷高薪聘请大数据专业人才,所以,很多从事IT开发的人开始转行以谋求更好的发展,而对于那些没有编程基础的小白,学习大数据开发难度大吗? 对于进入进入新的行业,尤其是IT行业,每个人都会有担忧,这很正常,不论你有没有过经验都不免有些担忧。一方面,是因为你在此之前总听流言说编程如何如何难,工作是多么多么累,但它们就像老奶奶讲的吓人故事,是用来唬孩子们去学习社会科学而已。而另一方面,人们对于未知的事情总是充满着“恐惧”。其实无论是学习IT还是学习大数据开发,大家都是从0开始的,即使你没有基础也无需担心,毕竟大家最开始都是从小白度过的。 Java、python等等IT领域的开发人员如今都纷纷转型大数据,究其原因无非是大数据开发领域薪资高,且因为他们有编程基础,所以转型比较快。那么对于那些编程小白该如何去学习大数据开发呢?如何摆脱0基础的困境呢? 第一、小白学习大数据开发,心态很重要 对于陌生的知识领域,大家最开始接触的时候都不免有些困惑,会对自己产生怀疑,就像我们打游戏一样。刚开始总是操...
- 下一篇
在线编程网站对中文代码的支持
参考哪些比较好的在线编程网站?, 测试各个网站对中文命名的代码的支持, 包括调试信息等(见向LeetCode报告编译信息中Unicode显示问题). 有趣的是, 在范围有限的评测中, 国产的在线编程网站似乎对中文命名的代码普遍支持更好. 不知开发者是否对这个功能有特别的关注, 亦或实现机制更胜一筹, 或是两者皆有. 无论如何, 都值得一个赞! 图片版: 带链接的网页版在此 附上测试用Java代码: public class 大家好 { public static void main(String[] 参数) { 打印("大家好"); } private static void 打印(String 输出) { System.out.println(输出); } } 测试用JavaScript: 人1=new Object(); 人.名="大人"; 人.姓="小"; 人.年龄=58; 人.眼色="蓝色"; document.write(人.名 + "已经" + 人.年龄 + "岁."); 注: 未实测的: dabblet.com 正式只支持HTML/CSS codecademy.com, ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果