文档库 最新最全的文档下载
当前位置:文档库 › 实验一(词法分析)..

实验一(词法分析)..

实验一(词法分析)..
实验一(词法分析)..

南京信息工程大学实验(实习)报告

一.实验目的

1、学会针对DFA转换图实现相应的高级语言源程序。

2、深刻领会状态转换图的含义,逐步理解有限自动机。

3、掌握手工生成词法分析器的方法,了解词法分析器的内部工作原理。

二.实验内容

计算机程序设计语言的编译程序的词法分析部分实现。给出算法的流程图及有穷状态自动机的模型(可以用矩阵或者状态图表示)从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)送给语法分析程序。

为了简化程序的编写,有具体的要求如下:

(1)数仅仅是整数。

(2)空白符仅仅是空格、回车符、制表符。

(3)代码是自由格式。

(4)注释应放在花括号之内,并且不允许嵌套

三.实验要求

要求实现编译器的以下功能:

(1)按规则拼单词,并转换成二元式形式

(2)删除注释行

(3)删除空白符 (空格、回车符、制表符)

(4)列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的记号的二元形式

(5)发现并定位错误

词法分析进行具体的要求:

(1)记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符是每个都一个种类,标示符自己是一类,数字是一类;单词的属性就是表示的字符串值。

(2)词法分析程序当识别一个单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供当前识别出记号的属性值。

(3)标示符和保留字的词法构成相同,为了更好的实现,把语言的保留字建立一个表格存储,这样可以把保留字的识别放在标示符之后,用识别出的标示符对比

该表格,如果存在该表格中则是保留字,否则是一般标示符。(选做)

四.实验步骤

(1)词法分析器的设计方法有如下四个步骤:

1.写出该语言的词法规则。

2.把词法规则转换为相应的状态转换图。

3.把各转换图的初态连在一起,构成识别该语言的自动机。

4.设计扫描器;把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。扫描器从初态出发,当识别一个单词后便进入终态,送出二元式。

词法分析需要一个单词时,扫描器取单词的程序流程图如下:

(2)词法分析器的输出形式

词法分析器输出的单词符号常常表示为二元式:(单词种别,单词符号的属性值)—单词种别通常用整数编码。

—标识符一般统归为一种。

常数按类型(整、实、布尔等)分种。

关键字可视其全体为一种,也可以一字一种。采用一字一种的分法实际处理起来较为方便。

运算符可采用一符一种的方法。

至于界符一般也采用一符一种的分法。

(3)核心代码及其功能

#include "ctype.h"

#include "string.h"

#include "stdio.h"

/*定义一个全局变量,一个全局指针*/

FILE *fp; /*fp是一个指向FILE类型结构的指针变量,可以使fp指向某一个文件的结构变量,从而通过该结构体变量中的文件信息访问该文件*/

int id; /*标志变量,用来标识各类型的ID*/

/*函数声明*/

int search(char searchchar[],int wordtype);

char alphaprocess(char buffer);

char digitprocess(char buffer);

char otherprocess(char buffer);

void error();

/*主函数*/

void main()

{

/*自定义函数的声明*/

char cbuffer;

if ((fp=fopen("example.cpp","r"))==NULL) /*以只读方式打开文件"example.c",NULL在stdio.h文件中已被定义为0*/

printf("error");

else

{

cbuffer=fgetc(fp); /*文件不为空则从文件中取字符*/

while (cbuffer!=EOF) /*EOF文件结束标志*/

{

if(cbuffer==' '||cbuffer=='\n'||cbuffer=='\t') /*掠过空格和回车符*/

{

cbuffer=fgetc(fp);

//id=4;

}

else if(isalpha(cbuffer))

cbuffer=alphaprocess(cbuffer); /*检查cbuffer是否为字母,是则调用alphaprocess()函数*/

else if (isdigit(cbuffer))

cbuffer=digitprocess(cbuffer); /*检查cbuffer是否为数字0~9,是则调用digitprocess()函数*/

else cbuffer=otherprocess(cbuffer); /*非上述两者则调用otherprocess()函数*/ }

}

}

/*主函数结束*/

/*处理读取字符为字母的情况*/

char alphaprocess(char buffer)

{

int atype;

int i=-1;

char alphatp[20]; /*字符数组存储从文件中读取的字符*/

while((isalpha(buffer))||(isdigit(buffer))||buffer=='_'||buffer=='.') /*标识符的组成成分*/

{

alphatp[++i]=buffer; /*将当前读取的字符存如数组*/

buffer=fgetc(fp); /*读取下一个字符*/

}

alphatp[i+1]='\0'; /*字符串以'\0'作为结束标志*/

atype=search(alphatp,1); /*调用函数,判断当前字符串是否为关键字*/

if(atype!=0) /*是关键字则输出该关键字,编号为1,并输出该关键字在关键字表中的位子*/

{

printf("(%s, (1,%d))\n",alphatp,atype);

id=1; /*关键字的ID为1*/

}

else

{

printf("(%s ,2)\n",alphatp); /*为标识符时,编号为2*/

id=2; /*标识符的ID为2*/

}

return(buffer);

}

/*判断字符串是否为关键字*/

int search(char searchchar[],int wordtype)

{

char

*key[32]={"auto","break","case","char","const","continue","default","do","double","else", "enum","extern","float","for","goto","if","int","long","register","return","short","signed","sizeof", "static","struct","volatile","while","switch","typedef","union","unsigned","void"};

/*设置数组指针存储c语言中的32个关键字*/

int i;

int p;

switch (wordtype)

{

case 1:for (i=0;i<=31;i++)

{

if (strcmp(key[i],searchchar)==0) /*比较字符串,为关键字则定位该关键字的序号*/

{ p=i+1; break; }

else p=0;

}

}

return(p);

}

