CMM解释器项目文档_第1页
CMM解释器项目文档_第2页
CMM解释器项目文档_第3页
CMM解释器项目文档_第4页
CMM解释器项目文档_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CMM解释器项目文档一、背景完成小组的基本信息:姓名学号分工内容蔡武庆2013302580148语义分析 中间代码周子鹏2013302580149界面设计 解释执行刘宏勇2013302580151词法语法 代码调试二、文法描述给出所实现的CMM语言的完整的文法描述词法/* CMM中的空白符 */SKIP: " " | "r" | "t" | "n"/* CMM中的注释符号(需要进行匹配查找) */MORE: "/*":IN_MULTI_LINE_COMMENT/* 注释符号不用被编译,是特殊符号

2、 */<IN_MULTI_LINE_COMMENT>SPECIAL_TOKEN: <MULTI_LINE_COMMENT:"*/">:DEFAULT/* 在注释符号之间可以输入任意字符 */<IN_MULTI_LINE_COMMENT>MORE: <>/* CMM中的保留字 */TOKEN: <ELSE:"else"> | <IF:"if"> | <INT:"int"> | <READ:"read">

3、 | <REAL:"real"> | <WHILE:"while"> | <WRITE:"write">/* CMM中的常数 */TOKEN: <INTEGER_LITERAL:/十进制整数<DECIMAL_LITERAL>> | <#DECIMAL_LITERAL:("1"-"9"("0"-"9")* | "0")> | <REAL_LITERAL:/十进制

4、实数(<DECIMAL_LITERAL>)+("."(<DECIMAL_LITERAL>)+)?>/* CMM中的标识符(由数字、字母和下划线组成的串,但必须以字母开头、且不能以下划线结尾的串) */TOKEN: <IDENTIFIER:<LETTER>(<LETTER> | <DIGIT> | "_")*(<LETTER> | <DIGIT>)+)?> | <#LETTER:("a"-"z" | "

5、;A"-"Z")> | <#DIGIT:"0"-"9">/* CMM中的分隔符 */TOKEN: <LPAREN:"("> | <RPAREN:")"> | <LBRACE:""> | <RBRACE:""> | <LBRACKET:""> | <RBRACKET:""> | <SEMICOLON:"&

6、quot;>/* CMM中的运算符 */TOKEN: <ASSIGN:"="> | <LT:"<"> | <EQ:"="> | <NE:("<>")> | <PLUS:"+"> | <MINUS:"-"> | <TIMES:"*"> | <OVER:"/">语法非终结符列表:<Program> /程序<

7、;Statement> /语句<InputStm> /输入语句<OutputStm> /输出语句<IfStm> /if语句<WhileStm> /while语句<VarDeclaration> /变量声明语句<Assignment> /赋值语句<Block> /复合语句<Expression> /表达式<Term> /项<Factor> /因子<Variable> /变量<Constant> /常量<Array>/数组BNF范式列表:

8、<Program>:(<Statement>)*<Statement>:<InputStm>|<OutputStm>|<IfStm>|<WhileStm>|<VarDeclaration>|<Assignment>|<Block>|<SEMICOLON><InputStm>:<READ><LPAREN><Variable> (<COMMA><Variable>)*<RPAREN>&

9、lt;SEMICOLON><OutputStm>:<WRITE><LPAREN><Expression><RPAREN><SEMICOLON><IfStm>:<IF><LPAREN><Expression><RPAREN> <Statement>(<ELSE> <Statement>)*<WhileStm>:<WHILE><LPAREN><Expression><RPA

10、REN> <Statement><VarDeclaration> :(<INT>|<REAL>)<Variable>(<ASSIGN><Expression>)?(<COMMA><Variable>(<ASSIGN><Expression>)?)<SEMICOLON><Assignment>:<Variable><ASSIGN><Expression><SEMICOLON><Blo

11、ck>:<LBRACE>(<Statement>)*<RBRACE><Expression>:<Term>(<PLUS>|<MINUS>|<LT>|<GT>|<EQ>|<NE>)<Term>)*<Term>: <Factor>(<TIMES>|<OVER>)<Factor>)*<Factor>: <LPAREN><Expression><RPAR

12、EN>|<Variable>|<Constant><Variable>:<ID>|<Array><Constant>: (<MINUS>|<PLUS>)?<INTEGER_LITERAL>|<REAL_LITERAL><Array>:<ID><LBRACKET><Expression><RBRACKET>三、系统分析和设计包括系统的概要设计、详细设计和核心算法说明及分析,系统所采用的开发工具等。词法 1. 先将

13、Token按要求划分成常数(包括十进制整数和十进制实数)、保留字、注释、 特殊符号(操作符和分隔符)、特殊Token几大类; 2. 逐行扫描,将每行的字符串转换为字符型的数组,其中剔除空白符号(比如空格); 3. 逐字扫描,根据构造的DFA,完成读入字符后状态的跳转,并在到达终态时确定所 读入的Token的类型,必要时还要记录Token的字符串形式以备将其打印出来; 4. 根据对Token的处理,选择不同的打印形式,有以下几种:打印出错信息、打印操 作符和分隔符、打印关键字、打印常数、打印标识符、打印注释内容。主要有以下几个方法:1./* 启动逐行的词法分析*/ public string r

