文章出處

一個編譯器的實現3——用編譯原理自動化制作文本解析器

PS:本文PDF版在這里

 

關于編譯器的概念、工作流程、算法和設計方案,可參考這里(http://www.cnblogs.com/bitzhuwei/archive/2013/06/05/CompilerDesignAndImp4Context-freeGrammar.html)。閱讀本文須理解“上下文無關文法(Context-free Grammar)”是什么。

本文以加減乘除表達式和一個3D坦克游戲模型為例,說明如何自動生成解析器以及如何使用自動生成的代碼。

文末附源代碼。

加減乘除表達式

運行編譯器代碼生成器(bitzhuwei.CGCompiler.Winform.exe),默認配置文件中已經有加減乘除表達式(Expression)的文法了。

clip_image002[8]

設置好編譯器名字、命名空間和代碼存放的位置,點擊“開始!”。

若文法沒有錯誤,會在指定位置生成Expression解析器的代碼。

clip_image004[8]

clip_image006[8]

一共生成了10個文件(其中bitzhuwei.CompilerBase.dll和使用說明.txt是直接復制的)。

三個Enum*.cs文件分別是文法的字符類型、單詞類型和語法樹結點類型。

LexicalAnalyzer*.cs文件是詞法分析器。

LL1SyntaxParser*.cs文件是語法分析器。

SyntaxTreeNodeValue*.cs文件是語法樹結點類型,稍候會用到。

使用生存的代碼的方法很簡單:創建一個類庫項目,把生成的10個文件全部加進去,引用bitzhuwei.CompilerBase.dll文件。

clip_image007[8]

為了測試,再創建一個Console項目,用下面的代碼測試。

測試Expression的代碼

 

輸入的語法樹如下圖所示。

clip_image009[8]

我們使用解析器,目的是為了得到數據結構后再獲取有價值的結果。Expression的價值在于獲取表達式的值,通過遍歷語法樹獲取這個值是很容易的。(這個代碼只能自己寫,這屬于語義分析階段了,目前還無法自動生成。)

SyntaxTreeExpressionGetValue.cs

 

ArmadaTank模型

坦克艦隊(ArmadaTank)是我很喜歡的一款游戲,現在我正在試圖用C#重寫這個游戲。喜歡的同學可以自行搜索“坦克艦隊”。

ArmadaTank的3D模型是用純文本的*.dtm文件標識的。完全可以用自動生成的解析器來加載之。

步驟就不再說了,和Expression的步驟一樣,這里只貼一下DTM文件的文法。

DTM的文法

 

用OpenGL來顯示3D模型(語義分析及其之后的階段),如下圖所示。

clip_image011[8]

源代碼在此。

http://files.cnblogs.com/bitzhuwei/bitzhuwei.CGCompiler2013-11-20_19-27-00.rar


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()