/*alphaprocess()函数结束*/

/*处理读取字符为数字时的情况*/

char digitprocess(char buffer)

{

int i=-1;

char digittp[20];

int flag=0;

while (isdigit(buffer)||buffer=='.'||buffer=='e'||buffer=='E')//考虑数字为小数和指数时的情况{

if(buffer=='.'||buffer=='e'||buffer=='E')

{

flag++;

}

digittp[++i]=buffer;

buffer=fgetc(fp); /*同上*/

}

digittp[i+1]='\0';

if(flag>1)

{

error();

}else

{

printf("(%s ,3)\n",digittp); /*输出该数字,编号为3*/

id=3; /*设置ID为3*/

}

return(buffer);

}

/*digitprocess()函数结束*/

/*处理读出字符为其他字符的情况*/

char otherprocess(char buffer)

{

int n=0;

char ch[20];

ch[0]=buffer;

ch[1]='\0';

if(ch[0]=='%'||ch[0]=='\\')

{ buffer=fgetc(fp);

ch[1]=buffer;

ch[2]='\0';

printf("(%s ,4)\n",ch); /*识别运算符% \ */

id=4;

buffer=fgetc(fp);

return(buffer);

}

if(ch[0]=='&')

{

buffer=fgetc(fp);

if(buffer!='&')

{

printf("(%s ,4)\n",ch); /*识别引用运算符&*/

id=4;

return(buffer);

}

if(buffer=='&')

{

ch[1]=buffer;

ch[2]='\0';

printf("(%s ,4)\n",ch); /*识别关系运算符&&*/

id=4;

buffer=fgetc(fp);

return(buffer);

}

}

if(ch[0]==','||ch[0]==';'||ch[0]=='{'||ch[0]=='}'||ch[0]=='('||ch[0]==')')

{

printf("(%s ,5)\n",ch); /*分界符,;(){}的id标记为5*/

buffer=fgetc(fp);

id=5;

return(buffer);

}

if(ch[0]=='*'||ch[0]=='/') /*运算符'*''/'的id标记为4*/

{

printf("(%s ,4)\n",ch);

buffer=fgetc(fp);

id=4;

return(buffer);

}

if(ch[0]=='='||ch[0]=='!'||ch[0]=='<'||ch[0]=='>')

{

buffer=fgetc(fp);

if(buffer=='=') /*防止'==','!=','<=','>='符号的分离*/

{

ch[1]=buffer;

ch[2]='\0';

printf("(%s ,4)\n",ch); /*'==','!=','<=','>='的标记为4 */ }

else

{

printf("(%s ,4)\n",ch); /*'=','!','<','>'的标记为4*/

id=4;

return(buffer);

}

buffer=fgetc(fp);

id=4;

return(buffer);

}

if(ch[0]=='+'||ch[0]=='-')

{

if(id==4) /*如果'+','-'前ID为4的字符则可能为正负数或'++','--',否则为加减号*/

{

for(int i=1;i<10;i++)

{

buffer=fgetc(fp);

if(buffer=='+')

{

ch[1]='+';ch[2]='\0';

id=4;

goto L;

break; /*跳出for循环体*/

}

if(buffer=='-')

{

ch[1]='-';

ch[2]='\0';

id=4;

goto L;

break; /*跳出for循环体*/

}

if((buffer==',')||(buffer==';')||(buffer=='+')||(buffer=='-')||(buffer==')'))

break; /*防止将+12;+12,+12+,+12-,+12)作为整体输出*/

ch[i]=buffer;

ch[i+1]='\0';

}

printf("(%s ,3)\n",ch); /*识别特殊数字*/

id=3;

//buffer=fgetc(fp);

return(buffer);

}

ch[2]='\0';

L: printf("(%s ,4)\n",ch); /*识别特殊运算符++ --*/

buffer=fgetc(fp);

id=4;

return(buffer);

}

}

/*otherprocess()函数结束*/

void error()

{

printf("程序出错\n"); }

//被测程序

#include "ctype.h"

char test(char buffer)

{

int i=-1;

1.1.0;

double j=i++;

if (i&&j) i==j;

return(buffer);

}

(3)实验结果的屏幕截图

五.实验总结

在整个编译器设计过程中,遇到了很多意想不到的困难,其主要原因是对各个部分要实现的功能考虑不够周全,典型的如在词法分析器的设计中,当前待分析字符串为“a>+”,当前字符为?>?,此时,分析器到底是将其分析为大于关系运算符还是大于等于关系运算符呢?又比如,…+?分析为正号还是加法符号,以及对空白符、跳格符、回车符和换行符等编辑性字符的处理,及删除注解等。这些在程序设计初期实现都比较困难,在前个问题中,我们用到了超前搜索方法,当当前待分析字符串出现“a>+”,当前字符为?>?时,分析器读入下一个字符?+?,这时可知应将?>?解释为大于运算符。但此时,超前读了一个字符?+?,所以要回退一个字符,词法分析器才能正常运行。

实验一 词法分析

实验一词法分析 有如下算术运算文法: 1) E->E+T 2) E->E-T 3) E->T 4) T->T*F 5) T->T/F 6) T->F 7) F->(E) 8) F->I 9) I->十进制实数|十进制整数|十六进制实数| 十六进制整数|八进制实数|八进制整数 10) 十进制实数-> (0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) *).(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) * 11) 八进制实数-> 0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* .(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7) * 12) 十六进制实数-> 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* .(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3| 4|5|6|7|8|9|a|b|c|d|e|f) * 13) 十进制整数-> 0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) * 14) 八进制整数-> 0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7) * 15)十六进制整数-> 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f) (0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f) * 单词分类: 运算符:+ - * / () 常数: 十进制实数 十进制整数 十六进制实数 十六进制整数 八进制实数 八进制整数 1. 实验目的 实现一个词法分析程序,将输入字符串流分解成 单词流供语法分析使用。 2. 实验要求 输入算术运算式,输出分解后的单词流,例如: 输入(0124.3+0x35a.4f)*12 输出:

