重现木兰编程语言(十)——比较、循环,一个语法设计特色

此刻支持的语法示例:

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

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


重现木兰编程语言(十)——比较、循环,一个语法设计特色

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

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

表达式声明 : 表达式   <---- 此处木兰原本为“表达式前缀”(prefix_expr)

赋值 : 表达式前缀 = 表达式

表达式 : 二元表达式
      | 表达式前缀
      | 数

表达式前缀 : 变量
         | 调用 

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

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

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

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

a = 2
a + 1
print(a)

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

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

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

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

展开阅读全文

页面更新:2024-06-01

标签:木兰   语法   词法   分析器   前缀   赋值   优先级   辅助工具   布尔   表达式   源码   顺序   声明   规则   特色   代码   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top