600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 设计sample语言的词法分析器_重现木兰编程语言(十)——比较 循环 一个语法设计特色

设计sample语言的词法分析器_重现木兰编程语言(十)——比较 循环 一个语法设计特色

时间:2023-09-14 13:53:19

相关推荐

设计sample语言的词法分析器_重现木兰编程语言(十)——比较 循环 一个语法设计特色

此刻支持的语法示例:

sum = 0number = 1while number < 4 { sum = sum + number number = number + 1}print(sum)

添加了比较(包括且、或)、while循环相关语法,详见语法描述。一个有意思的细节是支持这样的布尔操作:xx or yy and zz,其中and优先级高。

RPly 源码中,看到词法分析的机制很单纯。就是按顺序匹配词法规则中的正则表达式, 匹配的就识别为一个词。难怪之前词法规则的添加顺序不同直接影响分析结果。词法规则设计感觉挺容易出错,回头研究下有没有啥辅助工具。

参照逆向工程,做了一下代码整理,以尽量接近源码结构,以便今后更加方便对比。包括将词法分析器提取到单独文件,将语法分析规则的顺序调整为与逆向相同。在此过程中,居然发现了两处语法分析规则的错误,其中一处比较严重:

表达式声明 : 表达式

在改正之前,像“2”(数)、“2+1”(二元表达式)这样的表达式是单一“表达式声明”的合法代码。而改为“表达式前缀”后,这些都不合法,也导致了不少相关测试需要修改(还好早发现)。

BTW 木兰交互控制台(REPL)中支持运行2+1是因为套了层 print:

node = self.parser.parse('___=(%s);__print__(___)' % self.stmt, '')

这样设计暂时没看出啥硬伤,也许还有些好处。比如下面这样的 Python 代码是可运行的,输出为 2。但也许程序员原本希望看到的是 3,只是误写代码:

a = 2a + 1print(a)

而在木兰中,同样的代码运行会报错(报错信息是大短板):

SyntaxError: File "xxx.ul", line 2:3, unexpected token "+"a + 1 ^

从这个角度来说,这样的设计似乎可以更早发现不必要的代码误写。

语法分析器 220 行(不包括 ast 库的 API中文封装部分),还早着。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。