编译器的设计与实现

所需积分/C币:50 2019-01-11 16:47:15 137KB PDF

编译器的设计与实现 编译器的设计与实现 编译器的设计与实现
对一个指令进行解析时,先査询它的参数要求,然后根据用户输入的参数,逐个查询 参数的信息,并与指令要求进行比对,以确认指令和参数都输入无误。以上都确认完毕后 就将指令编码和元件编似与入到最终的执行代码。 31指令结构定义 <ins type> 指令类型,代表了指令长度以及某些特殊指令标识(比如需要对某条指令的 使用次数进行限制) <ins code> 指令编似,下位机凭此字段识别指令 < soper num>参数个数,有多少个参数,就会有多少个下述的参数子节点 3.2指令参数定义 <data type e>|该参数的数据类型掩码,包括:位、无符号单字、带符号单字、无符号双字、 带符号双字、浮点 o typc 该参数的读写属性 celem mask>该参数所支持的元件类型掩码,比如某个参数允许YMS三种元件,则这个 值就是( elem y| elem m| elem s) 3.3元件属性定义 < Kelem type>与< Celem mask>相对应的元件类型唯编码 < data type>该元件可以作为哪些数据类型使用,比如D元件可以做单字、双字及浮点 那么D元件的这个值就是( typc w| typc I| typc Dw typc DI| typc F) < Addr typex元件寻址类型,包括:常数、元件、位组、变址、字符串等 ad- subtype>元件寻址子类型,对寻址类型的细分,比如同为元件寻址,D元件、C元件 T元件都有不同子类型。此字段和 addr type一起,决定了下位机如何识别 此参数 elem rwat该元件的读写类型,该类型必须与参数子节点的io!pe匹配 4XML查询器 实现XML查询接口的库有很多,有微软官方的,也有开源的,可以根据自己的需要选择, 反正按我的经验,对于这种简单应用,任何一种库的査询性能都是足够的。 具体实现的时候,可以将指令査询器抽象出一个接口类,然后具体的査询器继承自接口 类,并包含一个库中的实现类,比如选拌微软的DOM模型的话: class CInstructionQueryer public IInstructionQueryer public //此处实现工 nstructionQueryer定义的查询接冂 HRESULT AAAAA()i HRESULT BBBBB (); private: // IXMLDOMDocument2是DOM模型中具体实现查询操作的类 IXMLDOMDocumcnt2* m pXMLDoCi 5编译器执行过程 开始 指令表为空 N 取出下一行 取出指令名称 用ⅪML解析 逐个取出参数 用ⅫML解析 校验失败 校验参数个数 <校验参数数据类型 报错 校验参数元件类型 <校验参数读写属性 别指令 参数范围检查 个别指 使用次数数检查 「生成可执行代码 校验程序总步数 成功 失败 报错 结束 6实例解析 按照惯例,最后以一个例子说明用户指令编译为指令码的过程。 61待编译的指令 LD X4 PLsY10000D100Y1 62相关XML文件内容 //LD指令的定义 <LDX Kins type>l</irs type> <ins code>16</ins code> <operand rum>1</operand num> Operand id="0"> <data type>1</data type> <io type>0</ic type> <elem mask>517632</elem mask> </operand </LD> //PLsY指令的定义 <PLSY> Kins type>2</ins type> <Codc>61668</Cod⊙> Operand rum>3</operand num> Operand id=0"> <data type>16</data type> <io type>0</io type> <elem mask>3071</elem mask> </operand> operand id=1 <data type>16</data type> <io typc>0</ic typc> Kelem mask>3071</elem mask> K/operand> Operand id="2"> data type>l</data type> <io type>1</ic type> <elem mask>16384</elem mask> </oper /PLSY> /常数类型的定义 <C○NST> <elem type>1</elem type <data typc>62</data typc> Addr type>1</addr type> Addr subt ype>c</addr subtype> Kelem rwattr>o</elem rwattr> </CONST> //x元件的定义 <X> Kelem type>8192</elem type> <data type>1</data type> <addr type>3</addr type> <addr subtype>1</addr subtype> Kelem rwattr>0</elem rwattr> </X> Y元件的定义 <Y> Kelem type>16384</elem type> <data type>1</data type> Addr type>3</addr type> <addr subtype>2</addr subtype> Kelem rwattr>2</elem rwattr> </Y> //D元件的定义 <D> <elem type>128</elem type> <data type>62</data type> <addr type>3</addr type? Addr subtype>17</addr subtype> <elem rwattr>2</elem rwattr /D> 6.3编译后的指令码(16进制,共10步,20个字节) 1004 F0E40002000027101100006400C002000001

...展开详情
img
duanduanr

关注 私信 TA的资源

上传资源赚积分,得勋章
最新资源