为《 两周自制脚本语言 》添加中文测试代码
两年多前只看了一本的前六章: 实践"两周自制脚本语言"一书【java吧】_百度贴吧
当时是希望一路添加测试用例, 并且最终把语言改为中文语法. 但看到Gluonj之后,似乎必须要Loader.run来执行解释器, 得不到返回值, 只能打印解释结果.
今天从此书官网(スクリプト言語の作り方)找到了它的附带源码库: chibash/stone, 顺便研究了一下Gluonj源码, 找到了它的JUnit辅助功能: https://github.com/chibash/gluonj/blob/master/src/javassist/gluonj/util/UTester.java
据此写了第五到十四章的测试, 运行效果见开头. 下面以第九章的为例:
测试用"石头"语言源码: 位置类
class Position {
x = y = 0
def move (nx, ny) {
x = nx; y = ny;
}
}
p = Position.new
p.move(3, 4)
p.x = 10
sum = p.x + p.y
测试代码: 面向对象解释器Test
package chap9;
import static org.junit.Assert.assertEquals;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import org.junit.Test;
import chap7.NestedEnv;
import chap8.Natives;
import javassist.gluonj.util.UTester;
import stone.ClassParser;
import stone.ParseException;
import stone.util.文件功用;
import stone.util.解释器功用;
public class 面向对象解释器Test extends ClassInterpreter {
private static String 位置类 = "";
static {
try {
位置类 = 文件功用.读文件("测试源码/chap9/位置类.txt", StandardCharsets.UTF_8);
} catch (IOException e) {
}
}
public static Object 求值(String 源代码) throws ParseException {
return 解释器功用.求值(new ClassParser(), new Natives().environment(new NestedEnv()), 源代码);
}
@Test
public void 例程() throws Throwable {
if (UTester.runTestWith("chap9.ClassEvaluator", "chap8.NativeEvaluator", "chap7.ClosureEvaluator"))
return;
assertEquals(14, 求值(位置类));
}
}
改写自BasicInterpreter的解释器功用.求值()
public static Object 求值(BasicParser 基本分析器, Environment 环境, String 源代码) throws ParseException {
Lexer 词法分析器 = new Lexer(new StringReader(源代码));
Object 终值 = null;
while (词法分析器.peek(0) != Token.EOF) {
ASTree 树 = 基本分析器.parse(词法分析器);
if (!(树 instanceof NullStmnt)) {
终值 = ((BasicEvaluator.ASTreeEx) 树).eval(环境);
}
}
return 终值;
}
又有了深入学习此书(顺便将代码中文化, 像之前的中文编程:手工翻译Vue.js源码:尝试重命名标识符与文本), 并据此开发一些中文编程语言原型的动力.
补: 十四章中fib(33)的运行时间确实与Java的对应代码运行时间相差无几, 虽然如作者所言, 并不能以此判断语言的性能.
2019-03-14
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
中文輸進去,程式出得來,開發者發大財 - LingaScript: 中文化TypeScript
原文在原创者 (也是周蟒作者) 博客: 中文輸進去,程式出得來,開發者發大財 前陣子過年,終於得以抽出的一些時間,可以來嘗試一些不同的東西。 花了幾天查看 Typescript 程式碼,改寫了個可用繁/簡中文語法寫JS的轉譯器 LingaScript 使用它做了個「中文輸進去,程式出得來,開發者發大財」的中文程式影片範例,歡迎大家開心試用。无法粘贴,详见原文。 如何做到的 這個專案脫胎自過去開發周蟒(Python + 中文語法)的經驗,並參考了 CTS (Typescript + 中文語法)原始碼。 微軟主導開發的 Typescript 提供了分析 Typescript 語法,並可輸出成 Javascript 的轉譯器(src/compiler)。更棒的是因為 Visual Studio的開發工具中整合了 Typescript,而微軟為了讓 Visual Studio 中的所有編譯結果都有本地化語言輸出,也在 Typescript 中支援了本地化語言的命令行工具和錯誤輸出。 因此, ‵LingaScript‵ 目前所做的,是讓支援的中文語法可分析為對應的 symbol,並預設將命令行工...
-
下一篇
重拾《 两周自制脚本语言 》- 支持中文标识符
续前文将《 两周自制脚本语言 》测试中使用的接口中文化. 在将此脚本语言改为中文关键字之前, 需要先让它支持中文标识符. 首先添加一个词法分析器测试: @Test public void test读中文() throws 分析例外 { 词法分析器类 词法分析器 = 词法分析功用.新建词法分析器("中文变量1名 = 中文ok值"); 词类 词1 = 词法分析器.读(); 词类 词2 = 词法分析器.读(); 词类 词3 = 词法分析器.读(); 词法分析功用.词为标识符("中文变量1名", 词1); 词法分析功用.词为标识符("=", 词2); 词法分析功用.词为标识符("中文ok值", 词3); } 预期的应该不能通过测试, 结果的确不成功, 但是"卡"住了而非报错. 调试后看到问题出在这段: int lineNo = reader.getLineNumber(); Matcher matcher = pattern.matcher(line); matcher.useTransparentBounds(true).useAnchoringBounds(false); int pos ...
相关文章
文章评论
共有0条评论来说两句吧...


微信收款码
支付宝收款码