﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-岁月流转，往昔空明</title><link>http://www.cppblog.com/lingjingqiu/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 05 Jul 2009 21:49:15 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 21:49:15 GMT</pubDate><ttl>60</ttl><item><title>VS8 C++ 头文件护卫宏的生成插件</title><link>http://www.cppblog.com/lingjingqiu/archive/2009/03/09/75944.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Sun, 08 Mar 2009 16:06:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2009/03/09/75944.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/75944.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2009/03/09/75944.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/75944.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/75944.html</trackback:ping><description><![CDATA[<br>没啥好说的，没什么技术含量，就是有点用，功能类似于VA X的#ifndef guard.<br>生成的格式按照 PROJECTNAME_FILENAME_FILEEXTNAME_GUID 来的。<br>比方说我的就是<br><br>SPIRIT_SASL_AST_NODE_STATEMENT_H_B530FB44_F5C8_431F_A250_E426F791B7CF<br><br>如果有需要可以自己改一下代码就好了。<br><br>语言是VB.NET.<br><br><a href="http://www.cppblog.com/Files/lingjingqiu/CppHeaderGuardGenerator.rar">工程+源代码文件下载地址</a><br> <img src ="http://www.cppblog.com/lingjingqiu/aggbug/75944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2009-03-09 00:06 <a href="http://www.cppblog.com/lingjingqiu/archive/2009/03/09/75944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>静态强类型语言的类型声明与变量声明</title><link>http://www.cppblog.com/lingjingqiu/archive/2009/02/25/74854.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Tue, 24 Feb 2009 17:33:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2009/02/25/74854.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/74854.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2009/02/25/74854.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/74854.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/74854.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 详细讨论了在设计静态强类型语言语法时如何处理类型别名(typedef)和变量定义的类型声明的问题。&nbsp;&nbsp;<a href='http://www.cppblog.com/lingjingqiu/archive/2009/02/25/74854.html'>阅读全文</a><img src ="http://www.cppblog.com/lingjingqiu/aggbug/74854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2009-02-25 01:33 <a href="http://www.cppblog.com/lingjingqiu/archive/2009/02/25/74854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++下Windows Forms + MFC + WTL + wxWidgets + Qt + GTK+  非官方综合比较</title><link>http://www.cppblog.com/lingjingqiu/archive/2009/01/06/71363.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Tue, 06 Jan 2009 10:09:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2009/01/06/71363.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/71363.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2009/01/06/71363.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/71363.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/71363.html</trackback:ping><description><![CDATA[最近用了一段时间的wxWidgets。<br>基本上主流的界面库也就算用的差不多了。<br>这里拿一个表格对这些界面库做一个比较直观的比较。<br><br>
<table style="width: 1029px; height: 1706px;" border="1">
    <tbody>
        <tr>
            <td style="font-size: 10pt;">界面库名称<br></td>
            <td style="vertical-align: top;">接口设计<br></td>
            <td style="vertical-align: top;">界面编辑器<br></td>
            <td style="vertical-align: top;">高级布局功能<br></td>
            <td style="vertical-align: top;">平面绘制<br></td>
            <td style="vertical-align: top;">平台兼容性<br></td>
            <td style="vertical-align: top;">语言支持<br></td>
            <td style="vertical-align: top;">IDE兼容性<br></td>
            <td style="vertical-align: top;">视图-模型分离机制<br></td>
            <td style="vertical-align: top;">运行时<br></td>
            <td style="vertical-align: top;">其它<br></td>
        </tr>
        <tr>
            <td>Windows Forms<br></td>
            <td style="vertical-align: top;">接口优秀。C++下使用CLI扩展，其它语言为原生支持。<br></td>
            <td style="vertical-align: top;">界面编辑器完整，包括布局、属性、消息关联的完整设置。不可预览。<br></td>
            <td style="vertical-align: top;">Table Layout，Splitter Layout，Flow Layout等，Anchor和Dock机制。多分辨率界面下表现良好。<br></td>
            <td style="vertical-align: top;">GDI+，面向对象的2D绘制接口，使用简便。<br></td>
            <td style="vertical-align: top;">需要.Net平台支持。WIndows或Linux（Mono，非官方支持），支持Windows CE<br></td>
            <td style="vertical-align: top;">C++/CLI, 支持.net的语言。<br></td>
            <td style="vertical-align: top;">仅VS。<br></td>
            <td style="vertical-align: top;">布局和视图方案建立在代码中。部分组件支持Model-View架构。<br></td>
            <td style="vertical-align: top;">需要部署对应的.net<br></td>
            <td style="vertical-align: top;">商业协议<br></td>
        </tr>
        <tr>
            <td style="vertical-align: top;">MFC<br></td>
            <td style="vertical-align: top;">基于宏和虚函数，使用特殊格式注释，使用自定义的RTTI系统。类接口设计优良。通过回调函数和虚继承重载调用客户代码。<br></td>
            <td style="vertical-align: top;">基于资源编辑器，仅能对空间基本布局和少量属性进行调整。不可预览。<br></td>
            <td style="vertical-align: top;">缺乏高级布局功能，多分辨率需要是手工或程序中调整。<br></td>
            <td style="vertical-align: top;">GDI及GDI封装，可选GDI+<br></td>
            <td style="vertical-align: top;">Windows，Windows CE<br></td>
            <td style="vertical-align: top;">C++ Only，<br>支持COM时可以实现Binary级别复用。<br></td>
            <td style="vertical-align: top;">仅Visual Studio<br></td>
            <td style="vertical-align: top;">使用资源保存控件的基本控件布局，提供Doc-View机制和控件数据交换支持视图分离。<br></td>
            <td style="vertical-align: top;">需要部署MFC运行时库。<br></td>
            <td style="vertical-align: top;">商业协议<br></td>
        </tr>
        <tr>
            <td style="vertical-align: top;">WTL<br></td>
            <td style="vertical-align: top;">基于模板和虚函数。类接口类似于MFC。需要使用多重继承。通过模板特化和回调函数与客户代码交互。<br></td>
            <td style="vertical-align: top;">同MFC<br></td>
            <td style="vertical-align: top;">同MFC<br></td>
            <td style="vertical-align: top;">同MFC<br></td>
            <td style="vertical-align: top;">同MFC<br></td>
            <td style="vertical-align: top;">同MFC，对COM的支持比MFC完善很多。<br></td>
            <td style="vertical-align: top;">Visual Studio，Windows下支持标准的C++编译器。<br></td>
            <td style="vertical-align: top;">使用资源文件保存空间布局。<br></td>
            <td style="vertical-align: top;">无<br></td>
            <td style="vertical-align: top;">自由协议<br></td>
        </tr>
        <tr>
            <td style="vertical-align: top;">wxWidget<br></td>
            <td style="vertical-align: top;">宏，自定义RTTI。使用回调函数与用户代码交互。<br></td>
            <td style="vertical-align: top;">无官方界面编辑器。可使用第三方界面编辑器。部分编辑器具有完整的所见即所得功能，且具有预览能力。<br></td>
            <td style="vertical-align: top;">使用Sizer实现多分辨率的布局。功能偏弱。<br></td>
            <td style="vertical-align: top;">wxDC等。<br></td>
            <td style="vertical-align: top;">Windows，Linux，Unix，MacOS等<br></td>
            <td style="vertical-align: top;">C++, .NET, Python,<br>Lua,<br>Ruby等<br></td>
            <td style="vertical-align: top;">良好的编译器兼容性，缺乏IDE继承。<br></td>
            <td style="vertical-align: top;">可以将界面属性生成到代码中，也可以使用XML格式保存。<br></td>
            <td style="vertical-align: top;">wx的动态链接库或静态链接。<br></td>
            <td style="vertical-align: top;">自由协议<br></td>
        </tr>
        <tr>
            <td style="vertical-align: top;">Qt<br></td>
            <td style="vertical-align: top;">使用宏和自定义的RTTI。使用Singal-Slot机制实现用户代码交互。可通过继承实现扩展。<br></td>
            <td style="vertical-align: top;">Qt Designer，具备完整的所见即所得编辑功能。可预览界面。<br></td>
            <td style="vertical-align: top;">具备完整的布局功能。多分辨率/多平台下表现良好。<br></td>
            <td style="vertical-align: top;">QCanvas等。<br></td>
            <td style="vertical-align: top;">Windows，Linux，Unix，MacOS等。<br></td>
            <td style="vertical-align: top;">C++，Python等<br></td>
            <td style="vertical-align: top;">可集成到Eclipse和VS<br></td>
            <td style="vertical-align: top;">使用资源文件保存界面信息。部分组件具备Model-View-Delegate架构<br></td>
            <td style="vertical-align: top;">qt的动态链接库。<br></td>
            <td style="vertical-align: top;">开源协议+商业协议<br></td>
        </tr>
        <tr>
            <td style="vertical-align: top;">GTK+<br></td>
            <td style="vertical-align: top;">使用signal-slot机制完成用户代码交互。<br></td>
            <td style="vertical-align: top;">GLADE，具备所见即所得的界面编辑功能<br></td>
            <td style="vertical-align: top;">Layout Containers，具备较完整的布局能力。<br></td>
            <td style="vertical-align: top;">GTK Graphics Context<br></td>
            <td style="vertical-align: top;">Windows，Linux，Unix，MacOS等。</td>
            <td style="vertical-align: top;">C，C++，Python，.NET等。<br></td>
            <td style="vertical-align: top;">（暂时未知）<br></td>
            <td style="vertical-align: top;">使用代码完成界面设置。部分组件具备Model-View架构。<br></td>
            <td style="vertical-align: top;">GTK Runtime<br></td>
            <td style="vertical-align: top;">开源协议<br></td>
        </tr>
    </tbody>
