您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 编译原理——词法分析代码
  所属分类: C/C++
  开发工具:
  文件大小: 83kb
  下载次数: 0
  上传时间: 2011-05-28
  提 供 者: zl0****
 详细说明: ⒈ 题目 编写前述PASCAL子集的词法分析程序。 1)主程序设计考虑,(参阅后面给出的程序框架) 主程序的说明部分为各种表格和变量安排空间。 数组k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字后面补空格。 P 数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在p表中(学生编程时,应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id 和ci 数组分别存放标识符和常数。 instring 数组为输入源程序的单词缓存。 outtoken 记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k 表;再输入分界符等造 p 表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。 2)词法分析过程考虑 该过程取名为 lexical,它根据输入单词的第一个字符(有时还需读第二个字符),判断单词类,产生类号:以字符k表示关键字;i表示标识符;c 表示常数;p 表示分界符;s 表示运算符(学生编程时类号分别为1,2,3,4,5)。 对于标识符和常数,需分别与标识符表和常数表中已登记的元素 相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组 id 中,将常数变为二进制形式存入数组中 ci 中,并记录其在表中的位置。 lexical 过程中嵌有两个小过程:一个名为 getchar,其功能为从 instring 中按顺序取出一个字符,并将其指针 pint 加 1 ;另一个名为 error,当出现错误时,调用这个过程,输出错误编号。 将词法分析程序设计成独(入口)立一遍扫描源程序的结构。其流程图见图5-1。 图5-1 词法分析程序流程图 ⒉ 要求 ⑴ 所有识别出的单词都用两个字节的等长表示,称为内部码。第一个字节为 t ,第二个字节为 i 。 t 为单词的种类。关键字的 t=1;分界符的 t=2;算术运算符的 t=3;关系运算符的 t=4;无符号数的 t=5;标识符的 t=6。i 为该单词在各自表中的指针或内部码值。表 5-1 为关键字表;表 5-2 为分界符表;表 5-3 为算术运算符的 i 值;表 5-4 为关系运算符的 i 值。 表5-1 关键字表 表5-2 分界符表 指针1 关键字 指针1 分界符 0 BEGIN 0 , 1 DO 1 ; 2 ELSE 2 . 3 END 3 := 4 IF 4 ( 5 THEN 5 ) 6 VAR 7 WHILE 表5-3 算术运算符 表5-4 关系运算符 i 值 算术运算符 i 值 关系运算符 00H < 10H + 01H <= 11H - 02H = 20H * 03H > 21H / 04H >= 05H <> 常数表和标识符表是在编译过程中建立起来的。其 i 值是根据它们在源程序中出现的顺序确定的。 ⑵ 常数分析程序、关键字和标识符分析程序、其他单词分析程序请参阅范例自行设计。 ⑶ 本实践题可通过扩充下面给出的程序框架完成。 PROGRAM plexical(input,output); LABEL l; CONST keylen=10; identlen=10; TYPE //定义的类型 tstring=ARRAY[1..identlen] OF char; outreco=RECORD//记录为输出内部表示缓存。 ty: char; point: integer; END; {outreco} VAR cip,ip,pint,i,j,l,m,errorx:integer; charl:CHAR; ci:ARRAY[1..10] OF integer; k,id:ARRAY[1..keylen] OF tstring; token:tstring; //标志符 outtoken:outreco; instring:ARRAY[1..10]OF char; p:ARRAY[1..16] OF ARRAY [1..2] OF char; PROCEDURE lexical; VAR l,m,num:integer; b: boolean; PROCEDURE getchar; BEGIN charl:=instring [pint] ; pint:=pint+1 END; {getchar} PROCEDURE error; BEGIN writeln('error',errorx) END;{error} BEGIN FOR 1:=1 TO identlen DO token[1]:=' '; getchar; WHILE char1=' ' DO getchar; IF char1 IN ['a'..'z'] THEN BEGIN /*处理标识符*/ m:=1; WHILE (char1 IN ['a'..'z']) OR (char1 IN ['0'..'9']) DO BEGIN IF m<=identlen THEN BEGIN token[m]:=char1; m:=m+1 END; getchar END;{while} pint:=pint-1; 1:=1; b:=false; WHILE (1<=keylen) AND (NOT b) DO BEGIN b:=true; i:=1; WHILE (i<=identlen) AND b DO IF k[1] [i]=token[i] //判断是否为关键字 THEN i:=i+1 ELSE b:=false; IF NOT b THEN l:=l+1 END IF 1<=keylen //关键字则记录下来 THEN BEGIN outtoken.ty:='k'; outtoken.point:=1 END ELSE BEGIN l:=1; b:=false; WHILE (l<=ip) AND (NOT b ) DO BEGIN b:=true; i:=1; WHILE (i<=identlen) AND b DO IF id[1][i]=token[i] THEN i:=i+1 ELSE b:=false; IF NOT b THEN l:=l+1; END; IF NOT b THEN l:=l+1; IF 1>ip THEN BEGIN ip:=ip+1; FOR m:=1 TO identlen DO id[ip][m]:=token[m]; outtoken.ty:='i'; outtoken.point:=1 END END END ELSE IF char1 IN ['0'..'9'] THEN BEGIN 处理常数 END{integer} ELSE IF char1 IN [',',';','.',':','(',')'] THEN BEGIN 处理分界符 END ELSE IF char IN ['+','-','*','/','.','<','=','>'] THEN BEGIN 处理运算符 END ELSE BEGIN errorx : =2; error END END; {lexica1} BEGIN writeln ('k-table, input!'); FOR 1:=1 TO keylenDO FOR m:=1 TO identlenDO read (k[1] [m] ); readln ; FOR l:=1 TO identlen DO id [1] [m]:=' '; writeln ('p-table, input!'); FOR l:=1 TO 11 DO FOR m:=1 TO 2 DO read(p[l] [m]); readln; ip:=0; cip:=1; pint:=1; l: writeln('source, input!'); FOR j:=1 TO identlen DO Read (instring[j] ); lexical; writeln (outtoken.ty); writeln (outtoken. point); FOR l:=1 TO identlen DO write (token[ 1 ]); writeln; GOTO 1 END. ...展开收缩
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 输入关键字,在本站1000多万海量源码库中尽情搜索: