重拾《 两周自制脚本语言 》- 支持中文标识符

简介: 为《 两周自制脚本语言 》添加中文标识符支持.

续前文将《 两周自制脚本语言 》测试中使用的接口中文化. 在将此脚本语言改为中文关键字之前, 需要先让它支持中文标识符.

首先添加一个词法分析器测试:

  @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

相关文章
|
3天前
|
存储 前端开发 JavaScript
十二款·富文本编辑器:数字创作的瑞士军刀
在数字化时代,内容创作已经成为我们日常生活中不可或缺的一部分。无论是撰写一封电子邮件、准备一份报告、还是在社交媒体上分享心情,文字都是我们表达和沟通的基石。而在这个过程中,富文本编辑器就如同一把瑞士军刀,为我们提供了多种功能以增强和美化我们的文字内容。
73 1
|
10月前
|
小程序 BI
有奖答题小程序开发程式编写规则解析
有奖答题小程序开发程式编写规则解析
|
存储 Java 编译器
C 语言避坑指南
C 语言避坑指南
C 语言避坑指南
计算机高职专业VB知识要点001,模拟域名抢购软件案例代码开源,热身第一课
计算机高职专业VB知识要点001,模拟域名抢购软件案例代码开源,热身第一课
118 0
计算机高职专业VB知识要点001,模拟域名抢购软件案例代码开源,热身第一课
|
Rust JavaScript 前端开发
谁是虽好的语言 ?- 语言选型闲聊(上)
谁是最好的语言?当然是php了 :) 先说一声抱歉,最近工作上有个里程碑要交付,比较忙, 本周的celery源码系列又又要延期了。为了避免大家误以为停更,今天简单聊点别的内容吧。近期我们公司做架构升级,调研了一下各种语言, 包括TypeScript,c#,rust, 还有java和go。这个过程中有一些个人看法,可能会有些偏颇或者不正确的地方,我就简单一说,大家一乐,无意引战。
150 0
谁是虽好的语言 ?- 语言选型闲聊(上)
|
Rust JavaScript Cloud Native
谁是虽好的语言 ?- 语言选型闲聊(下)
近期我们公司做架构升级,调研了一下各种语言, 包括TypeScript,c#,rust, 还有java和go。这个过程中有一些个人看法,可能会有些偏颇或者不正确的地方,我就简单一说,大家一乐,无意引战。
219 0
谁是虽好的语言 ?- 语言选型闲聊(下)
|
机器学习/深度学习 JavaScript 前端开发
2022年编程语言排名,官方数据来了,让人大开眼界。(中)
2022年编程语言排名,官方数据来了,让人大开眼界。(中)
840 0
|
数据库
2022年编程语言排名,官方数据来了,让人大开眼界。(下)
2022年编程语言排名,官方数据来了,让人大开眼界。(下)
201 0
2022年编程语言排名,官方数据来了,让人大开眼界。(下)
|
人工智能 分布式计算 安全
2022年编程语言排名,官方数据来了,让人大开眼界。(上)
2022年编程语言排名,官方数据来了,让人大开眼界。(上)
928 0
2022年编程语言排名,官方数据来了,让人大开眼界。(上)
|
IDE API 开发工具
敢问中科院计算所副研究员刘俊明:为何看不到中文编程的需求和优势?
在此,希望学界能正视业界对中文编程的巨大需求,共同实践研究相关技术,而不是人云亦云地用似是而非的理由贬低唱衰。 因为,你们背负着下一代业界人才的教育重任,而中文编程,不能、也绝不会再被耽误二十年。
716 0
敢问中科院计算所副研究员刘俊明:为何看不到中文编程的需求和优势?