博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重拾《 两周自制脚本语言 》- 支持中文标识符
阅读量:1888 次
发布时间:2019-04-26

本文共 1661 字,大约阅读时间需要 5 分钟。

前文. 在将此脚本语言改为中文关键字之前, 需要先让它支持中文标识符.

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

@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. 更深原因可自行研究原正则表达式.

为了添加中文标识符支持, 需要使正则表达式能够匹配中文字符, 参考

将原模式中的[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和 = 位置.经 + 位置.纬

测试通过~ 源码提交在

转载地址:http://qqgbf.baihongyu.com/

你可能感兴趣的文章
12月8日 RCEA - RT-Thread能力认证考试考前通知
查看>>
论坛热贴 | RT-Thread音频驱动开发(一)
查看>>
基于 Keil MDK 移植 RT-Thread Nano
查看>>
【报名截至今晚】12月14日深圳嵌入式与音频开发专题会议预告
查看>>
移植 RT-Thread Nano 到 RISC-V
查看>>
软件包应用分享|基于RT-Thread的百度语音识别(二)
查看>>
在 RT-Thread Nano 上添加控制台与 FinSH
查看>>
一站式开发工具:RT-Thread Studio 正式发布
查看>>
留言有礼|谢谢你悄悄点了小星星,让我们跃居GitHub RTOS Star榜第一
查看>>
功能更新!C 函数也能在 MicroPython 中被调用啦
查看>>
东软载波携ES32+RT-Thread走进海尔集团
查看>>
今晚8点直播预告:RT-Thread Studio等相关主题答疑
查看>>
Linux内核在中国大发展的黄金十年-写于中国Linux存储、内存管理和文件系统峰会十周年之际...
查看>>
物联网 20 年简史大揭秘!
查看>>
开源项目|RT-Thread 软件包应用作品:水墨屏桌面台历
查看>>
珠联璧合!基于i.MX RT和RT-Thread的物联网云接入方案
查看>>
基于RTT-MicroPython制作自带BGM的新型肺炎晴雨表
查看>>
开源项目|软件包应用作品:通用物联网系统平台
查看>>
【经验分享】RT-Thread UART设备驱动框架初体验(中断方式接收带\r\n的数据)
查看>>
RT-Thread 编程风格指南
查看>>