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

  • 相关阅读:
    pythonchallenge 2
    js动态改变img元素src在IE无效的问题
    自己设计的java web消息提示机制
    eclipse+PyDev里面import win32api报错的问题解决
    windows动态磁盘导致的分区问题
    sqlserver 遇到以零作除数错误的处理 不报错的解决方法
    iis7 运行 php5.5 的方法
    应用程序试图执行安全策略不允许的操作。要授予此应用程序所需的权限,请与系统管理员联系,或在配置文件中更改该应用程序
    C# 模拟用户登录
    ListBoxControl 删除选择的项的方法
  • 原文地址:https://www.cnblogs.com/bitzhuwei/p/AutoGenerateTextParserWithCGCompiler.html
Copyright © 2020-2023  润新知