实验一词法分析实验报告

实验一词法分析 一、实验目的 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验要求 使用一符一种的分法 关键字、运算符和分界符可以每一个均为一种 标识符和常数仍然一类一种 三、实验内容 功能描述: 1、待分析的简单语言的词法 (1)关键字: begin if then while do end (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义: ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码 图 1

程序结构描述: 图 2 四、实验结果 输入begin x:=9: if x>9 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图3所示:

图3 输入private x:=9;if x>0 then x:=2*x+1/3; end#后经词法分析输出如下序列:(private 10)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图4所示: 图4 显然,private是关键字,却被识别成了标示符,这是因为图1中没有定义private关键字的种别码,所以把private当成了标示符。 输入private x:=9;if x>0 then x:=2*x+1/3; @ end#后经词法分析输出如下序列:(private 10)(x 10)(:17)(= 18)(9 11)(;26)(if 2)……如图5所示

实验1 词法分析器

青岛理工大学 实 验 报 告 实验课程: 编译原理 实验日期: 2014 年 5月28 日 交报告日期:2014 年6月4日 成绩: 实验地点:现代教育技术中心101(计算机实验室) 计算机工程 学院,计算机科学与技术 专业, 班级:计算113 实验指导教师: 批阅教师: 一、实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 1. 待分析的简单语言的词法 1) 关键字: begin if then while do end 所有关键字都是小写。 2) 运算符和界符: : = + – * / < <= <> > >= = ; ( ) # 3) 其他单词是标识符(ID )和整型常数(NUM ),通过以下正规式定义: ID=letter (letter| digit )* NUM=digit digit * 4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID 、NUM,运算符、界符和关 键字,词法分析阶段通常被忽略。

2.各种单词符号对应的种别码 3.词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码;token为存放的单词自身字符串;sum为常数。 例如:对源程序 begin x:=9; if x>0 then x:=2*x+1/3; end# 经词法分析后输出如下序列:(1,beigin) (10,x) (18,:=) (11,9) (26,;) (2,if)......

三、算法思想 1.主程序示意图 主程序示意图如下所示: 其中初值包括如下两个方面。 1)关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在关键字表,当扫描程序识别出标识符时,查关键字表。若查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表作为一个字符串数组,其描述如下: char *rwtab[22] = {"begin","if","else","then","while","do","for","switch","case", "until","break","goto","constant","return", "int","float","double","string","char","short","long","end"}; 2)程序中的主要变量为syn,token和sum。 2.扫描子程序的算法思想 首先设置3个变量: ①token用于存放构成单词符号的字符串; ②sum用于存放整型单词; ③syn用于存放单词符号的种别码。

实验1-3-《编译原理》词法分析程序设计方案

实验1-3 《编译原理》S语言词法分析程序设计方案 一、实验目的 了解词法分析程序的两种设计方法之一:根据状态转换图直接编程的方式; 二、实验内容 1.根据状态转换图直接编程 编写一个词法分析程序,它从左到右逐个字符的对源程序进行扫描,产生一个个的单词的二元式,形成二元式(记号)流文件输出。在此,词法分析程序作为单独的一遍,如下图所示。 具体任务有: (1)组织源程序的输入 (2)拼出单词并查找其类别编号,形成二元式输出,得到单词流文件 (3)删除注释、空格和无用符号 (4)发现并定位词法错误,需要输出错误的位置在源程序中的第几行。将错误信息输出到屏幕上。 (5)对于普通标识符和常量,分别建立标识符表和常量表(使用线性表存储),当遇到一个标识符或常量时,查找标识符表或常量表,若存在,则返回位置,否则返回0并且填写符号表或常量表。 标识符表结构:变量名,类型(整型、实型、字符型),分配的数据区地址 注:词法分析阶段只填写变量名,其它部分在语法分析、语义分析、代码生成等阶段逐步填入。 常量表结构:常量名,常量值 三、实验要求 1.能对任何S语言源程序进行分析 在运行词法分析程序时,应该用问答形式输入要被分析的S源语言程序的文件名,然后对该程序完成词法分析任务。 2.能检查并处理某些词法分析错误 词法分析程序能给出的错误信息包括:总的出错个数,每个错误所在的行号,错误的编号及错误信息。 本实验要求处理以下两种错误(编号分别为1,2): 1:非法字符:单词表中不存在的字符处理为非法字符,处理方式是删除该字符,给出错误信息,“某某字符非法”。 2:源程序文件结束而注释未结束。注释格式为:/* …… */ 四、保留字和特殊符号表

实验一词法分析

实验一词法分析 1.实验要求 (1)从源程序文件中读取有效字符并将其转换成二元组内部表示形式输出。 (2)掌握词法分析的实现方法。 (3)实验时间4学时。 (4)实验完成后,要提交实验报告(包括源程序清单)。 2.实验内容 2.1主程序设计考虑: 主程序的说明部分为各种表格和变量安排空间(关键字和特殊符号表)。 id 和ci 数组分别存放标识符和常数;还有一些为造表填表设置的变量。 主程序的工作部分建议设计成便于调试的循环结构。每个循环处理一个单词;调用词法分析过程;输出每个单词的内部码(种别编码,属性值)。建议从文件中读取要分析的符号串。 2.2词法分析过程考虑 该过程根据输入单词的第一个有效字符(有时还需读第二个字符),判断单词种别,产生种别编码。对于标识符和常数,需分别与标识符表和常数表中已登记的元素相比较,如表中已有该元素,则记录其在表中的位置,如未出现过,将标识符按顺序填入数组id 中,将 三:主流程图如下:

