编程语言试验之Antlr4+JavaScript实现"圈4"
发布日期:2021-06-29 15:30:22
浏览次数:2
分类:技术文章
本文共 1793 字,大约阅读时间需要 5 分钟。
参考:
演示效果虽弱, 还是先上图吧:
在线演示: .
源码库:
下载到本地后在浏览器中打开"圈4.html"就可以在本地试验.
以后设计实现好语言后可以直接用静态网页作在线编程的演示, 觉得还蛮有用.
注: JS代码中各种不良操作(比如全局函数定义). 请勿作为JS学习材料使用. 与前文一样, 此文的目标不是一个实用的编程语言.
语法非常简单(圈4.g4), 只为演示之用. 前文有更多格式的解释:
grammar 圈4;程序 : 求约数;求约数 : '求约数' T数 ;T数 : [0-9]+ ;T空白 : [ \n\t]+ -> skip;
下面命令生成词法语法分析器相关JavaScript文件(圈4.tokens, 圈4Lexer.js, 圈4Lexer.tokens, 圈4Listener.js, 圈4Parser.js):
$ java -cp "antlr-4.7-complete.jar:$CLASSPATH" org.antlr.v4.Tool -Dlanguage=JavaScript 圈4.g4
作为解释器的"定制监听器.js":
var antlr4 = require('antlr4/index');const 圈4Listener = require('./圈4Listener.js').圈4Listener定制监听器 = function () { 圈4Listener.call(this); return this;}定制监听器.prototype = Object.create(圈4Listener.prototype);定制监听器.prototype.constructor = 定制监听器;/*无需接口定义: enter程序/exit程序/enter求约数*/定制监听器.prototype.exit求约数 = function(上下文) { var 原数 = parseInt(上下文.getChild(1).getText()); document.getElementById("输出").innerHTML = 原数 + "的约数: " + 求约数(原数);};function 求约数(原数) { var 约数 = []; for (var i = 1; i < 原数 - 1; i++) { if (原数 % i == 0) { 约数.push(i); } } return 约数;}exports.定制监听器 = 定制监听器;
读取文件输入, 调用附着了定制监听器的分析器"代码分析.js":
const antlr4 = require("antlr4/index")const 圈4Lexer = require("./圈4Lexer.js")const 圈4Parser = require("./圈4Parser.js")const 定制监听器 = require("./定制监听器.js").定制监听器运行();// TODO: 需改进-现为全局, 由于browserifyfunction 运行() { var 代码 = document.getElementById('输入代码').value; var 输入流 = new antlr4.InputStream(代码) var 词法分析器 = new 圈4Lexer.圈4Lexer(输入流) var 词 = new antlr4.CommonTokenStream(词法分析器) var 语法分析器 = new 圈4Parser.圈4Parser(词) 语法分析器.buildParseTrees = true antlr4.tree.ParseTreeWalker.DEFAULT.walk(new 定制监听器(), 语法分析器.程序())}window.运行 = 运行;
HTML界面"圈4.html":
是的, 上面的"圈4.js"需要另行生成. 安装Browserify后运行:
$ browserify 代码分析.js > 圈4.js
转载地址:https://codeinchinese.blog.csdn.net/article/details/85748721 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2024年04月08日 11时49分32秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
常用电子接口大全,遇到不认识的,就翻出来对照辨认!
2019-04-29
芯片IC附近为啥要放0.1uF的电容?
2019-04-29
电赛 | 19年全国一等奖,北航学子回忆录。
2019-04-29
电赛 | 19年全国一等奖,北航学子回忆录(上)
2019-04-29
电赛 | 19年全国一等奖,北航学子回忆录(下)
2019-04-29
突破!台积电1nm芯片,有了新进展。
2019-04-29
一文读懂全系列树莓派!
2019-04-29
自制一个害羞的口罩,见人就闭嘴,戴着可以喝奶茶
2019-04-29
聊聊我是如何编程入门的
2019-04-29
J-Link该如何升级固件?
2019-04-29
485通信自动收发电路,历史上最详细的解释
2019-04-29
【视觉盛宴三】不好意思,这些线材接口的横截面真的没见过
2019-04-29
一位头发发白的神人教你怎么写程序,运维,买电脑,写文章,平面设计!
2019-04-29
【第二期】那些设计漂亮、有创意的电路板!
2019-04-29
【第三期】那些设计漂亮、有创意的电路板!
2019-04-29
继续推荐公众号~
2019-04-29
「第二篇」全国一等奖,经验帖。
2019-04-29
「第三篇」全国电子设计竞赛,这些你必须知道的比赛细节,文末附上近十年电赛题目下载...
2019-04-29
5G小科普(漫画版,So easy!)
2019-04-29
无人再提华强北
2019-04-29