重拾《 两周自制脚本语言 》- 支持中文标识符
发布日期:2021-06-29 15:31:49
浏览次数:4
分类:技术文章
本文共 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和 = 位置.经 + 位置.纬
测试通过~ 源码提交在
转载地址:https://codeinchinese.blog.csdn.net/article/details/88612820 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月03日 18时04分52秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
电气毕业生在国家电网都干啥工作?
2021-07-02
为什么LED灯会越用越暗?
2021-07-02
知乎热议:嵌入式开发中C++好用吗?
2021-07-02
这100道Linux常见面试题,看看你会多少?
2021-07-02
嵌入式开发中常用的几种通信接口总结
2019-04-29
为什么你学C++这么难?
2019-04-29
无人机破巡检难题,秒变电网卫士
2019-04-29
五年,我成为了一名嵌入式工程师。
2019-04-29
2020年电赛题目,命题专家们怎么看?
2019-04-29
PCB元器件摆放不可忽略的10个技巧
2019-04-29
掌握AI核心技术没有秘籍,能自己创造就是王道
2019-04-29
大学老师的月薪多少?实话实说:4万多一点……
2019-04-29
2020年电赛题目,命题专家权威解析!
2019-04-29
写论文,这个神器不能少!
2019-04-29
现在做硬件工程师还有前途吗?
2019-04-29
华为被超越!这家公司成中国最大智能手机制造商,不是小米!
2019-04-29
芯片为什么持续缺货?
2019-04-29
美国无人机在火星首飞成功,创造历史,3米飞行高度悬停30秒
2019-04-29
缺货涨价很久的MCU的国产和国外厂家汇总!(80家)
2019-04-29
华为重磅反击,鸿蒙来了!
2019-04-29