四:实验思路 (1)我首先把这个单词的种类分成了五类,包括:关键字、标识符、常数、算符、界符。然后利用状态转换图进行单词的识别 (2)对于关键字、算符、界符。因为这些单词的个数有限。所以我单独给每个单词一个种别编码。能够做到每个单词的种别编码是不一样的。而对于常数和标识符,我先把它们分别单独的作为一类,然后定义一个二维数组,分别存放这个单词的名称和编码。而这个编码就是这个单词在这个二维数组中的位置;当遇到新的标识符或常数,就把这个单词放入到相应的数组中。 (3)然后构造一个状态转换图的程序。把每次得到的单词先暂时存放在temp 二维数组中。然后用这个临时的二维数组去确定这个单词是何种类别 五:实验代码 using System; using System.Collections.Generic;

词法分析器实验报告

词法分析器实验报告 词法分析器设计 一、实验目的: 对C语言的一个子集设计并实现一个简单的词法分析器,掌握利用状 态转换图设计词法分析器的基本方法。利用该词法分析器完成对源程 序字符串的词法分析。输出形式是源程序的单词符号二元式的代码, 并保存到文件中。 二、实验内容: 1. 设计原理 词法分析的任务:从左至右逐个字符地对源程序进行扫描,产生一个个单词符号。 理论基础:有限自动机、正规文法、正规式 词法分析器(Lexical Analyzer) 又称扫描器(Scanner):执行词法分析的程序 2. 词法分析器的功能和输出形式 功能:输入源程序、输出单词符号 程序语言的单词符号一般分为以下五种:关键字、标识符、常数、运算符,界符 3. 输出的单词符号的表示形式: 单词种别用整数编码,关键字一字一种,标识符统归为一种,常数一种,各种符号各一种。 4. 词法分析器的结构 单词符号 5. 状态转换图实现

三、程序设计 1.总体模块设计 /*用来存储目标文件名*/ string file_name; /*提取文本文件中的信息。*/ string GetText(); /*获得一个单词符号,从位置i开始查找。并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。*/ string GetWord(string str,int i,int& j); /*这个函数用来除去字符串中连续的空格和换行 int DeleteNull(string str,int i); /*判断i当前所指的字符是否为一个分界符,是的话返回真,反之假*/ bool IsBoundary(string str,int i); /*判断i当前所指的字符是否为一个运算符,是的话返回真,反之假*/ bool IsOperation(string str,int i);

实验一、词法分析器(含源代码)

词法分析器实验报告 一、实验目的及要求 本次实验通过用C语言设计、编制、调试一个词法分析子程序,识别单词,实现一个C语言词法分析器,经过此过程可以加深对编译器解析单词流的过程的了解。 运行环境: 硬件:windows xp 软件:visual c++6.0 二、实验步骤 1.查询资料,了解词法分析器的工作过程与原理。 2.分析题目,整理出基本设计思路。 3.实践编码,将设计思想转换用c语言编码实现,编译运行。 4.测试功能,多次设置包含不同字符,关键字的待解析文件,仔细察看运行结果,检测该分析器的分析结果是否正确。通过最终的测试发现问题,逐渐完善代码中设置的分析对象与关键字表,拓宽分析范围提高分析能力。 三、实验内容 本实验中将c语言单词符号分成了四类:关键字key(特别的将main说明为主函数)、普通标示符、常数和界符。将关键字初始化在一个字符型指针数组*key[]中,将界符分别由程序中的case列出。在词法分析过程中,关键字表和case列出的界符的内容是固定不变的(由程序中的初始化确定),因此,从源文件字符串中识别出现的关键字,界符只能从其中选取。标识符、常数是在分析过程中不断形成的。 对于一个具体源程序而言,在扫描字符串时识别出一个单词,若这个单词的类型是关键字、普通标示符、常数或界符中之一,那么就将此单词以文字说明的形式输出.每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直到整个源程序全部扫描完毕,从而形成相应的单词串。 输出形式例如:void $关键字

流程图、程序流程图:

程序: #include #include #include #include //定义关键字 char *Key[10]={"main","void","int","char","printf","scanf","else","if","return"}; char Word[20],ch; // 存储识别出的单词流 int IsAlpha(char c) { //判断是否为字母 if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A'))) return 1; else return 0; } int IsNum(char c){ //判断是否为数字 if(c>='0'&&c<='9') return 1; else return 0; } int IsKey(char *Word){ //识别关键字函数 int m,i; for(i=0;i<9;i++){ if((m=strcmp(Word,Key[i]))==0) { if(i==0) return 2; return 1; } } return 0; } void scanner(FILE *fp){ //扫描函数 char Word[20]={'\0'}; char ch; int i,c; ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符 if(IsAlpha(ch)){ //判断该字符是否是字母 Word[0]=ch; ch=fgetc(fp);

编译原理实验报告(词法分析器语法分析器)

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的:1,词法分析器能够识别简单语言的单词符号 2,识别出并输出简单语言的基本字.标示符.无符号整数.运算符.和界符。 三、实验要求:给出一个简单语言单词符号的种别编码词法分析器 四、实验原理: 1、词法分析程序的算法思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 2、程序流程图 (1 (2)扫描子程序

3

五、实验内容: 1、实验分析 编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符。字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。 2 实验词法分析器源程序: #include #include #include int i,j,k; char c,s,a[20],token[20]={'0'}; int letter(char s){ if((s>=97)&&(s<=122)) return(1); else return(0); } int digit(char s){ if((s>=48)&&(s<=57)) return(1); else return(0); } void get(){ s=a[i]; i=i+1; } void retract(){ i=i-1; } int lookup(char token[20]){ if(strcmp(token,"while")==0) return(1); else if(strcmp(token,"if")==0) return(2); else if(strcmp(token,"else")==0) return(3); else if(strcmp(token,"switch")==0) return(4); else if(strcmp(token,"case")==0) return(5); else return(0); } void main() { printf("please input string :\n"); i=0; do{i=i+1; scanf("%c",&a[i]);

编译原理实验一词法分析实验报告

专题 1_ 词法分析程序构造原理与实现 李若森 13281132计科1301 一、程序功能描述 [功能]: 完成下述正则文法所描述的C语言子集单词符号的词法分析程序。 [要求]: (1)给出各单词符号的类别编码。 (2)能发现输入串的错误。 (3)将分析所得二元序列输出到中间文件中。 [文法]: <标识符>→c|c<余留标识符> <余留标识符>→d|c <无符号数>→d<余留无符号数>|.<小数部分>|d <余留无符号数>→d<余留无符号数>|.<十进小数>|(E|e)<指数部分>|.|d <十进小数>→(E|e)<指数部分>|d<十进小数>|d <小数部分>→d<十进小数>|d <指数部分>→d<余留指数>|(+|-)<整指数>|d <整指数>→d<余留整指数>|d <余留整指数>→d<余留整指数>|d <算数运算符>→+|-|*|/|++|-- <关系运算符>→>|<|==|>=|<=|!= <逻辑运算符>→!|&&|\|\| <位操作运算符>→>>|<< <赋值运算符>→=|+=|-=|*=|/=|%= <特殊运算符>→,|\(|\)|{|} <分隔符>→; 保留字: void int float double if else for do while [说明]: (1)该语言对大小写不敏感 (2)c代表字母a-z&&A-Z,d代表数字0-9。 (3)?/*..*/?以及?//?为程序注释部分。 (4)文法中‘\’为转义字符

二、主要数据结构描述 pair: 用pair来存储单个二元组。其中第一个元素为类型号,第二个为 元素的值。当类型号小于40时代表程序分界符,第二个元素不存储有效信息,用 ?-?代替;类型号为40时是标识符,第二个元素存储标识符字符串;类型号为41 时代表实数,第二个元素存储的是该实数的二进制值。 vector<>: vector是C++中的动态数组,用来存储每一行的二元组。 三、程序结构描述 设计方法: 状态转换图:(DFA M)

Removed_实验一:词法分析器编制实验37

实验一:词法分析器编制实验 一教学重点与实现的关键技术 1.1词法分析概述 人们理解一篇文章(或解析一个程序)起码是在单词级别上来思考的。同样,编译程序也是 在单词的级别上来分析和翻译源程序的。词法分析的任务是:从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号(token),把作为字符串的源程序改造成单词符号串的中间程序。因此,词法分析是编译的基础。 执行词法分析的程序称为词法分析器。构造词法分析器的方法分为手工编制和自动生成(如用著名的词法分析器的自动生成工具Lex自动为某种语言的编译构造词法分析器)两种,本实验要求学生利用所学习掌握的知识手工编制一个小型的词法分析器。 1.2词法分析器的设计要求 1.2.1词法分析器的功能和输出形式 词法分析器的功能是输入源程序,输出单词符号。单词符号是一个程序语言的基本语法符号。程序语言的单词符号一般可分为下列五种。 (1)关键字 是由程序语言定义的具有固定意义的标志符。有时称这些标志符为保留字或基本字。例如,Pascal中的begin,end,if,while都是保留字。这些字通常不用作一般标 志符。 (2)标识符 用来表示各种名字,如变量名、数组名、过程名等等。 (3)常数 常数的类型一般有整型、实型、布尔型、文字型等等。例如, 100,3.14159,TRUE,‘Sample’。 (4)运算符 如+、-、*、/等等 (5)界符 如逗号、分号、括号、/*,*/等等。 一个程序语言的关键字、运算符和界符都是确定的,一般只有几十个或上百个。而对于标识符或常数的使用通常都不加什么限制。 词法分析器所输出的单词符号常常表示成如下的二元式: (单词种别,单词符号的属性值) 单词种别通常用整数编码。一个语言的单词符号如何分种,分成几种,怎么编码,是一个技术性的问题。它主要取决于处理上的方便。标识符一般统归 为一种。常数则宜按类型(整、实、布尔等)分种。关键字可将其全体视为一种, 也可以一字一种。采用一字一种的分法实际处理起来较为方便。运算符可采用一 符一种的分法,但也可以把具有一定共性的运算符视为一种。至于界符一般用一 符一种的分法。 如果一个种别只含一个单词符号,那么,对于这个单词符号,种别编码就完全代表它自身了。若一个种别含有多个单词符号,那么,对于它的每个单词 符号,除了给出种别编码之外,还应给出有关单词符号的属性信息。 单词符号的属性是指单词符号的特性或特征。属性值则是反映特性或特征的值。例如,对于某个标识符,常将存放它的有关信息的符号表项的指针作为其属 性值;对于某个常数,则将存放它的常数表项的指针作为其属性值。 在这里,我们给出一种编码方法(以FORTRAN语言为例): 单词符号编码举例 单词符号种别 编码 内部 值 助记符 DIM1$DIM

实验1 词法分析程序的设计与开发

编译原理实验报告 一、实验目的 ? 深入理解有限自动机及其应用 ? 掌握词法分析程序的开发。 ? 掌握根据语言的词法规则构造识别其单词的有限自动机的方法 ? 深入理解词法分析程序自动生成原理 二、实验要求 ? 掌握各类单词的形式描述 ?用直接转向法实现有限自动机的代码编写。 ? 独立完成PL0语言的词法分析器。 ? 掌握词法分析程序自动生成工具LEX 的使用。 三、实验原理 词法分析是编译过程的第一阶段。它的任务就是对输入的字符串形式的源程序按顺序进行扫描,根据源程序的词法规则识别具有独立意义的单词(符号),并输出与其等价的Token 序列。 有限自动机是描述程序设计语言单词构成的工具,而状态转换图是有限自动机的比较直观的描述方法。我们使用确定的有限状态自动机,简记为DFA 。 PL/0的语言的词法分析器将要完成以下工作: (1) 跳过分隔符(如空格,回车,制表符); (2) 识别诸如begin ,end ,if ,while 等保留字; (3) 识别非保留字的一般标识符,此标识符值(字符序列)赋给全局量id ,而全局量sym 赋值为SYM_IDENTIFIER 。 (4) 识别数字序列,当前值赋给全局量NUM ,sym 则置为SYM_NUMBER ; (5) 识别:=,<=,>=之类的特殊符号,全局量sym 则分别被赋值为SYM_BECOMES ,SYM_LEQ ,SYM_GEQ 等。 课程名称: 编译原理 班级: 计算1614 实验成绩: 指导教师: 付永钢 姓名: 施心萍 实验项目名称: 实验一 词法分析程序设计与开发 学号: 201621121097 上机实践日期:

实验一(词法分析)

实验一词法分析 1. 实验目的 1、 学会针对DFA转换图实现相应的高级语言源程序。 2、 深刻领会状态转换图的含义,逐步理解有限自动机。 3、掌握手工生成词法分析器的方法,了解词法分析器的内部 工作原理。 2. 实验内容 计算机程序设计语言的编译程序的词法分析部分实现。给出算法的流程图及有穷状态自动机的模型(可以用矩阵或者状态图表示)从左到右扫描每行该语言源程序的符号,拼成单词,换成统一的内部表示(token)送给语法分析程序。 为了简化程序的编写,有具体的要求如下: (1) 数仅仅是整数。 (2) 空白符仅仅是空格、回车符、制表符。 (3) 代码是自由格式。 (4) 注释应放在花括号之内,并且不允许嵌套 3. 实验要求 要求实现编译器的以下功能: (1) 按规则拼单词,并转换成二元式形式 (2) 删除注释行 (3) 删除空白符 (空格、回车符、制表符) (4) 列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的记号的二元形式(5) 发现并定位错误 词法分析进行具体的要求: (1) 记号的二元式形式中种类采用枚举方法定义;其中保留字和特殊字符是每个都一个种类,标示符自己是一类, 数字是一类;单词的属性就是表示的字符串值。 (2)词法分析程序当识别一个单词完毕,采用返回值的形式返回符号的种类,同时采用程序变量的形式提供当前识 别出记号的属性值。 (3)标示符和保留字的词法构成相同,为了更好的实现,把语言的保留字建立一个表格存储,这样可以把保留字的

识别放在标示符之后,用识别出的标示符对比该表格, 如果存在该表格中则是保留字,否则是一般标示符。 (选做) 4.实验结果 (1)测试用例 (2)实验结果的屏幕截图 五.实验总结

词法分析实验报告(实验一)

编译原理词法分析实验报告 软工082班 兰洁 200831104044 一、实验内容 二、实验目的 三、实验预期 四、程序规定 五、实验原理 ●程序流程图 ●判别浮点功能扩展流程图 ●状态转换图 六、程序代码与浮点判别功能扩展 七、测试用例 ●扩展功能测试用例; ●普通功能测试用例 八、输出结果 九、实验心得

一、实验内容: 词法分析: 1、识别简单语言的单词符号; 2、识别关键字、标识符、数字、运算符等。并扩展浮点识别功能。 二、实验目的 调试词法分析程序,加深对词法分析原理的理解,掌握编写简单词法分析程序的一般步骤。 三、实验预期结果: 经过调试源代码程序,程序能够成功运行编译,对输入的简单字符串,能够别关键字、标识符、数字、运算符等,并且给出单词符号的对应编码。 四、程序规定: 1、关键字:"function","if","then","while","do","endfunc"; 2、算术运算符:”+”,”-”,”*”,”/”,”=”; 3、关系运算符:"<" ">" "<=" ">=" "==" "!="; 4、界符:"(" ")" ";" "#"; 5、标识符规定以字母开头,字母均为小写; 6、空格和换行符跳过; 7、单词对应编码: 十、实验原理: 输入串--------------------〉词法分析程序————————〉单词符号串 输入:字符串以#结束。 输出:单词的二元组(syn,token/sum)

程序流程图 分析浮点数功能扩展部分流程图:

shuzi()函数

状态转换图 六、程序代码: 备注:红色字体部分为程序功能的功能扩展,使程序能够分析浮点数! 我把浮点数的syn设置为80!

试验一词法分析试验

实验一源程序的输入和扫描 学时数:2 [实验内容]: 1、编制一个源程序的输入、扫描程序,从文件中每次读入一行到输入缓冲区(可以用字符数组实现); 然后从缓冲区中依次取出字符显示在屏幕上。 2、从文件每次读入一行到输入缓冲区的功能(可以用字符数组实现)用一个子程序实现。 [实验目的]: 1、通过编制一个源程序的输入、扫描程序,熟悉和了解从文件中读入数据到输入缓冲区的过程。 [实验步骤]: 1、准备:用TC、VC++等开发工具;确定被处理的语言的语法特点(初步确定,可使用现成语言如Pascal、C等)。编好程序,写好实验报告。 2、上机:输入源程序,修改、调试,运行。 编程思想: 采用一个子程序实现的形式。 (1)程序判断源文件是否为NULL,如果是,则输出错误提示!如果不是,则进入循环。 (2)调用子程序readbuffer(),每次读入一个字符给字符变量,如果字符变量的内容不是回车符,则把字符变量的内容存入数组buffer(),然后读入下一字符,再判断再存入数组,直到一行全存入数组,然后返回主程序,用输出语句输出刚才存入数组的一行字符; (3)如果没有到文件尾,则重复第(2)步,直到文件结束,则退出主程序,完成任务! [程序要求]: 1)首先在E盘上建立一个A.c文件,文件内容如下: A.c文件内容: main() { int a,b ,c; a = 10; b=20; c=a+b; } 2)然后用C语言编写一个输入、扫描程序,实现将E盘上建立的文件内容读入缓冲区,并在屏幕上输出该文件内容,要求运行的输出结果与输入的文件内容相同。运行和调式程序,看输出的文件内容是否和输入的格式一样。 本次实验主要熟悉用C语言实现文件的输入和输出过程,目的就是让同学了解如何实现从键盘输入字符串并写入文件中,然后从文件中读出字符,并按照输入的格式输出在屏幕上。 源程序:输入、扫描程序源代码(仅供参考): # include # include # include int i; FILE *fp; char buffer[256]; //声明变量

词法分析实验报告

编译原理实验一 姓名:朱彦荣 学号:20132184 专业:软件工程2 实验题目:词法分析完成语言:C/C++ 上级系统:VC++6.0 日期:2015/11/7

词法分析 设计题目:手工设计c语言的词法分析器 (可以是c语言的子集) 设计容: 处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。 设计目的: 了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。 结果要求:课程设计报告。 完成日期:第十五周提交报告

一.分析 要想手工设计词法分析器,实现C语言子集的识别,就要明白什么是词法分析器,它的功能是什么。词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理(去除注释、无用的回车换行找到包含的文件等)之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别是标识符、保留字、常数、运算符、界符。以便为下面的语法分析和语义分析做准备。可以说词法分析面向的对象是单个的字符,目的是把它们组成有效的单词(字符串);而语法的分析则是利用词法分析的结果作为输入来分析是否符合语法规则并且进行语法制导下的语义分析,最后产生四元组(中间代码),进行优化(可有可无)之后最终生成目标代码。可见词法分析是所有后续工作的基础,如果这一步出错,比如明明是‘<=’却被拆分成‘<’和‘=’就会对下文造成不可挽回的影响。因此,在进行词法分析的时候一定要定义好这五种符号的集合。下面是我构造的一个C语言子集。 第一类:标识符 letter(letter | digit)* 无穷集 第二类:常数 (digit)+ 无穷集 第三类:保留字(32) auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 第四类:界符‘/*’、‘//’、 () { } [ ] " " ' 等 第五类:运算符 <、<=、>、>=、=、+、-、*、/、^、等 对所有可数符号进行编码:

编译原理实验一词法分析

《编译原理》(2014-2015学年第1学期) 实 验 报 告 学号:2012329620058 姓名:胡冰倩 班级:12计科3班

实验一:词法分析程序 一、实验目的 1、构造一个《科学计算器》的词法分析程序,程序要求能对输入的字符串流进行词法分析。 2、在实验的过程中,学会应用词法分析的方法——构造NFA和DFA。 二、实验内容和要求 1、科学计算器的功能 作为一个科学计算器,最重要的自然是能够计算,以下是罗列的一些可以实现的功能: 1)基本四则运算 2)三角函数计算 3)指幂运算 4)表达式求值 5)log运算 6)提供一些基本常数,如PI、e等 7)进制转换 8)变量存储 2、要实现该科学计算器,本次实验首先需要完成词法分析,下面列举4个输入的表达式,: 1.0+2*3= 1.0+(2*3+cos3)/3.6-6= tg(1.0+(sin2*3+cos3)/3.6-6)= 4.0log(1.0+(sin2*3+cos3)/3.6-6)= 期望程序能根据实现的DFA对任给的一个输入串进行词法分析,程序的输出为单词的token序列$(CLASS, V ALUE) 。CLASS中存放类别,V ALUE中存放token的值,如第一个算式,其输出为: $(CLASS,V ALUE) $( number, 1.0) $( plus, + ) $(number, 2) $(mul, * )

$(number, 3) 关于TOKEN的分类(CLASS),可将所有标识符归为一类;将常数归为另一类;保留字和分隔符则可采取一词一类。 对于变量标识符和常数,CLASS字段为相应的类别码,V ALUE字段则是该标识符、常数在其符号表中登记项的序号。 3、程序应通过DFA来完成词法分析。可参考的DFA如下图: 图中每一个箭头表明一个字符的输入,由于这个输入,自动机从一个状态变为另一个状态。同学们可以根据自己的理解自行设计DFA。该DFA需能够识别

词法分析

编 译 原 理 实 验 报 告 实验名称:词法分析班级:. 学号: 姓名:

实验一词法分析 一、实验目的: 通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。(遇到错误时可显示“Error”,然后跳过错误部分继续显示) 二、实验预习提示 1、词法分析器的功能和输出格式 词法分析器的功能是输入源程序,输出单词符号。词法分析器的单词符号常常表示 成以下的二元式(单词种别码,单词符号的属性值)。本实验中,采用的是一类符号 一种别码的方式。 2、单词的BNF表示 <标识符>-> <字母><字母数字串> <字母数字串>-><字母><字母数字串>|<数字><字母数字串>| <下划线><字母数字串>|ε <无符号整数>-> <数字><数字串> <数字串>-> <数字><数字串> |ε <加法运算符>-> + <减法运算符>-> - <大于关系运算符>-> > <大于等于关系运算符>-> >= 3、“超前搜索”方法 词法分析时,常常会用到超前搜索方法。如当前待分析字符串为“a>+”,当前字符为’>’,此时,分析器倒底是将其分析为大于关系运算符还是大于等于关系运算符呢? 显然,只有知道下一个字符是什么才能下结论。于是分析器读入下一个字符’+’,这时可知应将’>’解释为大于运算符。但此时,超前读了一个字符’+’,所以要回退一个字符,词法分析器才能正常运行。在分析标识符,无符号整数等时也有类似情况。 4、模块结构

词法分析

实验二:词法分析 一、实验目的:编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及 Error ”,然后跳过错误部分继续显示) 二、估计实验时间:1.课余准备15小时;2.上机二次4小时;3.完成实验报告5小时。 三、实验过程和指导: (一)准备:1.阅读课本有关章节,花一周时间明确语言的语法,写出基本保留字、标识符、常数、运算符、分隔符和程序例。2.初步编制好程序。3.准备好多组测试数据。 (二)上课上机:将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 如源程序为C 语言。输入如下一段: main() { int a,b; a = 10; b = a + 20; } 要求输出如右图。 要求: 识别保留字:if 、int 、for 、while 、do 、return 、break 、continue 其他的都识别为标识符; 常数为无符号整形数; 运算符包括:+、-、*、/、=、>、<、>= 、<=、!= 分隔符包括:,、;、{、}、(、) 程序思路(仅供参考): 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将源程序全部输入到字符缓冲区中。 2.取单词前:去掉多余空白。 3.取单词后:去掉多余空白(可选,看着办)。 4.取单词:利用实验一的成果读出单词的每一个字符,组成单词,分析类型。(关键是如何判断取单词结束?取到的单词是什么类型的单词?) 5. 显示结果。 (四)练习该实验的目的和思路: 程序开始变得复杂起来,可能是大家以前编过的程序中最复杂的,但相对于以后的程序来说还是简单的。因此要认真把握这个过渡期的练习。程序规模大概为200行。本实验和以后的实验相关。通过练习,掌握对字符进行灵活处理的方法。 (五)为了能设计好程序,主意以下事情: 1.模块设计:将程序分成合理的多个模块(函数),每个模块做具体的同一事情。 2.写出(画出)设计方案:模块关系简图、流程图、全局变量、函数接口等。 3.编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。

实验1 词法分析实验报告

实验1 词法分析实验报告 一、实验目的 调试并完成一个词法分析程序,加深对词法分析原理的理解。 二、实验要求 1、待分析的简单语言的词法 (1)关键字: begin if then while do end 所有关键字都是小写。 (2)运算符和界符: := + –* / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义: ID=letter(letter| digit)* NUM=digit digit * (4)空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码

3、词法分析程序的功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。 三、源程序代码: #include #include #include char prog[80],token[8]; char ch; int syn,p,m=0,n,row,sum=0; char *rwtab[6]={"begin","if","then","while","do","end"}; void scaner() { for(n=0;n<8;n++) token[n]=NULL; ch=prog[p++]; while(ch==' ') { ch=prog[p]; p++; } if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) { token[m++]=ch; ch=prog[p++]; } token[m++]='\0';

语法分析词法分析实验报告

编译原理实验报告词法分析和语法分析 专业班级 jk0701 学生姓名舒月 学号 07281011

实验题目:研究性学习专题一词法分析程序构造原理与实现技术 研究性学习专题二递归下降语法分析设计原理与实现技术一实验目的 (1)研究性学习专题一 <标识符>→字母︱<标识符>字母︱<标识符>数字 <无符号整数>→数字︱<无符号整数>数字 <单字符分界符> →+ ︱-︱* ︱; ︱(︱) <双字符分界符>→<大于>=︱<小于>=︱<小于>>︱<冒号>=︱<斜竖>* <小于>→< <等于>→= <大于>→> <冒号> →: <斜竖> →/ 该语言的保留字:begin end if then else for do while and or not [设计说明] (1)该语言大小写不敏感;(2)字母为a-z A-Z,数字为0-9;(3)可以对上述文法进行扩充和改造;(4)‘/*……*/’为程序的注释部分。 (2)研究性学习专题二 G[E]: E→TE′ E′→ATE′|ε T→FT′ T′→MFT′|ε F→(E)|i A→+|- M→*|/ [设计说明] 终结符号i为用户定义的简单变量,即标识符的定义。

