重拾《 两周自制脚本语言 》- 支持中文标识符
续前文将《 两周自制脚本语言 》测试中使用的接口中文化. 在将此脚本语言改为中文关键字之前, 需要先让它支持中文标识符.
首先添加一个词法分析器测试:
@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;
int endPos = line.length();
while (pos < endPos) {
matcher.region(pos, endPos);
if (matcher.lookingAt()) {
addToken(lineNo, matcher);
pos = matcher.end();
}
else
throw new 分析例外("bad token at line " + lineNo);
}
改为中文命名以更易于理解:
int 行数 = reader.getLineNumber();
Matcher 匹配器 = 模式.matcher(行);
匹配器.useTransparentBounds(true).useAnchoringBounds(false);
int 头 = 0;
int 尾 = 行.length();
while (头 < 尾) {
匹配器.region(头, 尾);
if (匹配器.lookingAt()) {
添加词(行数, 匹配器);
头 = 匹配器.end();
}
else
throw new 分析例外("bad token at line " + 行数);
}
看到进入死循环的直接原因是匹配器.lookingAt()虽然为true, 但头始终为0. 更深原因可自行研究原正则表达式.
为了添加中文标识符支持, 需要使正则表达式能够匹配中文字符, 参考Detecting if NSString contains chinese characters
将原模式中的[A-Z_a-z][A-Z_a-z0-9]*改为[\\p{script=Han}A-Z_a-z][\\p{script=Han}A-Z_a-z0-9]*. 之后开头的词法分析器测试通过.
为检验更复杂一些的源码, 对第九章的原本测试用源码使用中文命名:
class 位置类 {
经 = 纬 = 0
def 到达 (经度, 纬度) {
经 = 经度; 纬 = 纬度;
}
}
位置 = 位置类.new
位置.到达(3, 4)
位置.经 = 10
和 = 位置.经 + 位置.纬
测试通过~ 源码提交在此
2019-03-16
关注公众号
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
为《 两周自制脚本语言 》添加中文测试代码
源自自制编译器+自制脚本语言+自制编程语言 三书比较? 两年多前只看了一本的前六章: 实践"两周自制脚本语言"一书【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 测试代码: 面向...
-
下一篇
重拾《 两周自制脚本语言 》- 中文关键字与原生函数
续前文重拾《 两周自制脚本语言 》- 支持中文标识符, 将当前的关键字改为中文. 基本是将语法分析器中的原本英文关键字改为中文. 如改while->每当 · program-in-chinese/stone@32c79b4: Parser statement = statement0.or( rule(IfStmnt.class).sep(IfStmnt.关键字_如果).ast(expr).ast(block) .option(rule().sep(IfStmnt.关键字_不然).ast(block)), rule(While声明类.class).sep(While声明类.关键字).ast(expr).ast(block), simple); 下面是关键字对应表: while,每当 if,如果 else,否则 class,类别 extends,扩展 def,定义 fun,函数 new,新建 this,本体 原生函数就是Java本身核心库函数. 比如System.out.println, 原本被封装为了print方法, System.currentTimeMillis被封装为了cu...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- MySQL数据库中FOR UPDATE的使用
- MySQL数据库在高并发下的优化方案
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 2048小游戏-低调大师作品
- CentOS7,8上快速安装Gitea,搭建Git服务器

微信收款码
支付宝收款码