实验编译原理作业一.docVIP

  • 6
  • 0
  • 约4.43千字
  • 约 10页
  • 2019-01-27 发布于广东
  • 举报
实验编译原理作业一.doc

实验报告 实验Fl期: 年 月 H 星期 实验项目名称 实验项目类型 □演示型 □验证型 □基本训练型 □综合型 □设计型 □提高型 实验指导教师 实验地点 是否分组 小组其他成员 一、实验目的及要求 二、实验使用的主要设备(含软件系统) 三、 实验操作过程及内容 ⑴无符号实数词法分析的思想。 对构成源程序的字符串从左至右逐个字符地对源程序进行扫描,产生单词序列,并用语 言的词法规则识别出一个个具有独立意义的单词符号. ⑵ 无符号实数的文法和根据文法生成的状态转换图(即有穷门动机)。 将G [〈无符号数>]文法转换成有穷自动机: 构造状态矩阵;将有穷自动机的状s, S2……Sn及输入的字a, a2……am构成一个n*m 的矩阵。 入 状态、\ d ■ e 8 +/- 0 1 2 4 1 1 2 4 z 2 3 3 3 4 z 4 6 5 5 6 6 6 z Z 再写一个程序,把状态矩阵用二维数组表示。程序通过输入的字符转换状态,从而可 以识别出单词。 木程序的关键在状态表和缓冲区的运用。首先定义了一个布尔型函数ReadALine把输 入的字符串送到缓冲区中;然后定义了布尔型函数Run和Getchar实现对输入字符串的正 确性判断,更改Run函数可以改变程序功能:如可将状态表改变成识别“偶数”的冇限自 动机的状态表。 ⑶程序处理的流程图 无符号实数的流程图开始 丿结束 无符号实数的流程图 开始 丿 结束 代码实现: include std I i b. h //引入库函数 include std i o. h //引入基本的库函数 #include〈string. h //引入字符串的库函数 //状态表相关存储信息: #def ine STATE_NUMBER 7 //状态数目 #def ine CHAR_NUMBER 4 //输入字符的种类:.;d ; e/E ; +/- #define DOT 0 //输入数字在状态表中位于第0列 #define DIGIT 1 //小数点位于状态表的第1歹IJ #define E 2 //E位于状态表的第2列 #define AD 3 //+/-运算符位于状态表的第3列 //State □ □为状态表,以整数组形式存放,0,1,2, 3, 4,5,6表示状态,-1表示没有此状态 int State [STATE_NUMBER][CHAR_NUMBER] = { {1,2,3,-1}, {-1,4,-1,-1], {1,2,3,-1}, {-1,5,-1,6}, {一1,4, 3, -1}, 1-1,5,-1,-1), {-1,5,-1,-1} }; int Q[STATE_NUMBER]二{0, 0, 1,0, 1, 1,0}; 〃终态标志:0 非终态,1 终态。 i nt i ndex=0; //错误坐标 //缓冲区: //输入缓冲区:由专门函数操作(ReadALineO , GetChar 0) #def ine BUFFER_S I ZE 1000 //表达式缓冲区大小 char Buffer[BUFFER_SIZE]; //表达式缓冲区,以’\0表示结束 int ipBuffer二0; //表达式缓冲区当前位置序号 char ch; //存放取得的一个字符 //函数声明: int Run (); 〃对存储在缓冲区的一行字符串(以*结束)进行运行 void Ini t () ; //全局初始化 int ReadALineO ; //从键盘读一行(没有空格),存于表达式缓冲区Buffer []中 char GetChar (); //从缓冲区取一个字符,返回该字符的同时将它存于全局变量ch中 //主程序: void ma i n () { InitO ; whi I e (ReadALineO) //读一行成功,对它进行判断 { i f (Run 0) //对该行进行运行,看是否能被接受? pr i ntf(The number i s r i ght!\n\rT); e I se { pr i ntf (,zThe number i s error ! \n,z); pr intf C错误位置在第%01个字符! \n\n, index) ; //显示错误位置 } } } //对存储在缓冲区的一行字符串(以结束)进行运行 //返回:如果是无符号定点实数,返回true;否则返回:false int Run() { int S二0; //S存放运行时的当前状态,目前为初态 i ndex二0; while (GetChar () !二*) { i ndex++; if (ch = O ch = 9) //数字 S二State[S] [DIGIT]; //将状态转换成输入数字后的状态 el

文档评论(0)

1亿VIP精品文档

相关文档