二实验分析过程 词法分析程序功能描述:根据上述正则文法,输入一串字符串,输出一串二元式序列组成的中间文件,在实现的过程中,能发现输入串中的错误。 语法分析程序功能描述:根据词法分析输出的二元式序列,对二元式序列进行判定,时候满足语法的要求,若满足,则输出结果为正确,反之,为错误。 主要数据结构:用T okenBean类存储数字,标识符,保留字的类别,表示,和识别名 public class TokenBean { String name; String code; int kind; } 用ArrayList来装TokenBean类 程序结构描述: (1)词法分析过程用到的主要函数 public boolean isNumber(char ch)//判断输入字符是否为整数 public boolean isAlph(char ch) //判断输入字符是否为字母 private void isKey(String str)// 判断str是关键字还是标识符 public void excute(String s) //对字符串s 进行分析,得出二元式(2)语法分析过程用到的主要函数 public boolean ipresent(int kind)//识别保留字,标识符,整数以下是判断函数,入口为E() 若E为真,则二元式序列满足语法分析 private boolean E() // E→TE′ private boolean E1() // E′→ATE′|ε private boolean A() //A→+|- private boolean T() // T→FT′ private boolean T1() // T′→MFT′|ε private boolean M() //M→*|/ private boolean F() //F→ (E)|i

相关文档