木蘭編程語言重現——功能初具雛形,添加中文報錯信息

自原型搭建已過去兩個多月,現在實現了木蘭編程語言一些基本的功能。正值剛搬家到 OSChina,作一階段小結。

功能

以下示例都選自測試用例

調用現有 Python 庫如草蟒

using * in 海龜
顏色("黃色", "紅色")
開始填充()
for 拐數 in 0..4 {
  前進(200)
  右轉(144)
}
結束填充()
主循環()

在這裏插入圖片描述
類型:

type Animal {
    func getName() {
        return 1
    }
}
type Person : Animal {
{}
}
print(Person.getName())

函數:

func increment(step) {
    func add(n) {
        return n + step
    }
    return add
}
print(increment(10)(1))

流程控制:

print(false ? 2 : 1)

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

中文報錯信息

上述基本功能之外,對部分報錯信息進行了加工,使之更易懂好讀。

比如下面的死遞歸:

func f() {
  f()
}
f()

運行報錯信息如下:

(..•˘_˘•..) 遞歸過深。請確認: 1、的確需要遞歸 2、遞歸的收斂正確
見第2行:f()
調用層級如下
第2行:f()
【中略 995 行】
第2行:f()
第4行:f()

又如此段代碼:

func add(number) {
    return number1+1
}
func output(number) {
    print(number)
}
output(add(2))

運行報錯如下:

(..•˘_˘•..) 請先定義'number1'再使用
見第2行:return number1+1
調用層級如下
第7行:output(add(2))

語法分析的錯誤信息亦然。比如現在尚不支持空行,於是下面的代碼:


print(2)

會報錯如下:

錯誤.語法錯誤: 文件 "測試/錯誤處理/空行.ul", 第1行, 第1列, 沒認出這個詞 "換行"

^

代碼統計

由於實現機制是將源碼轉換爲 Python 的抽象語法樹(AST)後調用 exec 執行,因此主要代碼量在詞法分析器和語法分析器(包括 AST 轉換)。下面是幾個主要部分的代碼量統計(使用 scc,包括空行和註釋,木蘭的.ul代碼統計使用--count-as ul:javascript參數)

  • 測試
    • 木蘭測試用例:465
    • 測試.py,運行測試的腳本:123
    • test語法樹.py,確保生成的語法樹與原始版本一致:52
  • 實現:1287
    • (語法)分析器.py,包括 AST 轉換:569
    • 語法樹.py功用/語法樹處理.py,包括對 ast 庫的中文封裝:214
    • 詞法分析器.py,主要是詞法規則:110
    • 中.py,主程序:56
    • 功用/反饋信息.py,報錯信息中文化:43
    • 環境.py,全局變量:30

下一步

除了繼續補全木蘭語言本身功能之外,將嘗試開發一個簡單的代碼編輯器,使新用戶可以挑選各測試用例進行修改後直接運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章