好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

编译原理词法分析和语法分析报告 代码(c语言版).pdf

21页
  • 卖家[上传人]:第***
  • 文档编号:61594811
  • 上传时间:2018-12-05
  • 文档格式:PDF
  • 文档大小:299.36KB
  • / 21 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 西 南 交 通 大 学 编译原理课程设计报告编译原理课程设计报告 系(院)系(院):信息科学与技术学院 专专业业:软件工程 班班级级:软件二班 姓姓名名:吴任杰学学号号:20103132 指导教师指导教师:丁光耀 2012 年年12 月月14 日日 词法分析词法分析 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解 二、实验要求 2.1 待分析的简单的词法 (1)关键字: beginifthenwhiledoend 所有的关键字都是小写 (2)运算符和界符 : =+-*/==; ()# (3)其他单词是标识符(ID)和整型常数(SUM) ,通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成空格一般用来分隔 ID、SUM、运算符、界符 和关键字,词法分析阶段通常被忽略 2.2 各种单词符号对应的种别码: 表 2.1 各种单词符号对应的种别码 单词符号种别码单词符号种别码 bgin1:17 If2:=18 Then321 do523 lettet(letter|digit)*10=24 dight dight*11=25 +13;26 —14(27 *15)28 /16#0 2.3 词法分析程序的功能: 输入:所给文法的源程序字符串。

      输出:二元组(syn,token 或 sum)构成的序列 其中:syn 为单词种别码; token 为存放的单词自身字符串; sum 为整型常数 例如:对源程序 begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如 下序列: (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)…… 三、词法分析程序的算法思想: 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号, 其基本思想 是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号 3.1 主程序示意图: 主程序示意图如图 3-1 所示其中初始包括以下两个方面: ⑴ 关键字表的初值 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表) ,当扫描程 序识别出标识符时,查关键字表如能查到匹配的单词,则该单词为关键字,否则为一般标 识符关键字表为一个字符串数组,其描述如下: Char *rwtab[6] = {“begin”, “if”, “then”, “while”, “do”, “end”,}; 否 是 图 3-1 (2)程序中需要用到的主要变量为 syn,token 和 sum 3.2 扫描子程序的算法思想: 首先设置 3 个变量:①token 用来存放构成单词符号的字符串;②sum 用来整型单词;③ syn 用来存放单词符号的种别码。

      扫描子程序主要部分流程如图 3-2 所示 是是 置初值 调用扫描子程序 输出单词二元组 输入串结束 结束 变量初始化 忽略空格 是否文件结束? 返回 否 字母 数字其他 运算符、符号 界符等符号 否 是 图 3-2 四、词法分析程序的 C 语言程序源代码: #include #include char prog[80],token[8],ch; int syn,p,m,n,sum; char *rwtab[6]={“begin“,“if“,“then“,“while“,“do“,“end“}; scaner(); main() {p=0; printf(“\n please input a string(end with '#'):/n“); do{ scanf(“%c“, prog[p++]=ch; }while(ch!='#'); p=0; do{ scaner(); switch(syn) {case 11:printf(“( %-10d%5d )\n“,sum,syn); break; case -1:printf(“you have input a wrong string\n“); 拼数 syn=11 返回 对不同符号给 出相应的syn值 报错 拼字符串 是否关键字? syn 为对应关键字的 单词种别码 syn=10 getchar(); default: printf(“( %-10s%5d )\n“,token,syn); break; } }while(syn!=0); getch(); } scaner() {sum=0; for(m=0;m='a'))||((ch='A'))) { while(((ch='a'))||((ch='A'))||((ch='0') ch=prog[p++]; if(ch=='=') { syn=24; token[m++]=ch; } else { syn=23; p--; } break; case '+': token[m++]=ch; ch=prog[p++]; if(ch=='+') { syn=17; token[m++]=ch; } else { syn=13; p--; } break; case '-':token[m++]=ch; ch=prog[p++]; if(ch=='-') { syn=29; token[m++]=ch; } else { syn=14; p--; } break; case '!':ch=prog[p++]; if(ch=='=') { syn=21; token[m++]=ch; } else { syn=31; p--; } break; case '=':token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=25; token[m++]=ch; } else { syn=18; p--; } break; case '*': syn=15; token[m++]=ch; break; case '/': syn=16; token[m++]=ch; break; case '(': syn=27; token[m++]=ch; break; case ')': syn=28; token[m++]=ch; break; case '{': syn=5; token[m++]=ch; break; case '}': syn=6; token[m++]=ch; break; case ';': syn=26; token[m++]=ch; break; case '\“': syn=30; token[m++]=ch; break; case '#': syn=0; token[m++]=ch; break; case ':':syn=17; token[m++]=ch; break; default: syn=-1; break; } token[m++]='\0'; } 五、结果分析: 输入 begin x:=7;end # 后经词法分析输出如下序列:(begin1)(x10)(:17)(=18)(9 11)(;26)(end10)(#0)如图 5-1 所示: 图 5-1 六、总结: 词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号, 其基本 思想是根据扫描到单词符号的第一个字符的种类, 拼出相应的单词符号。

      通过本试验的完成, 更加加深了对词法分析原理的理解 解释程序实现解释程序实现 本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分 析和语义分析生成中间代码(四元式) ,编译程序的重点放在中间代码生成阶段 编译程序的输出结果包括词法分析后的二元式序列、变量名表;语法分析后的状 态栈分析过程显示;语义分析生成中间代码后的四元式程序整个程序分为三个 部分: (1) 词法分析部分 (2) 语法分析、语义分析及四元式生成部分 (3) 输出显示部分 1..词法分析器设计词法分析器设计 词法分析器的功能是输入源程序,输出单词符号我们规定输出的单词符号 格式为如下的二元式: (单词种别编码,单词自身的值) 由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输 入错误的检查 1.1单词符号的内部定义及在编译程序中的定义单词符号的内部定义及在编译程序中的定义 我们对常量、变量、临时变量、保留关键字(if、while、begin、end、else、 then、do 等) 、关系运算符、逻辑运算符、分号、括号等,规定其内部定义如下: 符号种别编码说明 sy_if0保留字if sy_then1保留字then sy_else2保留字else sy_while3保留字while sy_begin4保留字begin sy_do5保留字do sy_end6保留字end a7赋值语句 semicolon8“ ; ” e9布尔表达式 Jinghao10“ # ” S11语句 L12复合语句 Tempsy15临时变量 EA18B and(即布尔表达式中的 B∧) EO19B or(即布尔表达式中的 B∨ ) Plus34“ + ” Times36“ * ” Becomes38“ := ” 赋值 Op_and39“ and ” Op_or40“ or ” Op_not41“ not ” Rop42关系运算符 Lparent48“ ( ” Rparent49“ ) ” Ident56变量 Intconst57整常量 #definesy_if0 #definesy_then1 #definesy_else2 #definesy_while3 #definesy_begin4 #definesy_do5 #definesy_end6 #definea7 #definesemicolon8 #definee9 #definejinghao10 #defineS11 #defineL12 #definetempsy15 #defineEA18/*E and*/ #defineE019/E or*/ #defineplus34 #definetimes36 #definebecomes38 #defineop_and39 #defineop_or40 #defineop_not41 #definerop42 #definelparent48 #definerparent49 #defineident56 #defineintconst57 1.2变量及数据结构说明变量及数据结构说明 编译程序中涉及到的变量及数据结构说明如下: char ch='\0';/*从字符缓冲区读取当前字符*/ int count=0;/*词法分析结果缓冲区计数器*/ staticchar spelling[10]={““};/*存放识别的字*/ staticchar line[81]={““};/*一行字符缓冲区,最多 80 个字符*/ char *pline;/*字符缓冲区指针*/ staticchar ntab1[100][10];/*变量名表,共 100 项,每项长度 10*/ struct rwords{ char sp[10]; int sy; };/*保留字表的结构,用来与输入缓冲区中的单词进行匹配*/ struct rwords reswords[10]={{“if“,sy_if}, {“do“,sy_do}, {“else“,sy_else}, {“while“,sy_while}, {“then“,sy_then}, {“begin“,sy_begin}, {“end“,sy_end}, {“and“,op_and}, {“or“,op_or}, {“not“,op_not}};/*保留字表初始化,大小为 10*/ struct aa{ int sy1;/*存放单词的种别编码*/ int pos;/*存放单词自身的值*/ }buf[1000];/*词法分析结果缓冲区*/ intn。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.