</table>
<br>此外，除了WTL外，其余各界面库均有完整及时的文档和手册，因此比较项中不再指明。<br>回帖中有人指出国际化问题的比较，事实上MS的产品和开源对于国际化的解决方法是不同的。但是都可以比较方便的解决国际化问题。<br>  <img src ="http://www.cppblog.com/lingjingqiu/aggbug/71363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2009-01-06 18:09 <a href="http://www.cppblog.com/lingjingqiu/archive/2009/01/06/71363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Flex 2.5.33 和 Bison 2.3 下载</title><link>http://www.cppblog.com/lingjingqiu/archive/2008/12/19/69871.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Fri, 19 Dec 2008 14:16:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2008/12/19/69871.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/69871.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2008/12/19/69871.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/69871.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/69871.html</trackback:ping><description><![CDATA[如果为了一个Flex和Bison就下整个MSYS和Cygwin我觉得有点太夸张了。<br>不过为了提个可用的新版本花了我两个晚上。麻烦死了。<br>我估计还有人也会觉得很麻烦。<br>所以就把这个下载放上来，在win下面可以独立运行的，不过最好把bin目录设置到Path中。<br><br>在我的工程里面是用批处理做的，这样可以放到编译前脚本里面，就可以在编译前自动生成新的分析文件。<br><br>其实我还改了下FlexLexer.h，不知道为什么我的那个会有redefine的编译错误，mingw gcc432(tdm版)。<br>VS下面没有运行过，不过应该没问题。<br>也不知道我修的是对是错，还请高人指点。<br><br>@echo off<br>set path=%path%;../util/bin/<br>bison -d gram.y<br>flex -o lex.yy.cc lex.l<br><br><span style="color: red;"></span><a href="http://www.cppblog.com/Files/lingjingqiu/flex_and_bison.rar"><span style="color: red;">下载地址</span></a>， 带RR10%, .<br><br>  <img src ="http://www.cppblog.com/lingjingqiu/aggbug/69871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2008-12-19 22:16 <a href="http://www.cppblog.com/lingjingqiu/archive/2008/12/19/69871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式小结（四）  -- 终于完结了，哇咔咔，和上篇隔了9个月，汗。</title><link>http://www.cppblog.com/lingjingqiu/archive/2008/11/21/67509.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Fri, 21 Nov 2008 10:29:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2008/11/21/67509.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/67509.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2008/11/21/67509.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/67509.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/67509.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设计模式小结的最后一篇，这样 GOF 2X 个模式就都齐全了。。。<br>欢迎大家喷。。。。&nbsp;&nbsp;<a href='http://www.cppblog.com/lingjingqiu/archive/2008/11/21/67509.html'>阅读全文</a><img src ="http://www.cppblog.com/lingjingqiu/aggbug/67509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2008-11-21 18:29 <a href="http://www.cppblog.com/lingjingqiu/archive/2008/11/21/67509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件夹比较备份工具</title><link>http://www.cppblog.com/lingjingqiu/archive/2008/11/06/66182.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Thu, 06 Nov 2008 15:48:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2008/11/06/66182.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/66182.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2008/11/06/66182.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/66182.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/66182.html</trackback:ping><description><![CDATA[这个工具源自于我的一个需求，<br>我将文档都保存在了硬盘上，只不过由于分布不够大而只能分开放置于多个文件夹中。<br>有时候我需要将这些数据进行备份，一张盘也放不下，也就需要备份到多张盘中。<br><br>此时问题出现了，如果我往硬盘上新添了一些文档，在我下一次备份的时，我如何准确的筛选出新增的文档。<br><br>一般来讲如果只是一个源盘和一个目标盘，用Beyond Compare或者类似的工具就能解决问题。<br>不过现在是多对多的，问题就变得比较复杂。<br><br>因此我就做了这么个东西，<span style="color: #8408ff;">可以将多个目录组成虚拟的文件树再进行比较。</span><br><span style="color: #8408ff;">文件夹的对应关系直接利用同级文件夹的名称来判断</span>。<br>我也提供了手工设置文件夹对应关系的功能，不过因为UI方面还没考虑好所以没有加上。<br><br>而<span style="color: #8408ff;">文件之间的比较利用两种方案，一种方案在文件被计算过MD5效验的时候直接使用MD5比较</span>；<br><span style="color: #8408ff;">如果没有MD5的话使用文件大小和最后修改时间比较</span>。<br>由于文件比较不使用文件名，也就获得不了对应关系，因此目录树下面的所有文件的所有组合都要一一遍历。<br>同时由于计算MD5效验码需要读取整个文件，时间较长，因此Checksum是需要手动计算和刷新的。<br><br>最后就是树可以整棵的被保存到快照文件中，格式是XML的格式，人也可以读。<br>比较过后，可以某个子树或者单棵整树的相同文件或这新增文件拷贝到一个目录下。<br>本来希望能直接生成Nero的刻录清单的文件格式，后来找不到相关的资料就只好放弃了。<br><br><a href="http://www.cppblog.com/Files/lingjingqiu/Backuper.zip">Download Source Code Project</a>，VS2005 / VS2005 SP1, XP SP2/SP3下通过。<br><br>
<div style="text-align: center;"><img src="http://www.cppblog.com/images/cppblog_com/lingjingqiu/BackupGuyScreenshot.PNG" border="0"><br><br>屏幕快照。红色表示新增文件，蓝色表示相同文件，黄色表示不完全对应。<br></div>
<br>  <img src ="http://www.cppblog.com/lingjingqiu/aggbug/66182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2008-11-06 23:48 <a href="http://www.cppblog.com/lingjingqiu/archive/2008/11/06/66182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将树型数据结构转换为图片并自动排版</title><link>http://www.cppblog.com/lingjingqiu/archive/2008/09/13/61741.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Sat, 13 Sep 2008 04:42:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2008/09/13/61741.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/61741.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2008/09/13/61741.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/61741.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/61741.html</trackback:ping><description><![CDATA[呃，怎么说呢，这个和vczh的同名文章是互为补充的。这是最近老板的要求，所以就写了这么个东西。<br><br>vczh的方法生成的树是sparse的，而我这里树则要紧凑一些，所使用的坐标系也与之不同。<br><br>效果（看起来挺菜，哇咔咔）<br><img src="http://www.cppblog.com/images/cppblog_com/lingjingqiu/AutoLayoutTree.PNG" border="0"><br><br>布局分为水平布局和竖直布局两个部分，我这里先进行了水平布局再进行了竖直布局。<br><br>一般来讲紧凑的树主要指同级节点方向上的紧凑性。由于这里树是父节点在上，子结点在下，因此水平方向上的节点要尽量紧凑。那么便需要我将节点尽量往左布局。<br>如果自左往右布置节点，那么很显然，左边的节点的位置一旦固定下来就不需要再行调整。<br>同时，为了保持树的美观，父节点的水平中心应当是子结点的水平中心，这样子结点就会对称分布在父节点的下方，有利于美观。<br>然而父节点能正常布局的位置，子结点可能无法正常布局（子结点的宽度比父节点宽得多）。因此我们还需要调整子结点的布局。<br>由于是自左向右布局的，此时子结点的左边的节点都已经确定了，正确的布局很容易便可以通过右移得到。<br>为了保证正确性，还需要把父节点也右移。因为父节点的右边没有布局限制，因而可以放心的右移。这样一直传递到根节点就可以了。<br>那么很明显，整体来说，布局顺序就是，自下而上，自左而右。<br><br>为了让节点在布局的时候知道自己能被安排的最左位置，需要为每一层保存最左可布局位置的坐标。<br>一旦有节点被安排妥当，便更新节点所在层次的最左可布局位置。后来的节点只要在这个位置的右方布局，就不会与已布置的节点冲突。<br><br>竖直布局并不复杂，算出每一层的Top就可以了。<br><br>代码如下： <br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System;<br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Collections.Generic;<br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Text;<br></span><span style="color: #0000ff;">using</span><span style="color: #000000;">&nbsp;System.Drawing;<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">布局算法：<br></span><span style="color: #008000;">//</span><span style="color: #008000;">采用平行节点最左布局，父子节点对中布局的原则。</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #008000;">/*</span><span style="color: #008000;">***<br>&nbsp;*&nbsp;&nbsp;void&nbsp;Layout(int&nbsp;lyr)<br>&nbsp;*&nbsp;&nbsp;{<br>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;*&nbsp;&nbsp;}<br>&nbsp;*&nbsp;<br>****</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">namespace</span><span style="color: #000000;">&nbsp;CrowdTree<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LayoutTreeLayerInfo<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">可安排布局的最左坐标</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;lyrLefts&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;heights&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Reset()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lyrLefts&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heights&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Dictionary</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;GetLayoutableLeft(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;level)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(lyrLefts.ContainsKey(level))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;lyrLefts[level];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetLayoutableLeft(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;level,&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(lyrLefts.ContainsKey(level))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lyrLefts[level]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Math.Max(left,&nbsp;lyrLefts[level]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lyrLefts[level]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Math.Max(</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;left);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;SetLayoutLevelMinHeight(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;level,&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;height)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(heights.ContainsKey(level))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heights[level]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Math.Max(heights[level],&nbsp;height);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;heights[level]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;height;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;GetLayoutLevelMinHeight(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;level)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(heights.ContainsKey(level))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;heights[level];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LayoutTreeNode<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;LayoutTree&nbsp;owner_;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;LayoutTreeLayerInfo&nbsp;lyrInfo_;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;lyrLevel_;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;RectangleF&nbsp;rect_;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">LayoutTreeNode</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;children_&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">LayoutTreeNode</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;Level<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;lyrLevel_;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;{&nbsp;lyrLevel_&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;LayoutTree&nbsp;Owner<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;owner_;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;{&nbsp;owner_&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;LayoutTreeLayerInfo&nbsp;LayerInfo<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;{&nbsp;lyrInfo_&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">LayoutTreeNode</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;Children<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;children_;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;RectangleF&nbsp;Extent<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;rect_;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;LayoutHorizontal()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">获取当前节点能够排布的最左位置，并预先安排当前节点。</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;originLeft&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;lyrInfo_.GetLayoutableLeft(lyrLevel_);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect_.X&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;originLeft;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">根据当前结点的坐标，安排子结点，并需要根据子结点的安置情况重新调整父节点的安置</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(children_.Count&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">计算子结点最左可以安放的位置</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;childrenTotalWidth&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0.0F</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(LayoutTreeNode&nbsp;child&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;children_)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;childrenTotalWidth&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;child.Extent.Width;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;childrenTotalWidth&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;((children_.Count&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;owner_.HorizontalSpacer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;childLeftest&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;originLeft&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(rect_.Width&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2.0f</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;(childrenTotalWidth&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2.0F</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">设置子结点安放的最左位</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lyrInfo_.SetLayoutableLeft(lyrLevel_&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">,&nbsp;childLeftest);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">安放子结点</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;idxChild&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;idxChild&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;children_.Count;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">idxChild)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children_[idxChild].LayoutHorizontal();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">利用子结点重新对中安置当前节点</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;center&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(children_[</span><span style="color: #000000;">0</span><span style="color: #000000;">].Extent.Left&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;children_[children_.Count&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">].Extent.Right)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2.0F</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect_.X&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;center&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;rect_.Width&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2.0F</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">利用节点坐标设置该层其他子结点所能安放的最左位置，并设置一下当前层元素的最大高度</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lyrInfo_.SetLayoutableLeft(lyrLevel_,&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.rect_.Right&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;owner_.HorizontalSpacer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lyrInfo_.SetLayoutLevelMinHeight(lyrLevel_,&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.rect_.Height);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;LayoutVertical(</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;top)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect_.Y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;top;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(LayoutTreeNode&nbsp;child&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;children_)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;child.LayoutVertical(top&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;lyrInfo_.GetLayoutLevelMinHeight(lyrLevel_)&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;owner_.VerticalSpacer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Layout()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutHorizontal();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutVertical(</span><span style="color: #000000;">0.0f</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;CalculateSize(</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;maxWidth,&nbsp;Font&nbsp;font,&nbsp;Graphics&nbsp;g)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;CalculateSizeRecursive(</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;maxWidth,&nbsp;Font&nbsp;font,&nbsp;Graphics&nbsp;g)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">virtual</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Draw(Graphics&nbsp;g)&nbsp;{&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;TextLayoutTreeNode:&nbsp;LayoutTreeNode<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;">&nbsp;text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;StringFormat&nbsp;strFmt&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringFormat();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Font&nbsp;font;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;Text<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;text;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;{&nbsp;text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">override</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;CalculateSize(</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;maxWidth,&nbsp;Font&nbsp;font,&nbsp;Graphics&nbsp;g)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strFmt.Alignment&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;StringAlignment.Center;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strFmt.LineAlignment&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;StringAlignment.Center;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rect_.Size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;g.MeasureString(text,&nbsp;font,&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)maxWidth,&nbsp;strFmt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.font&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;font;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">override</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;CalculateSizeRecursive(</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;maxWidth,&nbsp;Font&nbsp;font,&nbsp;Graphics&nbsp;g)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CalculateSize(maxWidth,&nbsp;font,&nbsp;g);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(LayoutTreeNode&nbsp;node&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;children_)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node.CalculateSizeRecursive(maxWidth,&nbsp;font,&nbsp;g);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">override</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;Draw(Graphics&nbsp;g)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">外轮廓，内容，连线</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.DrawRectangle(Pens.Black,&nbsp;Rectangle.Round(Extent));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.DrawString(text,&nbsp;font,&nbsp;Brushes.Red,&nbsp;Extent);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">foreach</span><span style="color: #000000;">&nbsp;(LayoutTreeNode&nbsp;childNode&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;children_)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">绘制斜线</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;childX&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(childNode.Extent.Left&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;childNode.Extent.Right)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2.0F</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;childY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;childNode.Extent.Top;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;curX&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Extent.Left&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;Extent.Right)&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2.0f</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;curY&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Extent.Bottom;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.DrawLine(Pens.Black,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PointF(childX,&nbsp;childY),&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PointF(curX,&nbsp;curY));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;LayoutTree<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;vertical_spacer;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;horizontal_spacer;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;LayoutTreeNode&nbsp;root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;LayoutTreeLayerInfo&nbsp;lyrInfo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;LayoutTreeLayerInfo();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;VerticalSpacer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;vertical_spacer;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;{&nbsp;vertical_spacer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">float</span><span style="color: #000000;">&nbsp;HorizontalSpacer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;horizontal_spacer;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;{&nbsp;horizontal_spacer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;LayoutTreeNode&nbsp;Root<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">get</span><span style="color: #000000;">&nbsp;{&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;root;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">set</span><span style="color: #000000;">&nbsp;{&nbsp;root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;value;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;ResetLayout()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lyrInfo.Reset();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;T&nbsp;CreateNode</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">T</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;(LayoutTreeNode&nbsp;parent)&nbsp;where&nbsp;T:LayoutTreeNode,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;retNode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;T();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retNode.Owner&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retNode.LayerInfo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.lyrInfo;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(parent&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.root&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;retNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retNode.Level&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent.Children.Add(retNode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;retNode.Level&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;parent.Level&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;retNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<br>  <img src ="http://www.cppblog.com/lingjingqiu/aggbug/61741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2008-09-13 12:42 <a href="http://www.cppblog.com/lingjingqiu/archive/2008/09/13/61741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SoftArt Shader Language Syntax EBNF</title><link>http://www.cppblog.com/lingjingqiu/archive/2008/07/25/57100.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Thu, 24 Jul 2008 18:25:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2008/07/25/57100.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/57100.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2008/07/25/57100.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/57100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/57100.html</trackback:ping><description><![CDATA[经过一晚上的整理，把 <a style="color: #0817ff;" href="http://sourceforge.net/projects/softart/">SoftArt</a> Shader Language 的 EBNF 弄出来了。<br>主要参照的是 <a style="color: #0817ff;" href="http://www.externsoft.ch/download/cpp-iso.html">ISO C++的EBNF</a> 。<br>由于ISO C++并不是一个LALR(1)能够解决的问题，因此不知道这个C++ EBNF的简化版能否在YACC上比较方便的实现。<br>如果不能实现，我会先考虑修正语法满足需要，而不是手写编译器，我还没那个能耐。<br><br>Flex 与 Bison 的 <span style="color: #0817ff;"></span><a href="http://www.cppblog.com/Files/lingjingqiu/flex_and_bison.rar"><span style="color: #0817ff;">下载地址</span></a><br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%; font-family: courier new;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">//SASL:&nbsp;SoftArt&nbsp;Shader&nbsp;Language<br><br>Syntax<br><br>Program&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DeclSeq<br><br>//////////////////////////////////<br>//Declaration<br>//////////////////////////////////<br>DeclSeq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Decl&nbsp;|&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeclSeq&nbsp;Decl<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>Decl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;BlockDecl&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FunctioDef<br><br>Declarator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DirectDecl&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">SemanticSpec</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">RegisterSpec</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;"><br><br>DirectDecl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DeclId&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DirectDecl&nbsp;'('&nbsp;ParamDeclClause&nbsp;')'|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DirectDecl&nbsp;'</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">'&nbsp;[ConstExp</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;']'|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'('&nbsp;Declarator&nbsp;')'<br><br>CvQualifierSeq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CvQualifier&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">CvQualifierSeq</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;"><br><br>CvQualifier&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'const'&nbsp;|&nbsp;'uniform'<br><br>SemanticSpec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;':'&nbsp;Semantic<br><br>RegisterSpec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;':'&nbsp;'register'&nbsp;'('&nbsp;Register&nbsp;')'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>BlockDecl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SimpleDecl<br><br>SimpleDecl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">DeclSpecSeq</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">InitDeclList</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;'</span><span style="color: #008000;">;</span><span style="color: #008000;">'</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>AbsDecl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DirectAbsDecl<br><br>DirectAbsDecl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">DirectAbsDecl</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;'('&nbsp;ParamDeclClause&nbsp;')'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">DirectAbsDecl</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;'</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">'&nbsp;[ConstExp</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;']'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'('&nbsp;AbsDecl&nbsp;')'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>DeclSpecSeq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">DeclSpecSeq</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;DeclSpec<br><br>InitDeclList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;InitDecl&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitDeclList&nbsp;'</span><span style="color: #000000;">,</span><span style="color: #000000;">'&nbsp;InitDecl<br><br>InitDecl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Declarator&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">Init</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;"><br><br>Init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;InitClause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;ExpList)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>InitClause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AssignmentExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'{'&nbsp;InitList&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">','</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;'}'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'{'&nbsp;'}'<br>InitList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;InitClause&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitList&nbsp;'</span><span style="color: #000000;">,</span><span style="color: #000000;">'&nbsp;InitClause<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>DeclSpec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;TypeSpec<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>TypeSpec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;SimpleTypeSpec&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassSpec<br><br>SimpleTypeSpec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;'int'&nbsp;|&nbsp;'half'&nbsp;|&nbsp;'float'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'int2'&nbsp;|&nbsp;'half2'&nbsp;|&nbsp;'float2'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'int3'&nbsp;|&nbsp;'half3'&nbsp;|&nbsp;'float3'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'int4'&nbsp;|&nbsp;'half4'&nbsp;|&nbsp;'float4'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'float4x4'<br><br>/////////////////////////////<br>//Function<br>/////////////////////////////<br>FunctionDef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">DeclSpecSeq</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;Declarator&nbsp;FunctionBody<br><br>FunctionBody&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CompoundStatement<br><br>/////////////////////////////<br>//Statements<br>/////////////////////////////<br>CompoundStatement&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'{'&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">StatementSeq</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;'}'<br><br>StatementSeq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Statement&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StatementSeq&nbsp;Statement<br><br>Statement&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ExpStatement&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompountStatement&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectionStatement&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IterationStatement&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeclStatement<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>ExpStatement&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;Expression&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;'</span><span style="color: #008000;">;</span><span style="color: #008000;">'</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>SelectionStatement&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'if'&nbsp;'('&nbsp;Condition&nbsp;')'&nbsp;Statement&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'if'&nbsp;'('&nbsp;Condition&nbsp;')'&nbsp;Statement&nbsp;'else'&nbsp;Statement<br><br>IterationStatement&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'while'&nbsp;'('&nbsp;Condition&nbsp;')'&nbsp;Statement&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'do'&nbsp;Statement&nbsp;'while'&nbsp;'('&nbsp;Expression&nbsp;')'&nbsp;'</span><span style="color: #008000;">;</span><span style="color: #008000;">'</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'for'&nbsp;'('&nbsp;ForInitStatement&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">Condition</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;'</span><span style="color: #008000;">;</span><span style="color: #008000;">'&nbsp;[&nbsp;Expression&nbsp;]&nbsp;')'&nbsp;Statement</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>Condition&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Expression&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TypeSpecSeq&nbsp;Declarator&nbsp;'</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;AssignmentExp<br><br>ForInitStatement&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ExpStatement&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDecl<br><br>DeclStatement&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;BlockDecl<br><br>/////////////////////////////&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>//Parameter<br>/////////////////////////////<br>ParamDeclClause&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;ParamDeclList&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;"><br><br>ParamDeclList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ParamDecl&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ParamDeclList&nbsp;'</span><span style="color: #000000;">,</span><span style="color: #000000;">'&nbsp;ParamDecl<br><br>ParamDecl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DeclSpecSeq&nbsp;Delarator&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeclSpecSeq&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">AbsDecl</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;"><br><br><br>/////////////////////////////<br>//Class&nbsp;And&nbsp;Struct<br>/////////////////////////////<br>ClassSpec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ClassHead&nbsp;'{'&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;MemberSpec&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;'}'<br><br>ClassHead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'struct'&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;Identifier&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;"><br><br>MemberSpec&nbsp;&nbsp;&nbsp;&nbsp;`&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MemberDecl&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">MemberSpec</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;"><br><br>MemberDeclaration&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">DeclSpecSeq</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">MemberDeclList</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;"><br><br>MemberDeclList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MemberDecl&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemberDeclList&nbsp;'</span><span style="color: #000000;">,</span><span style="color: #000000;">'&nbsp;MemberDeclarator<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>MemberDeclarator&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;Declarator&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;PureSpec&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Declarator&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;ConstInit&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;Identifier&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;':'&nbsp;ConstExp<br><br><br><br>//////////////////////////////////////<br>//Expressions<br>//////////////////////////////////////<br>Expression&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AssignmentExp<br><br>ConstExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CondExp<br><br>AssignmentExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CondExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LogicalOrExp&nbsp;AssignmentOp&nbsp;AssignmentExp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>CondExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LogicalOrExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LogicalOrExp&nbsp;'?'&nbsp;Expression&nbsp;':'&nbsp;AssignmentExp<br><br>LogicalOrExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;LogicalAndExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LogicalOrExp&nbsp;'||'&nbsp;LogicalAndExp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>LogicalAndExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;InclusiveOrExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LogicalAndExp&nbsp;'&amp;&amp;'&nbsp;InclusiveOrExp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>InclusiveOrExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ExclusiveOrExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InclusiveOrExp&nbsp;'|'&nbsp;ExclusiveOrExp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>ExclusiveOrExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AndExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExclusiveOrExp&nbsp;'^'&nbsp;AndExp<br><br>AndExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;EqualExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AndExp&nbsp;'&amp;'&nbsp;EqualExp<br><br>EqualExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;RelExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EqualExp&nbsp;'</span><span style="color: #000000;">==</span><span style="color: #000000;">'&nbsp;RelExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EqualExp&nbsp;'!</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;RelExp<br><br>RelExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ShiftExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RelExp&nbsp;'&lt;'&nbsp;ShiftExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RelExp&nbsp;'&gt;'&nbsp;ShiftExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RelExp&nbsp;'&lt;</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;ShiftExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RelExp&nbsp;'&gt;</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;ShiftExp<br><br>ShiftExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AddExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShiftExp&nbsp;'&lt;&lt;'&nbsp;AddExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShiftExp&nbsp;'&gt;&gt;'&nbsp;AddExp<br><br>AddExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;MulExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddExp&nbsp;'+'&nbsp;MulExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AddExp&nbsp;'-'&nbsp;MulExp<br><br>MulExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PmExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MulExp&nbsp;'*'&nbsp;PmExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MulExp&nbsp;'/'&nbsp;PmExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MulExp&nbsp;'%'&nbsp;PmExp<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>PmExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;CastExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PmExp&nbsp;'.*'&nbsp;CastExp<br><br>CastExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;UnaryExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'('&nbsp;TypeId&nbsp;')'&nbsp;CastExp<br><br>UnaryExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PostfixExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'++'&nbsp;CastExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'--'&nbsp;CastExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UnaryOp&nbsp;CastExp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>PostfixExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;PrimaryExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostfixExp&nbsp;'</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">'&nbsp;Expression&nbsp;'</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostfixExp&nbsp;'('&nbsp;Expression&nbsp;')'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostfixExp&nbsp;'('&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;ExpList&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;')'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleTypeSpec&nbsp;'('&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">&nbsp;ExpList&nbsp;</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;')'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostfixExp&nbsp;'++'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PostfixExp&nbsp;'--'<br><br>PrimaryExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Literal&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'('&nbsp;Expression&nbsp;')'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IdExp<br><br>IdExp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;UnqualifiedId<br><br>ExpList&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AssigmentExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExpList&nbsp;'</span><span style="color: #000000;">,</span><span style="color: #000000;">'&nbsp;AssignmentExp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>//////////////////////////////<br>//Identifier<br>//////////////////////////////<br>DeclId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;IdExp&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TypeName<br><br>UnqualifiedId&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Identifier<br><br>Identifier&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NonDigit&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifier&nbsp;NonDigit&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Identifier&nbsp;Digit<br><br>//////////////////////////////<br>//Literals<br>//////////////////////////////<br>Literal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;IntLiteral&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FloatLiteral&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BoolLitreral<br><br>IntLiteral&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DemicalLiteral<br><br>DemicalLiteral&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NonZeroDigit&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DemicalLiteral&nbsp;|&nbsp;Digit<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>FloatLiteral&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;FracConstant&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">ExponentPart</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DigitSeq&nbsp;ExponentPart<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>BoolLiteral&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'false'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'true'<br><br>FracConstant&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">DigitSeq</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;'.'&nbsp;DigitSeq&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DigitSeq&nbsp;'.'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>ExponentPart&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'e'&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">Sign</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;DigitSeq&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'E'&nbsp;</span><span style="color: #800000; font-weight: bold;">[</span><span style="color: #800000;">Sign</span><span style="color: #800000; font-weight: bold;">]</span><span style="color: #000000;">&nbsp;DigitSeq<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>DigitSeq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Digit&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DigitSeq&nbsp;Digit<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>//////////////////////////<br>//Terminals<br>//////////////////////////<br><br>NonDigit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AlphaChar&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'_'<br><br>NonZeroDigit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'</span><span style="color: #000000;">1</span><span style="color: #000000;">'&nbsp;|&nbsp;<img src="http://www.cppblog.com/Images/dot.gif">&nbsp;|&nbsp;'</span><span style="color: #000000;">9</span><span style="color: #000000;">'<br><br>AssignmentOp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;::</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;|&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'*</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;&nbsp;|&nbsp;'/</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;&nbsp;|&nbsp;'%</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;&nbsp;|&nbsp;'-</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&gt;&gt;</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;|&nbsp;'&lt;&lt;</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;|<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&amp;</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;&nbsp;|&nbsp;'^</span><span style="color: #000000;">=</span><span style="color: #000000;">'&nbsp;&nbsp;|&nbsp;'|</span><span style="color: #000000;">=</span><span style="color: #000000;">'<br>Register<br>Semantic<br>Digit<br>AlphaChar<br>Keyword</span></div>
<br><br>有点儿参差不齐，哈哈。一些Terminator我就没有写了。预处理的部分由于使用Boost.Wave，因此也没有加入到EBNF中。这些都很大程度上简化了EBNF的内容。<br>然后大概的根据层次归了一下类，看起来要方便一点。<br>但愿语法树里面没有漏掉的。<br>等回到自己机器上就开始自下向上的实现这个东西了，争取10月份之前能把整个Shader编译器集成到SoftArt里面去。<br>目前就让它在SVN的SandBox里面待着好了。<br>   <img src ="http://www.cppblog.com/lingjingqiu/aggbug/57100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2008-07-25 02:25 <a href="http://www.cppblog.com/lingjingqiu/archive/2008/07/25/57100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始写EBNF Grammar for SoftArt Shader Language</title><link>http://www.cppblog.com/lingjingqiu/archive/2008/07/25/57096.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Thu, 24 Jul 2008 16:11:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2008/07/25/57096.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/57096.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2008/07/25/57096.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/57096.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/57096.html</trackback:ping><description><![CDATA[最近在做Shader的编译器。<br><br>想好了我的编译器就叫SASL，SoftArt Shader Language。<br>因为之前没写过EBNF，没什么经验，因此找了C和C++的EBNF在参考。<br>特别是C的EBNF。<br>因为可以用LALR(1)实现，因此对我这样用LEX + YACC的人而言就更加有用一点。<br>整体而言准备尽可能和SM4.0一致，用Boost.Wave支持Preprocessing。<br>这样的话差不多就全了。这两天先把Shader的EBNF弄出来，完了开始从小往大写慢慢写语法分析器和编译器。<br><br><a  href="http://www.externsoft.ch/download/cpp-iso.html">http://www.externsoft.ch/download/cpp-iso.html</a><br><br>这里是C++的EBNF。有点太复杂了觉得。。。<br><br><br><br> <img src ="http://www.cppblog.com/lingjingqiu/aggbug/57096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2008-07-25 00:11 <a href="http://www.cppblog.com/lingjingqiu/archive/2008/07/25/57096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>再用Boost.Python</title><link>http://www.cppblog.com/lingjingqiu/archive/2008/07/14/56123.html</link><dc:creator>空明流转</dc:creator><author>空明流转</author><pubDate>Mon, 14 Jul 2008 11:05:00 GMT</pubDate><guid>http://www.cppblog.com/lingjingqiu/archive/2008/07/14/56123.html</guid><wfw:comment>http://www.cppblog.com/lingjingqiu/comments/56123.html</wfw:comment><comments>http://www.cppblog.com/lingjingqiu/archive/2008/07/14/56123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lingjingqiu/comments/commentRss/56123.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lingjingqiu/services/trackbacks/56123.html</trackback:ping><description><![CDATA[上次用boost.python的时候boost还是1.33的时候。<br><br>那个时候刚刚开始看shader的东西，就用boost.python做了用python做shader语言的演示。<br>其实当时看boost.python完全是半懂不懂的。<br>这段时间找了个C的数值库，要Python的接口，Python For C的Interface又懒得使用，还是用boost.python把一些我要的功能给封装出来好了。<br>结果一看才发现对Boost.Python的理解好了不好。<br><br>看来人都是在慢慢进步的。。。哈哈。<br><br><img src ="http://www.cppblog.com/lingjingqiu/aggbug/56123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lingjingqiu/" target="_blank">空明流转</a> 2008-07-14 19:05 <a href="http://www.cppblog.com/lingjingqiu/archive/2008/07/14/56123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>