14、un(string text)2./* 检查读入的当前标识符是否为保留字,如果是则把标识符类型从ID改为相应的保留字类型*/ public TokenType reservedWordScan(string word) 3./* 启动逐标识符的词法分析*/ public void getToken() 4./* 处理Token,按要求输出*/ public string tokenstrOutput(TokenStr tokS) 语法 采用递归下降的语法分析方法,并构造出抽象语法树。 语法树的节点中有三个属性:节点类型、节点名字、子节点链表(孩子链表)。 语法分析步骤:1. 首先从词法分析的结

15、果(一个ArrayList)中获取各种终结符,但同时剔除掉一些注释、空格符、有错误标记的Token等特殊Token,将有待语法分析的终结符放入wordAl(ArrayList类型)中;2. 为每个非终结符提供一个处理其逻辑的函数,通过函数分析对应非终结符的产生式,并将结果保存为节点添加到抽象语法树上合适的位置。通过每个函数的递归调用最后就可以产生整个程序的抽象语法树。根节点为Program;3. 打印语法树,采用前序遍历的方式将节点中的str成员打印出来,一旦出现语法错误就将错误处理信息直接附在str中。主要有以下几个方法:1./* 启动逐Token的语法分析 */ public string

16、 run(ArrayList tokenAL) 2./* 打印语法树 */ public string dump(Node node, string space)3./* 匹配单词 */ public void match(Scanner.TokenType type) public void match(string s)PS:对应每个语法树节点都有一个相应的处理方法,例如:对于分析赋值语句有ParseAssignment方法,对于分析变量有ParseVariable方法。每个方法的返回类型都是Node,也就是调用后都会生成一个相应的语法树结点。4.5.6. 语义利用符号表在语法分析的基础上

17、,主要检查了以下几种语义错误,并同时生成了中间代码。检测的语义错误:1. 使用了未定义的变量;2. 在同一层对变量进行了重复定义;3. 声明的数组长度不为正整数;注:1. 由于每个声明之后会自动得到初始值0,所以不存在变量声明后未初始化就使用的问题。2. 本程序中检查类型的转换只是会在real类型转换为int类型时有精读丢失,但不将其定义为语义错误。在生成的语法树基础上,具体在类GramParser中实现:主要有以下几个方法:1./* 在总表中查询某变量,如果找到返回该符号表项,否则返回null */ public SymItem LookUp(string s) 2./* 检查当前符号表中是

18、否已经存在该变量名,以防止在同一层对变量重复定义;如果重复定义,则返回false,否则返回true */ bool Check(string str)3./* 匹配单词 */符号表若干张符号分表构成一个链式栈的符号总表,每一张符号分表都是一个由若干符号表项组成的链表,对应着某一个块域,管理同一个层里的所有变量,每个符号表项对应该层内的一个变量或者一个数组元素。符号表项一共有三个属性:名字、类型和值。程序中含有两个类:SymItem和Symtable,分别对应着符号表项和符号分表。中间代码说明:表示当前值, 具体在类GramParser中实现,该类中有一个string类型的链表intercode

19、,用于存放生成的中间代码。另外有一个gen方法,将输入的字符串存入intercode链表。1. 输入语句gen("read", item.Type.ToString(), "_", item.Name);2. 输出语句gen("write", ”result”, "_", "outstream");3. If语句设置一个整数变量ifLevel,用于记录if语句镶嵌层次gen("judge", "if", "result&quo

20、t;, ifLevel.ToString();gen("judge", "if", "start",  ifLevel.ToString();gen("mark", "if", "end", ifLevel.ToString(); gen("judge", "else", "start", ifLe

21、vel.ToString();gen("mark", "else", "end",  ifLevel.ToString();4. While语句设置一个整数变量whileLevel,用于记录while语句镶嵌层次gen("mark", "while", "begin", whileLevel.ToString();gen("judge", "while",&

22、#160;"result", whileLevel.ToString();gen("mark", "while", "end", whileLevel.ToString();5. 赋值语句 gen("assign", item.Type.ToString(), "result", item.Name);6. 声明语句在获得int或者real关键字后,登录符号表,创建一个符号表项: gen("new

23、", "item", "_", "table")然后对生成的item的类型进行相应的赋值: gen("assign", "type", "INT", "item")或者gen("assign", "type", "REAL", "item");如果存在赋值,则在进行赋值操作:gen("assign", "type", tempT

24、ype.ToString(), "item");7. 表达式gen("lt", num2.ToString(), num1.ToString(), value);gen("gt", num2.ToString(), num1.ToString(), value);gen("eq", num2.ToString(), num1.ToString(), value);gen("ne", num2.ToString(),

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论