编译原理

编译原理词法分析器

牧云@^-^@ 提交于 2019-11-29 20:30:57
直接上代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <string> 4 #include <iostream> 5 #include <map> 6 #include <algorithm> 7 using namespace std; 8 9 map<string,int>mp_res; 10 map<string,int>mp_oper; 11 map<char,int>mp_dili; 12 string pre=""; 13 14 int flag1=false,flag2=1;//flag1用作判断/*或*/是否在引号内,flag2判断内容是否处于注释状态 15 string mstr,flagstr,ansstr=""; 16 17 string double_slash(string s)//双斜杠注释处理 18 { 19 string ans=""; 20 bool flag=false;//判断//是否在双引号内作为字符串 21 for(int i=0;i<s.length();i++) 22 { 23 if(s[i]=='/'&&s[i+1]=='/'&&i+1<s.length()&&!flag) 24 break; 25 if(s[i]==34) 26 flag=!flag; 27 ans+

编译原理——词法分析器

时间秒杀一切 提交于 2019-11-29 20:30:46
1.词法分析器的主要工作 (1)从源程序文件中读入字符。 ( 2)统计行数和列数用于错误单词的定位。 ( 3)删除空格类字符,包括回车、制表符空格。 ( 4)按拼写单词,并用(内码,属性)二元式表示。 (属性值——token 的机内表示) ( 5)如果发现错误则报告出错 ( 6)根据需要是否填写标识符表供以后各阶段使用 2.单词的基本分类 关键字:由程序语言定义的具有固定意义的标识符。也称为保留字例如if、 for、 while、 printf ; 单词种别码为 1。 标识符:用以表示各种名字,如变量名、数组名、函数名; 常数: 任何数值常数。如 125, 1,0.5,3.1416; 运算符: +、 -、 *、 /; 关系运算符: <、 <=、 = 、 >、 >=、 <>; 分界符: ;、,、(、)、 [、 ]; 3.有限状态机 4.程序流程图 5.以下为完整代码 //compiler #include<iostream> #include<ctype.h> #include<cstring> #include<cstdio> using namespace std; const char *k[12] = {"for","if","else","do","while","return","int","char","short","float","double","string"}

编译原理之词法分析器(一)

此生再无相见时 提交于 2019-11-29 20:30:32
由于时间太少,偶尔才花点时间谢谢这个,废话不多说,下面来简单讲解下词法分析器的实现过程。 一下内容包括: 1:讲解简单词法分析器的实现 2:用C语言验证 注意:词法分析器可以用在命令解释器上,原理是一样的。 首先词法分析器的任务就是识别单词的属性,比如在编程语言中是关键字还是标识符或者是数字等等,这些工作就是词法分析需要做的。 下面我们来通过一个非常简单的例子来说明如何让构建。 假设现在又一下关键字需要识别,其id号已经做了下面规定,如果待检测的单词不在其中,则视为标识符,并保存其标识符,如果在其中,则输出id号。 关键字 ID uint8 1 uint16 2 uint32 3 int8 4 int16 5 int32 6 if 20 for 21 while 22 switch 23 case 24 goto 25 那么如何来识别出单词呢? 一个简单粗暴的方法就是直接判断,我们将其全部定义为字符串, 一个一个判断,这种方式最简单易懂,但是这种方式的效率极低 ,效率低的原因就是每次对其进行遍历,从头开始匹配,如果匹配返回,如果不匹配,继续下一个,这样时间并不确定,而且在最坏情况下的时间复杂度为O(N)。如果将其在嵌入式上面用过命令解释器,基本不可靠。所以下面来说在利用状态机实现该过程,时间复杂度为O(1),即不管输入那种类型,只需要一次便可得到输出结果,并不需要反复遍历

#编译原理# 文法和内容(二)

偶尔善良 提交于 2019-11-29 17:35:18
文法和内容 编译原理笔记第二部分,内容参考:北航软院教师邵兵课堂课件及内容、张莉著《编译原理及编译程序构造》、国防工业出版社的《编译原理——学习指导与典型题解析》、 AlvinZH的学习笔记 以及个人理解 目前是包含了全部内容的版本,后续会推出精简版和复习知识点版 如有建议或错误错误欢迎在评论中指出或联系我:QQ:847590417 阅读目录 本章内容 2.1 形式语言基础 2.2 文法的非形式讨论 2.3 文法和语言的形式定义 2.4 语法树和二义性文法 2.5 句子的分析 2.6 有关文法的实用限制 2.7 文法的其他表示法 2.8 文法和语言分类 习题内知识 本章内容 重点:符号串、符号串集合的计算、文法、语言、递归、短语、句柄、语法树、文法的二义性、文法的使用限制、BNF表示文法、语法图、文法的分类。 2.1 形式语言基础 一、字母表和符号串 字母表:符号的非空有限集 符号:字母表中的元素 符号串:由符号拼接成的有穷序列 空符号串:没有任何符号的符号串 符号串的形式定义: 假设有一个字母表P:1.空符号串是P上的符号串;2.若x是P上的符号串,且a是字母表里的一个元素,则ax或xa(可以左,可以右,但只能一个不能同时加)是P上的符号串(一个符号也是符号串,a拼接ε);3.y是P上的符号串,当且仅当(iff)y是符合1.和2.的符号串。 二、符号串和符号串集合的运算 1

