zoukankan      html  css  js  c++  java
  • 一个编译器的实现3——用编译原理自动化制作文本解析器

    一个编译器的实现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

  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/bitzhuwei/p/AutoGenerateTextParserWithCGCompiler.html
Copyright © 2011-2022 走看看