编译原理——LL1分析程序实验(C#)

依然范特西╮ 提交于 2019-11-29 16:43:53
LL(1)分析程序实验目的与要求   编制一个能识别由词法分析给出的单词符号序列是否是给定文法的正确句子(程序),输出对输入符号串的分析过程。 实验内容   对于这个实验,核心内容是Process类。该类是一个带有三个参数的构造函数。将初始分析栈,输入的句子,预测分析表作为参数注入该类,调用BeginAnalyze()函数进行分析,同时Process本身属性在函数的循环中发生迭代变化,其自身的属性代表了每一分析步骤的结果,打印即可。 实验步骤 主函数内容:先打印出给定文法,预测分析表,然后对用户输入,构造Process类,进行分析。 获取推导所用的产生式或匹配:GetProductionRule() 需要调用GetRowIndex(StackTop)和 GetColIndex(Terminal)根据分析栈的栈顶元素与输入字符串首字符来获取预测分析表的内容。 反转字符串函数 Reverse(string s):该函数用于将产生式元素逆序入栈 private string Reverse(string s) { char[] cs= s.ToCharArray(); Array.Reverse(cs); return new string(cs); }   值得一提的是本程序并没有使用Stack数据结构来完成,而是使用了对字符串的操作来代替Stack。 using System;

编译原理——LR(1)分析程序(C#)

谁说我不能喝 提交于 2019-11-29 16:43:49
LR(1)分析程序实验目的与要求   编制一个允许规范族有冲突的项目集用向前查看一个符号的办法来进行处理,并且能够解决存在的无效归约问题,以解决冲突的分析过程。 实验内容 本次实验最主要的部分构建语法分析表,理解分析表的使用,明确分析步骤。 本次实验主要用到的数据结构有List, Stack,二维数组等。 根据用户输入,给出分析过程。 实验步骤 Main函数:在while循环中,根据状态栈栈顶元素,输入字符串的首字符,查询Action表,根据其值判断分析是否结束。未结束,则分为成功,移进,规约三种状态进行分析。 主要函数介绍: 根据S后的数字,获取产生式右部:static string GetRight(int n) 打印分析步骤:Display(string inputString,string action,string Go) 用于将状态栈,符号栈的内容逆序转化成字符串:GetStringFromStack(Stack stack) 根据终结符查找其在Vt表的位置:GetIndexByTerminalOnVt (char target) 根据非终结符查找其在Vn表的位置:GetIndexByNonTerminalOnVt (char target) 实验中遇到的问题:   因为不需要通过编程的方式构建分析表,所以我觉得本次实验的难点主要在于分析表的使用

编译原理第二次作业9.11

给你一囗甜甜゛ 提交于 2019-11-29 10:19:51
1.理解符号串与集合运算。 L={A,B, … ,Z,a,b, … ,z} D={0,1, … ,9} 说明下表示的含义: LUD: 全部字母和数字在集合 LD :由一个字母后跟一个数字组成的所有符号串的集合 L4 :由 4 个字母组成的所有符号串集合 L* :由字母组成的所有符号串的集合 D+ :由一个或若干个数字组成的所有符号串集合 L(LUD)* 以字母开头,后跟字母、数字组成的所有符号串的集合 文法 G(Z):Z->aZb|ab定义的是什么样的语言? 答: 因为 Z->aZb 所以 Z->aaZbb 因为 Z->ab 所以 Z-> aabb 又因为 Z->aZb 所以 aaZbb->aaabbb 又因为 Z->ab 所以 aabb->aaabbb L ( G ) ={anbn 丨 n>=1} 因此定义 L ( G )定义的是 a n b n 3.写出教材22页例2.2中标识符的文法四元组形式(VN,NT,P,S)。 有文法 G=(Vn,V t ,P,S)    Vn ={L( 标识符 ) , D( 字母 ) , H( 数字 )} , V t ={a,b,c,d,~~~,y,z,0,1,2,~~~,9}       P={    <L>-><D>      <L>-><L><D>      <L>-><L><H>      <D>->a      <D>->b      <D

编译原理第二次作业

◇◆丶佛笑我妖孽 提交于 2019-11-29 09:52:39
1.理解符号串与集合运算。 L={A,B, … ,Z,a,b, … ,z} D={0,1, … ,9} 说明下表示的含义: LUD:所有大小写字母和数字的集合 LD:由一个字母和一个数字组成的所有符号串的集合 L4:由四个字母组成的符号串的集合 L*:ξ和由字母组成的所有符号串的集合 D+:由一个或若干个数字组成的所有符号串 L(LUD)*:以字母开头,后面是所有字母和数字组成的所有符号串的集合 2.文法G(Z):Z->aZb|ab定义的是什么样的语言?   产生式:Z->aZb, Z->ab   推导出:Z->aZb->aaZZbb->aaaabbbb   定义的语言为:由若干个a后跟若干个b组成的所有符号串集合,且a的个数等于b的个数。 3.写出教材22页例2.2中标识符的文法四元组形式(VN,VT,P,S)。 设I为标识符,L为字母,D为数字 VN {I,L,D},VT{a,b,c,...x,y,z,0,1,2,...9} P={ I-> L| IL |ID L->a|b|c|d|...|z D->0|1|2|3|...|9 } S= I 4.写出下列表达式的最左推导、最右推导。 G(E): E=> E + T | T T=>T * F | F F=>(E)| i i*i+i i+i*i i+(i+i) 注意观察最左和最右推导过程的不同。 i*i+i 最左推导:E=>E+T=

编译原理作业2

混江龙づ霸主 提交于 2019-11-29 09:44:11
1.理解符号串与集合运算。 L={A,B, … ,Z,a,b, … ,z} D={0,1, … ,9} 说明下表示的含义: LUD:全部的字母和数字的集合 LD:由字母后面跟数字组成的字符串的集合 L4:由四个字母组成的符号串的集合 L*:由所有字母组成的符号串的集合 D+:由一个或若干个数字组成的所有符号串集合 L(LUD)*:以字母开头,后跟字母、数字组成的所以符合串的集合 2.文法G(Z):Z->aZb|ab定义的是什么样的语言? 答:由题意得: 1、Z->aZb 2、Z->aZb,得 Z=>aZb=>a²Zb²...=>aⁿ﹣¹Zbⁿ﹣¹=>aⁿbⁿ 所以语言为L(G[Z])={aⁿbⁿ|n≥1} 3.写出教材22页例2.2中标识符的文法四元组形式(VN,VT,P,S)。 答:I->L|TL|TD L->a|b|c|...|z D->0|1|...|9 S= 4.写出下列表达式的最左推导、最右推导。 G(E): E=> E + T | T T=>T * F | F F=>(E)| i i*i+i i+i*i i+(i+i) 注意观察最左和最右推导过程的不同。 答:1、i*i+i最左推导: E=>E+T=>T+T=>T*F+T=>F*F+T=>i*F+T=>i*i+T=>i*i+F=>i*i+i    最右推导: E=>E+T=>E+F=>E+i=>T+i=>T*F+i=>T

编译原理作业2

雨燕双飞 提交于 2019-11-29 09:41:06
1.理解符号串与集合运算。 L={A,B, … ,Z,a,b, … ,z} D={0,1, … ,9} 说明下表示的含义: LUD:全部的字母和数字的集合 LD:由字母后面跟数字组成的字符串的集合 L4:由四个字母组成的符号串的集合 L*:由所有字母组成的符号串的集合 D+:由一个或若干个数字组成的所有符号串集合 L(LUD)*:以字母开头,后跟字母、数字组成的所以符合串的集合 2.文法G(Z):Z->aZb|ab定义的是什么样的语言? 答: 由题意得: 1、Z->aZb 2、Z->aZb,得 Z=>aZb=>a²Zb²...=>aⁿ﹣¹Zbⁿ﹣¹=>aⁿbⁿ 所以语言为 L(G[Z])={aⁿbⁿ|n≥1} 3.写出教材22页例2.2中标识符的文法四元组形式(VN,VT,P,S)。 答:I->L|TL|TD L->a|b|c|...|z D->0|1|...|9 S= 4.写出下列表达式的最左推导、最右推导。 G(E): E=> E + T | T T=>T * F | F F=>(E)| i i*i+i i+i*i i+(i+i) 注意观察最左和最右推导过程的不同。 答: 1、i*i+i最左推导: E=>E+T=>T+T=>T*F+T=>F*F+T=>i*F+T=>i*i+T=>i*i+F=>i*i+i    最右推导: E=>E+T=>E+F=>E+i=>T+i=>T*F+i