当前位置:文档之家› 编译原理实验报告书

编译原理实验报告书

编译原理实验报告书
编译原理实验报告书

《程序设计语言--编译原理》

实验指导书

姓名:

学号:

班级:

指导教师:

实验一:编写词法分析程序

1、实验类型

验证型实验。

2、实验目的和要求

通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、上机调试编出的词法分析程序。

3、实验内容

编写附录A的PASCAL子集的词法分析程序,并完成词法分析程序的编程与调试。

4、实验代码

#include "stdio.h"

#include "string.h"

#include "stdlib.h"

//宏定义

#define FILE_LENGTH 100

#define KEY_WORD_LENGTH 10

#define WORD_LENGTH 20

//全局变量声明

char keyWord[KEY_WORD_LENGTH][KEY_WORD_LENGTH];

FILE *pFILE,*pFILE2;

char ch;

char strToken[WORD_LENGTH];

int i = 0;

int j =0 ;//keyword

int k;

//函数声明

void _Init();

void GetChar();

void GetBc();

void Concat();

bool IsLetter();

bool IsDigit();

int Reserve();

void Retract();

void InsertFile(char strToken[], int i);

void clean();//1--关键字 2--标示符 3--常数 4--运算符 5--界符 6--非法标示符

void main()

{ _Init();

do

{ //printf("1");

i=0;

memset(strToken,0,sizeof(strToken));

GetChar();

GetBc();

//识别标示符或者关键字

if(IsLetter())

{ Concat();

GetChar();

while(IsLetter() || IsDigit())

{ Concat();

GetChar();

}

Retract();

k = Reserve();

if(k == 0)

InsertFile(strToken,2);

else

InsertFile(&keyWord[j][0],1);

}

//识别数字

else if(IsDigit())

{ Concat();

GetChar();

bool a1 = true;

bool b1 = true;

while(IsDigit())

{ Concat();

GetChar();

}

if(IsLetter())

{ Concat();

//printf("非法标示符%s\n",strToken);

i=0;

InsertFile(strToken,6);

memset(strToken,0,sizeof(strToken));

b1 = false;

}

if(a1&&b1)

{ Retract();

InsertFile(strToken,3);

}

}

//识别运算符

else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='||ch=='==') { Concat();

if(strcmp(strToken,"/") == 0)

{ GetChar();

Concat();

if(strcmp(strToken,"/*") == 0)

{ while(1)

{ int j = 0;

GetChar();

if(ch == '*')

{ GetChar();

if(ch == '/')

{ fseek(pFILE,j,1);

break;

}

}

j++;

}

}

}

else

InsertFile(strToken,4);

}

//识别界符

Else if(ch==';'||ch==','||ch=='('||ch==')'||ch=='{'||ch=='}'||ch=='/'|| ch=='*') { Concat();

InsertFile(strToken,5);

}

else if(strToken[WORD_LENGTH] == '/*')

printf("");

} while (ch != EOF);

printf("词法分析完成,请检查\n");

fclose(pFILE);

}

//关键字声明和文件打开处理

void _Init()

{ char fname[FILE_LENGTH];

printf("请输入文件名:");

scanf("%s",fname);

if((pFILE = fopen(fname,"r")) == NULL)

{ printf("没有找到指定的文件,请检查输入的文件名是否正确");

exit(0);

}

strcpy(&keyWord[0][0],"break");

strcpy(&keyWord[1][0],"continue");

strcpy(&keyWord[2][0],"do");

strcpy(&keyWord[3][0],"for");

strcpy(&keyWord[4][0],"if");

strcpy(&keyWord[5][0],"int");

strcpy(&keyWord[6][0],"return");

strcpy(&keyWord[7][0],"while");

}

void GetChar()

{ ch = fgetc(pFILE);

if(ch == EOF)

fclose(pFILE);

}

//判断ch中是否有空格如果有则调用GecChar

void GetBc()

{ if(ch == ' ')

GetChar();

}

//连接单词符号构成新的字符串

void Concat()

{ strToken[i] = ch;

i++;

}

bool IsLetter()

{ if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))

return true;

return false;

}

bool IsDigit()

{ if(ch >= '0' && ch <= '9')

return true;

return false;

}

//判断strToken是否为关键字是返回1,不是返回0

int Reserve()

{ while(j<8)

{

if(strcmp(strToken,&keyWord[j][0]) != 0)

j++;

else

return j;

}

return 0;

}

void Retract()

{ fseek(pFILE,-1,1);

ch = ' ';

}

void InsertFile(char _strToken[], int i)

{ if((pFILE2 = fopen("CharacterTable.txt","a")) == NULL)

{ printf("没有找到指定的要写入数据的文件,请检查输入的文件名是否正确");

exit(0);

}

fprintf(pFILE2,"(%d,'%s')\n",i,_strToken);

fflush(pFILE2);

fclose(pFILE2);

}

void clean()

{ int k;

for(k=0; k

strToken[k] = '\0';

}

5、实验结果

本次实验的测试数据为:6 do - , <

实验的现象为:<3,0> <2,0> <5,11H> <4,0> <5,00H>

实验数据的分析:实验结果的第一个元素1,2,3,4,5分别表示的是关键字,标识符,常数,分界符,运算符;第二个元素表示该字符在各自表中的指针或内部码值。

实验结果屏幕截图:

6、实验小结

由于第一次接触这种实验所以刚开始花了很多时间去阅读和理解老师给的实验指导书以及上网查找各种资料,逐步的了解了实验内容才开始编写程序的,本次实验验证的原理:(1)算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号(2)其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。其次由于并不是完全理解老师实验指导书的内容所以大部分的代码是上网找的代码然后自己去求改已达到实验的最后结果所以整个实验在编写的过程中并未完全按照老师的要求编写该程序。符号、标识符、常数的处理比较顺畅,主要的出错点在关键字上,一开始的代码只能实现begin而不能实现其他关键字的输出,但经过网上查找资料以及同学的帮助下最终完善了代码。

实验二:编写递归下降语法分析器

1、实验类型

验证型实验

2 实验目的和要求

通过设计、编制、调试一个递归下降语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,掌握常用的语法分析方法。通过本实验,应达到以下目标:1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。2、掌握词法分析的实现方法。3、上机调试编出的语法分析程序。

3、实验内容

1、分析对象分析算术表达式的BNF定义如下:

〈算术表达式〉→〈项〉|〈算术表达式〉+〈项〉|〈算术表达式〉-〈项〉〈项〉→〈因式〉|〈项〉*〈因式〉|〈项〉/〈因式〉

〈因式〉→〈变量〉│(〈算术表达式〉

〈变量〉→i 用符号表示如下:

E→T|E+T|E-T

T→F|T*F|T/

F→i│(E)

2、要求:根据递归下降法分析法,完成上述算术表达式的分析器构造。主要完成:

(1)通知外界键入算术表达式;

(2)控制过程分析算术表达式;

4、实验代码

#include

#include

#include

char a[80]; // 字符串的存入

char sym; // 单个的判断字

int i=0; // 字符串下标

// 功能识别函数

void E();

void G(); //相当于E'函数

void T(); //相当于T'函数

void S();

void F();

void output();

void input(); // 输入函数

void advance(); // 字符串小标进一函数

int total=0;

int str_len=0;

int Num=2;

char str[20]="#E";//栈

void push(char ch)

{

str[Num++]=ch;

}

void pop()

{

Num--;

}

void show()

{

int i=0;

for(i=0;i

printf("%c",str[i]);

printf("\t");

}

void main()

{

while(1)

{

input();

advance();

E(); // 从首个推导式E开始

if (sym=='#')

printf("分析成功!\n");

else

printf("分析失败!\n");

i=0; // 重新输入时,下标置0 }

}

void E()

{

if(sym=='i' || sym=='(')

{

pop();

push('G');

push('T');

printf("%d\t",total);

total++;

show();

output();

printf("E-->TG\n");

T();

G();

}

else

{

printf("error!\n");

exit(0);

}

}

void G()

{

if(sym=='+')

{

pop();

push('G');

push('T');

printf("%d\t",total++);

show();

output();

printf("G-->+TG\n");

pop();

printf("%d\t",total);

total++;

show();

advance();

output();

printf("\n");

T();

G();

}

else if(sym=='-')

{

pop();

push('G');

push('T');

push('-');

printf("%d\t",total++);

show();

output();

printf("G-->-TG\n");

pop();

printf("%d\t",total);

total++;

show();

advance();

output();

printf("\n");

T();

G();

}

else if(sym!=')' && sym!='#')

{

printf("error!\n");

exit(0);

}

else{

pop();

printf("%d\t",total++);

show();

output();

printf("G-->^\n");

}

}

void T()

{

if(sym=='i'||sym=='(')

{

pop();

push('S');

printf("%d\t",total);

total++;

show();

output();

printf("T-->FS\n");

F();

S();

}

else

{

printf("error!\n");

exit(0);

}

}

void S()

{

if(sym=='*')

{

pop();

push('S');

push('F');

push('*');

printf("%d\t",total++);

show();

output();

printf("S-->*FS\n");

pop();

printf("%d\t",total);

total++;

show();

advance();

output();

printf("\n");

F();

S();

}

else if(sym=='/')

{

pop();

push('S');

push('F');

push('/');

printf("%d\t",total++);

show();

output();

printf("S-->/FS\n");

pop();

printf("%d\t",total);

total++;

show();

advance();

output();

printf("\n");

F();

S();

}

else if((sym!='+')&&(sym!='-')&&(sym!=')')&&(sym!='#')) {

printf("error!\n");

exit(0);

}

else{

pop();

printf("%d\t",total++);

show();

output();

printf("S-->^\n");

}

}

void F()

{

if(sym=='(' )

{

pop();

push(')');

push('E');

push('(');

printf("%d\t",total++);

show();

output();

printf("F-->(E)\n");

pop();

printf("%d\t",total);

total++;

show();

advance();

output();

printf("\n");

E();

if(sym==')')

{

pop();

printf("%d\t",total);

total++;

show();

advance();

output();

printf("F-->(E)\n");

}

else

{

printf("error!\n");

exit(0);

}

}

else if(sym=='i')

{

pop();

push('i');

printf("%d\t",total);

total++;

show();

output();

printf("F-->i\n");

pop();

printf("%d\t",total);

total++;

show();

advance();

output();

printf("\n");

}

else

{

printf("error!\n");

exit(0);

}

}

void input()

{

printf("请输入需识别的句子以‘#’号结尾:");

scanf("%s",a);

str_len=strlen(a);

str[0]='#';

total=0;

str[1]='E';

Num=2;

i=0;

printf("步骤\t符号栈\t输入串\t所用产生式\n");

printf("%d\t",total++);

show();

output();

printf("\n");

}

void output()

{

int j;

for(j=i-1;j

printf("%c",a[j]);

printf("\t");

}

void advance()

{

sym=a[i];

i++;

}

5、实验结果

本次实验的测试数据为:i* i+i+i

实验的现象为:error right,分析输入表达式是否正确

实验结果屏幕截图:

6、实验小结

通过本次试验实践掌握了自上而下语法分析法的特点。掌握了递归下降语法分析的基本原理和方法。运用递归下降分析法完成了本试验的语法分析构造,并且成功的分析出每种正确的句子和错误的句子。函数的构造是根据文法分析的递归过程,所编写每个函数的功能,以文法的右部为函数名,对应的左部为相应分析过程。此分析法简单,直观,易构造分析程序,但是不适于文法过于复杂的,不易检查出错误。在试验的过程中,遇到了一些问题,都是粗心大意而造成,并非是对文法分析和编程的熟悉问题,说明了我再以后的试验中应该更细心的编写程序的每一步,对于本次试验所出现的马虎,应该牢记,以后不再犯同样的错误。

实验三编写语法分析分析器

1、实验目的和要求

通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。

1、选择最有代表性的语法分析方法,如LL(1) 语法分析程序、算符优先分析程序和LR分析分析程序,并至少完成两个题目。

2、选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。

⑴实习前的准备按实习目的和要求,编写语法分析程序,同时考虑相应的数据结构。

⑵调试调试例子应包括符合语法规则的算术表达式,以及分析程序能够判别的若干错例。

⑶输出对于所输入的算术表达式,不论对错,都应有明确的信息告诉外界。

⑷扩充有余力的同学,可适当扩大分析对象。譬如:①算术表达式中变量名可以是一般标识符,还可含一般常数、数组元素、函数调用等等。②除算术表达式外,还可扩充分析布尔、字符、位等不同类型的各种表达式。③加强语法检查,尽量多和确切地指出各种错误。⑸编写上机实习报告。

2、实验内容

题目、编写LL(1)语法分析分析器。

要求:(a)根据LL(1)分析法总控制流程图,编写一个分析对象的语法分析程序。可根据自己的能力选择以下三项(由易到难)之一作为分析算法中的输入:Ⅰ:直接输入根据已知文法人工构造的分析表M。Ⅱ:输入已知文法的集合FIRST(x)和FOLLOW(U),由程序自动生成该文法的分析表M。

Ⅲ:输入已知文法,由程序自动生成该文法分析表M。(b)程序具有通用性,即所编制的LL(1)语法分析程序能够适用于不同文法以及各种输入单词串,并能判断该文法是否为算符文法和算符优先文法。(c)有运行实例。对于输入的一个文法和一个单词串,所编制的语法分析程序应能正确地判断,此单词串是否为该文法的句子,并要求输出分析过程。

3、实验代码

#include

#include

#include

using namespace std;

struct Node1

{ char vn;

char vt;

char s[10];

}MAP[20];//存储分析预测表每个位置对应的终结符,非终结符,产生式

int k;

//用R代表E',W代表T',e代表空

char start='E';

int len=8;

char

G[10][10]={"E->TR","R->+TR","R->e","T->FW","W->*FW","W->e","F->(E)","F->i"};//存储文法中的产生式

char VN[6]={'E','R','T','W','F'};//存储非终结符

char VT[6]={'i','+','*','(',')','#'};//存储终结符

char SELECT[10][10]={"(,i","+","),#","(,i","*","+,),#","(","i"};//存储文法中每

个产生式对应的SELECT集

char Right[10][8]={"->TR","->+TR","->e","->FW","->*FW","->e","->(E)","->i"}; //用R代表A',W代表B',e代表空

/*char start='A';

int len=6;

char G[10][10]={"A->aR","R->ABl","R->e","B->dW","W->bW","W->e"};

char VN[6]={'A','R','B','W'};

char VT[6]={'a','d','b','#','l'};

char SELECT[10][10]={"a","a","d,#","d","b","l"};

char Right[10][6]={"->aR","->ABl","->e","->dW","->bW","->e"};*/

stack stak;

bool compare(char *a,char *b)

{ int i,la=strlen(a),j,lb=strlen(b);

for(i=0;i

for(j=0;j

{ if(a[i]==b[j])

return 1; }

return 0;}

char *Find(char vn,char vt)

{ int i;

for(i=0;i

{ if(MAP[i].vn==vn && MAP[i].vt==vt)

return MAP[i].s;}

return "error";}

char * Analyse(char * word)

{ char p,action[10],output[10];

int i=1,j,l=strlen(word),k=0,l_act,m;

while(!stak.empty())

stak.pop();

stak.push('#');

stak.push(start);

printf("___________________________________________________________\n");

printf("\n 对符号串%s的分析过程\n",word);

printf("

-----------------------------------------------------------------------\n"); printf("\n");

printf(" 步骤栈顶元素剩余输入串动作\n");

printf("

-----------------------------------------------------------------------\n"); p=stak.top();

while(p!='#')

{ printf("%7d ",i++);

p=stak.top();

stak.pop();

printf("%6c ",p);

for(j=k,m=0;j

output[m++]=word[j];

output[m]='\0';

printf("%10s",output);

if(p==word[k])

{ if(p=='#')

{ printf(" 分析成功 \n");

return "SUCCESS";}

printf(" 匹配终结符“%c”\n",p);

k++;}

else

{ strcpy(action,Find(p,word[k]));

if(strcmp(action,"error")==0)

{ printf(" 没有可用的产生式\n");

return "ERROR"; }

printf(" 展开非终结符%c%s\n",p,action);

int l_act=strlen(action);

if(action[l_act-1]=='e')

continue;

for(j=l_act-1;j>1;j--)

stak.push(action[j]);}

} if(strcmp(output,"#")!=0)

return "ERROR";

}

int main ()

{ freopen("in1.txt","r",stdin);

//freopen("in2.txt","r",stdin);

char source[100];

int i,j,flag,l,m;

//printf("\n***为了方便编写程序,用R代表E',W代表T',e代表空*****\n\n");

printf("\n****为了方便编写程序,用R代表A',W代表B',e代表空*****\n\n");

printf("该文法的产生式如下:\n");

for(i=0;i

printf(" %s\n",G[i]);

printf("___________________________________________________________\n");

printf("\n该文法的SELECT集如下:\n");

for(i=0;i

{ printf(" SELECT(%s) = { %s }\n",G[i],SELECT[i]); }

printf("___________________________________________________________\n");

//判断是否是LL(1)文法

flag=1;

for(i=0;i<8;i++)

{ for(j=i+1;j<8;j++)

{if(G[i][0]==G[j][0])

{ if(compare(SELECT[i],SELECT[j]))

{flag=0;break;}

}

} if(j!=8)

break; }

if(flag)

printf("\n有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文

法。\n");

else

printf("\n有相同左部产生式的SELECT集合的交集不为空,所以文法不是LL(1)

文法。\n");

printf("___________________________________________________________\n");

//预测分析表

for(i=0,k=0;i<8;i++)

{ l=strlen(SELECT[i]);

for(j=0;j

{ MAP[k].vn=G[i][0];

MAP[k].vt=SELECT[i][j];

strcpy(MAP[k].s,Right[i]);

k++; }}

printf("\n表达式文法的预测分析表如下:\n\n");

printf(" ");

for(i=0;i<6;i++)

printf("%10c",VT[i]);

printf("\n");

for(i=0;i<5;i++)

{ printf("

---------------------------------------------------------------\n"); printf("%10c",VN[i]);

for(j=0;j<6;j++)

{ for(m=0;m

{ if(VN[i]==MAP[m].vn && VT[j]==MAP[m].vt)

{ printf("%10s",MAP[m].s);

break;}

} if(m==k)

printf(" ");}

printf("\n");}

/*预测分析程序Analyse函数*/

//输入源文件串

while(cin>>source)

{ printf("\n分析结果:%s\n\n",Analyse(source));}

while(1);

return 0;}

4、实验结果

(1)对符号串i+i*i的分析过程如下所示:

(2)对符号串aadbl的分析过程如下所示:

5、实验小结

通过本次实验基本掌握了语法分析的原理和LL(1)语法分析方法,以及预测分析表的构造;进一步熟悉了语法分析的详细过程。通过编写程序进一步复习巩固了c语言和数据结构的相关知识,尤其是加深了对栈相关知识的印象;在编程过程中遇到了很多基础性问题,通过不断的查阅课本,最终解决了问题,但程序仍然存在很多值得改进和完善的地方,这就提醒我们在以后的学习过程当中应该及时复习巩固以前学过的相关知识。

编译原理实验报告

课程实验报告课程名称:《编译原理》 专业班级:计算机科学与技术11级10班 学号:XXXXXXX 姓名:X X 指导教师:刘铭 报告日期:2014年6月16日

计算机科学与技术学院 目录 目录 (2) 1 实验一词法分析 (3) 1.1实验目的 (3) 1.2实验要求 (3) 1.3算法思想 (4) 1.4实验程序设计说明 (5) 1.5词法分析实现 (6) 1.6词法实验结果及结果分析 (12) 2 实验二语法分析 (13) 2.1 实验目的 (13) 2.2 实验要求 (13) 2.3 算法思想 (13) 2.4 实验程序设计说明 (15) 2.5 语法分析实现 (15) 4 实验中遇到的问题及解决 (22) 参考资料 (23)

1 实验一词法分析 1.1 实验目的 设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。 1.2 实验要求 1、待分析的简单的词法 (1)关键字: begin if then while do end 所有的关键字都是小写。 (2)运算符和界符 := + - * / < <= <> > >= = ; ( ) # (3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义: ID = letter (letter | digit)* NUM = digit digit* (4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。 2、各种单词符号对应的种别码: 表1 各种单词符号对应的种别码 3、词法分析程序的功能: 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码; token为存放的单词自身字符串;

编译原理实验报告二

内蒙古工业大学信息工程学院实验报告 课程名称:编译原理 实验名称:语法制导把表达式翻译成逆波兰式 实验类型:验证性□ 综合性□ 设计性□ 实验室名称: 班级:学号 姓名:组别: 同组人:成绩: 实验日期:

一、实验目的 通过上机实习加深对语法指导翻译原理的理解,掌握运算符优先权的算法,将语法分析所识别的表达式变换成中间代码的翻译方法。 二、实验题目 语法制导把表达式翻译成逆波兰式 三、要求及提示 1、从左到右扫描中缀表达式,经语法分析找出中缀表达式出现的错误并给出错误的具体位置和类型。 2、设一个运算符栈存放暂时不能出现的运算符,逆波兰区存放逆波兰表达式。 3、测试所编程序,给出正确和错误的结果。 4、工具:C语言或其它高级语言 5、实验时间:4学时

实验二语法制导把表达式翻译成逆波兰式 一、实验名称 语法制导把表达式翻译成逆波兰式 二、实验目的 通过上机实习加深对语法指导翻译原理的理解,进一步掌握语法制导翻译的概念,掌握运算符优先权的算法,将语法分析所识别的表达式变换成中间代码的翻译方法。 三、表达式生成逆波兰式的算法 1、初始化△送到运算符栈。 2、扫描左括号“(”,把△送到运算符栈。 3、扫描到变量,把它送到逆波兰区。 4、扫描到运算符 (1)栈内运算符比较 a.栈内运算符>=栈外运算符,把栈内运算符送到逆波兰区。 b.栈内运算符<栈外运算符,把栈外运算符入栈。 ( 2 ) 栈内是△把运算符入栈。 5、扫描右括号“)”。 ( 1 )栈内是运算符,把栈内运算符送到逆波兰区。 ( 2 )栈内是△则△退栈,读入下一个字符。 6、扫描到#(结束符) ( 1 )栈内是运算符,把栈内运算符送到逆波兰区。 ( 2 )栈内是△结束,否则继续分析。 四、程序清单 #include #include int main(){ char str[100]; char exp[100]; char stack[100]; char ch; int flag=1;

编译原理实验报告

编译原理实验报告 姓名: 学号: 班级: 学院: 南昌大学信息工程学院计算机系 2014年6月

目录 实验一 (3) 实验二 (8) 实验三 (15)

实验1 词法分析程序的设计 学生姓名:学号:专业班级: 实验类型:□验证□综合□设计□创新实验日期:实验成绩: 一、实验目的 掌握计算机语言的词法分析程序的开发方法。 二、实验内容 编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。 三、实验要求 1、根据以下的正规式,编制正规文法,画出状态图; 标识符<字母>(<字母>|<数字字符>)* 十进制整数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)(0|1|2|3|4|5|6|7)* 十六进制整数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)* 运算符和界符+ - * / > < =<= >=( ) ;{ } 关键字main if then else while do int (可根据需要添加) 2、根据状态图,设计词法分析函数int scan( ),完成以下功能: 1)从文本文件中读入测试源代码,根据状态转换图,分析出一个单词, 2)以二元式形式输出单词<单词种类,单词属性> 其中单词种类用整数表示: 0:标识符 1:十进制整数 2:八进制整数 3:十六进制整数 运算符和界符,关键字采用一字一符,不编码 其中单词属性表示如下: 标识符,整数由于采用一类一符,属性用单词表示 运算符和界符,关键字采用一字一符,属性为空 3、编写测试程序,反复调用函数scan( ),输出单词种别和属性。 四、实验环境 PC微机 DOS操作系统或Windows 操作系统 Turbo C 程序集成环境或Visual C++ 程序集成环境

编译原理实验报告《LL(1)语法分析器构造》

《LL(1)分析器的构造》实验报告 一、实验名称 LL(1)分析器的构造 二、实验目的 设计、编制、调试一个LL(1)语法分析器,利用语法分析器对符号串的识别,加深对语法分析原理的理解。 三、实验内容和要求 设计并实现一个LL(1)语法分析器,实现对算术文法: G[E]:E->E+T|T T->T*F|F F->(E)|i 所定义的符号串进行识别,例如符号串i+i*i为文法所定义的句子,符号串ii+++*i+不是文法所定义的句子。 实验要求: 1、检测左递归,如果有则进行消除; 2、求解FIRST集和FOLLOW集; 3、构建LL(1)分析表; 4、构建LL分析程序,对于用户输入的句子,能够利用所构造的分析程序进行分析,并显示出分析过程。 四、主要仪器设备 硬件:微型计算机。 软件: Code blocks(也可以是其它集成开发环境)。 五、实验过程描述 1、程序主要框架 程序中编写了以下函数,各个函数实现的作用如下: void input_grammer(string *G);//输入文法G

//将文法G预处理得到产生式集合P,非终结符、终结符集合U、u, int eliminate_1(string *G,string *P,string U,string *GG);//消除文法G中所有直接左递归得到文法GG int* ifempty(string* P,string U,int k,int n);//判断各非终结符是否能推导为空 string* FIRST_X(string* P,string U,string u,int* empty,int k,int n);求所有非终结符的FIRST集 string FIRST(string U,string u,string* first,string s);//求符号串s=X1X2...Xn的FIRST集 string** create_table(string *P,string U,string u,int n,int t,int k,string* first);//构造分析表 void analyse(string **table,string U,string u,int t,string s);//分析符号串s 2、编写的源程序 #include #include #include using namespace std; void input_grammer(string *G)//输入文法G,n个非终结符 { int i=0;//计数 char ch='y'; while(ch=='y'){ cin>>G[i++]; cout<<"继续输入?(y/n)\n"; cin>>ch; } } void preprocess(string *G,string *P,string &U,string &u,int &n,int &t,int &k)//将文法G预处理产生式集合P,非终结符、终结符集合U、u, { int i,j,r,temp;//计数 char C;//记录规则中()后的符号 int flag;//检测到() n=t=k=0; for( i=0;i<50;i++) P[i]=" ";//字符串如果不初始化,在使用P[i][j]=a时将不能改变,可以用P[i].append(1,a) U=u=" ";//字符串如果不初始化,无法使用U[i]=a赋值,可以用U.append(1,a) for(n=0;!G[n].empty();n++) { U[n]=G[n][0]; }//非终结符集合,n为非终结符个数 for(i=0;i

编译原理实验报告

院系:计算机科学学院 专业、年级: 07计科2大班 课程名称:编译原理 学号姓名: 指导教师: 2010 年11月17 日 组员学号姓名

实验 名称 实验一:词法分析实验室9205 实验目的或要求 通过设计一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 具体要求:输入为某语言源代码,达到以下功能: 程序输入/输出示例:如源程序为C语言。输入如下一段: main() { int a,b; a=10; b=a+20; } 要求输出如下(并以文件形式输出或以界面的形式输出以下结果)。 (2,”main”) (5,”(“) (5,”)“) (5,”{“} (1,”int”) (2,”a”) (5,”,”) (2,”b”) (5,”;”) (2,”a”) (4,”=”) (3,”10”) (5,”;”) (2,”b”) (4,”=”) (2,”a”) (4,”+”) (3,”20”) (5,”;”) (5,”}“) 要求: 识别保留字:if、int、for、while、do、return、break、continue等等,单词种别码为1。 其他的标识符,单词种别码为2。常数为无符号数,单词种别码为3。 运算符包括:+、-、*、/、=、>、<等;可以考虑更复杂情况>=、<=、!= ;单词种别码为4。分隔符包括:“,”“;”“(”“)”“{”“}”等等,单词种别码为5。

编译原理实验报告

编译原理实验报告 班级 姓名: 学号: 自我评定:

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 根据教学要求并结合学生自己的兴趣和具体情况,从具有代表性的高级程序设计语言的各类典型单词中,选取一个适当大小的子集。例如,可以完成无符号常数这一类典型单词的识别后,再完成一个尽可能兼顾到各种常数、关键字、标识符和各种运算符的扫描器的设计和实现。 输入:由符合或不符合所规定的单词类别结构的各类单词组成的源程序。 输出:把单词的字符形式的表示翻译成编译器的内部表示,即确定单词串的输出形式。例如,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码;VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和运算符,采用一词一类的编码形式;由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。另外,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上放置单词类别的助记符。 三、实现方法与环境 词法分析是编译程序的第一个处理阶段,可以通过两种途径来构造词法分析程序。其一是根据对语言中各类单词的某种描述或定义(如BNF),用手工的方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应的状态矩阵,该状态矩阵同控制程序便组成了编译器的词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序的另外一种途径是所谓的词法分析程序的自动生成,即首先用正规式对语言中的各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程序所应进行的语义处理工作,然后由一个所谓词法分析程序的构造程序对上述信息进行加工。如美国BELL实验室研制的LEX就是一个被广泛使用的词法分析程序的自动生成工具。 总的来说,开发一种新语言时,由于它的单词符号在不停地修改,采用LEX等工具生成的词法分析程序比较易于修改和维护。一旦一种语言确定了,则采用手工编写词法分析程序效率更高。 四、实验设计 1)题目1:试用手工编码方式构造识别以下给定单词的某一语言的词法分析程序。 语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。参考实现方法简述如下。 单词的分类:构造上述语言中的各类单词符号及其分类码表。 表I 语言中的各类单词符号及其分类码表 单词符号类别编码类别码的助记符单词值

编译原理实验报告一

实验一词法分析程序实现 一、实验目得与要求 通过编写与调试一个词法分析程序,掌握在对程序设计语言得源程序进行扫描得过程中,将字符流形式得源程序转化为一个由各类单词符号组成得流得词法分析方法 二、实验内容 基本实验题目:若某一程序设计语言中得单词包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符与四个算术运算符,试构造能识别这些单词得词法分析程序(各类单词得分类码参见表I)。 表I语言中得各类单词符号及其分类码表 输入:由符合与不符合所规定得单词类别结构得各类单词组成得源程序文件。 输出:把所识别出得每一单词均按形如(CLASS,VALUE)得二元式形式输出,并将结果放到某个文件中。对于标识符与无符号常数,CLASS字段为相应得类别码得助记符;V AL UE字段则就是该标识符、常数得具体值;对于关键字与运算符,采用一词一类得编码形式,仅需在二元式得CLASS字段上放置相应单词得类别码得助记符,V ALUE字段则为“空". 三、实现方法与环境 词法分析就是编译程序得第一个处理阶段,可以通过两种途径来构造词法分析程序.其一就是根据对语言中各类单词得某种描述或定义(如BNF),用手工得方式(例如可用C语言)构造词法分析程序。一般地,可以根据文法或状态转换图构造相应得状态矩阵,该状态矩阵连同控制程序一起便组成了编译器得词法分析程序;也可以根据文法或状态转换图直接编写词法分析程序。构造词法分析程序得另外一种途径就是所谓得词法分析程序得自动生成,即首先用正规式对语言中得各类单词符号进行词型描述,并分别指出在识别单词时,词法分析程

编译原理实验报告二

编译原理实验报告 题目构造识别字符串的自动机学院 专业 班级 学号 学生姓名 指导教师 西安思源学院教务处制 二〇一年

实验二构造识别符号串的自动机 一、实验目的 1 掌握形式语言与自动机的概念 2 了解正规集及有穷自动机的关系 3 能构造识别相应符号串的自动机 4 能构造词法分析程序所识别的各类单词的自动机 二、实验环境 Microsoft Visual C++ 6.0 三、实验内容 1 用高级语言编写程序:该程序能接受C++所有的标识符。 2 用高级语言编写程序:该程序能接受C++所有的常数(整数和定点小数)。 3 用高级语言编写程序:该程序能接受C++的所有保留字。 4 用高级语言编写程序:该程序能接受C++的所有界符、运算符。 四、设计说明 void main() { void find_word(); void show_all(); void Input(); Input(); cout<<"运行结果如下"<'||ch[i]=='('||ch[i]==')') { c[t]=ch[i]; t++; k++; j++; } else if(ch[i]==' '||ch[i]=='\t') { b[k]=' ';

编译原理pL0实验报告

一.课程设计要求 基本内容: (1)扩充赋值运算:*= 和/= (2)扩充语句(Pascal的FOR语句): ①FOR <变量>:=<表达式> TO <表达式> DO <语句> ②FOR <变量>:=<表达式> DOWNTO <表达式> DO <语句> 其中,语句①的循环变量的步长为2, 语句②的循环变量的步长为-2。 二.设计思路 在课内实验的基础上,额外增加*=和/=运算符和关键字的语义动作,以下是设计思路: 1. 扩充单词 在头文件pl0.h中的enum symbol中增加关键字forsym, tosym, downtosym, timeseqlsym,slasheqlsym,并修改关键字数#define symnum 46。 /*初始化*/ // ssym['*=']=timeseql; // ssym['/=']=slasheql; /*设置保留字名字,按照字母顺序,便于折半查找*/ strcpy(&(word[14][0]),"to"); /*增加后需要按序排列*/ strcpy(&(word[7][0]),"for");

strcpy(&(word[4][0]),"downto"); strcpy(&(word[3][0]),"do"); /*设置保留字符号*/ wsym[7]=forsym; wsym[14]=tosym; /*语法分析,获取一个符号*/ 在getsym()部分添加: else if(ch=='*'){ /** “*=” **/ getchdo; if(ch=='='){ sym=timeseql; getchdo; printf("check *= success!"); } else sym=times; } else if(ch=='/'){ /* “/=” */ getchdo; if(ch=='='){sym=slasheql; getchdo; printf("check /= success!");

编译原理实验报告总结

学年第学期《编译原理》实验报告 学院(系):计算机科学与工程学院 班级:11303070A 学号:11303070*** 姓名:无名氏 指导教师:保密式 时间:2016 年7 月

目录 1.实验目的 (1) 2.实验内容及要求 (1) 3.实验方案设计 (1) 3.1 编译系统原理介绍 (1) 3.1.1 编译程序介绍 (2) 3.1.2 对所写编译程序的源语言的描述 (2) 3.2 词法分析程序的设计 (3) 3.3 语法分析程序设计 (4) 3.4 语义分析和中间代码生成程序的设计 (4) 4. 结果及测试分析 (4) 4.1软件运行环境及限制 (4) 4.2测试数据说明 (5) 4.3运行结果及功能说明 (5) 5.总结及心得体会 (7)

1.实验目的 根据Sample语言或者自定义的某种语言,设计该语言的编译前端。包括词法分析,语法分析、语义分析及中间代码生成部分。 2.实验内容及要求 (1)词法分析器 输入源程序,输出对应的token表,符号表和词法错误信息。按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误; (2)语法分析器 输入token串,通过语法分析,寻找其中的语法错误。要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。 (3)语义分析和中间代码生成 输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生 成中间代码。要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。 实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。3.实验方案设计 3.1 编译系统原理介绍 编译器逐行扫描高级语言程序源程序,编译的过程如下: (1).词法分析 识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 (2).语法分析 一个语句看作一串记号(Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 (3).语义分析 语义分析器对各句子的语法做检查:运算符两边类型是否相兼容;该做哪些类型转换(例如,实数向整数赋值要"取整");控制转移是否到不该去的地方;是

编译原理实验题目及报告要求

编译原理上机实验试题 一、实验目的 通过本实验使学生进一步熟悉和掌握程序设计语言的词法分析程序的设计原理及相关的设计技术, 如何针对确定的有限状态自动机进行编程序;熟悉和 掌握程序设计语言的语法分析程序的设计原理、熟悉 和掌握算符优先分析方法。 二、实验要求 本实验要求:①要求能熟练使用程序设计语言编程;②在上机之前要有详细的设计报告(预习报告); ③要编写出完成相应任务的程序并在计算机上准确 地运行;④实验结束后要写出上机实验报告。 三、实验题目 针对下面文法G(S): S→v = E E→E+E│E-E│E*E│E/E│(E)│v │i 其中,v为标识符,i为整型或实型数。要求完成 ①使用自动机技术实现一个词法分析程序; ②使用算符优先分析方法实现其语法分析程序,在 语法分析过程中同时完成常量表达式的计算。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第一项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理: (1)单词分类:标识符,保留字,常数,运算符,分隔符等等 (2)单词类型编码 (3)自动机 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

1、题目(见“编译原理---实验题目.doc,“实验题目”中的第二项) 2、目的与要求(见“编译原理---实验题目.doc”) 3、设计原理:构造出算法优先关系表 4、程序流程框图 5、函数原型(参数,返回值) 6、关键代码(可打印,只打印关键代码) 7、调试: (1)调试过程中遇到的错误,如何改进的; (2)需要准备测试用例(至少3个,包含输入和输出)——(可打印) 8、思考: (1)你编写的程序有哪些要求是没有完成的,你觉得该采用什么方法去完成; (2)或者是你觉得程序有哪些地方可以进一步完善,简述你的完善方案。

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

编译原理实验报告

实验一 一、实验名称:词法分析器的设计 二、实验目的: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]);

编 译 原 理 实 验 报 告

编译原理实验报告 课程:编译原理 系别:计算机系 班级:11网络 姓名:王佳明 学号:110912049 教师:刘老师 实验小组:第二组 1

实验一熟悉C程序开发环境、进行简单程序的调试 实验目的: 1、初步了解vc++6.0环境; 2、熟悉掌握调试c程序的步骤: 实验内容: 1、输入下列程序,练习Turbo C 程序的编辑、编译、运行。 #include main() { printf(“Programming is fun.\n”); } 2、分析程序,预测其运行结果,并上机检测你的预测。 #include main() { printf(“*\n”); printf(“* * *\n”); printf(“* * * * *\n”); printf(“* * * * * * *\n”); } 3、下面是一个加法程序,程序运行时等待用户从键盘输入两个整数,然后求出它们的和并输出。观察运行结果(程序输出),上机验证该程序。 #include main() { int a,b,c; printf(“Please input a,b:”); scanf(“%d,%d”,&a,&b); c=a+b; printf(“%d+%d=%d\n”,a,b,c); } 2

实验二词法分析器 一、实验目的: 设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。 二、实验要求: 1.对给定的程序通过词法分析器弄够识别一个个单词符号,并以二元式(单词种别码,单词符号的属性值)显示。而本程序则是通过对给定路径的文件的分析后以单词符号和文字提示显示。 2.本程序自行规定: (1)关键字"begin","end","if","then","else","while","write","read", "do", "call","const","char","until","procedure","repeat" (2)运算符:"+","-","*","/","=" (3)界符:"{","}","[","]",";",",",".","(",")",":" (4)其他标记如字符串,表示以字母开头的标识符。 (5)空格、回车、换行符跳过。 在屏幕上显示如下: ( 1 , 无符号整数) ( begin , 关键字) ( if , 关键字) ( +, 运算符) ( ;, 界符) ( a , 普通标识符) 三、使用环境: Windows下的visual c++6.0; 四、调试程序: 1.举例说明文件位置:f:、、11.txt目标程序如下: begin x:=9 if x>0 then x:=x+1; while a:=0 do 3

编译原理实验报告

《编译原理》实验报告软件131 陈万全132852

一、需求分析 通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。 通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。 1、词法分析程序设计与实现 假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序。 输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。 输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。 2、语法分析程序设计与实现 选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的

一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。 G2[<算术表达式>]: <算术表达式>→<项> | <算术表达式>+<项> | <算术表达式>-<项> <项>→<因式>|<项>*<因式>|<项>/<因式> <因式>→<运算对象> | (<算术表达式>) 若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i 代表,则G2可写成: G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E) 输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID······输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。 3、语义分析程序设计与实现 对文法G2[<算术表达式>]中的产生式添加语义处理子程序,完成运算对象是简单变量(标识符)和无符号数的四则运算的计值处理,将输入的四则运算转换为四元式形式的中间代码。 输入:包含测试用例(由标识符、无符号数和+、?、*、/、(、)构成的算术表达式)的源程序文件。 输出:将源程序转换为中间代码形式表示,并将中间代码序列输出到文件中。 若源程序中有错误,应指出错误信息 二、设计思路 1、词法分析程序设计与实现 1)单词分类 为了编程的实现。我们假定要编译的语言中,全部关键字都是保留字,程序员不得将它们作为源程序中的标识符;作了这些限制以后,就可以把关键字和标识符的识别统一进行处理。即每当开始识别一个单词时,若扫视到的第一个字符为字母,则把后续输入的字母或数字字符依次进行拼接,直至扫视到非字母、数字字符为止,以期获得一个尽可能长的字母数字字符串,然后以此字符串查所谓保留字表(此保留字表要事先造好),若查到此字符串,则取出相应的类别码;反之,则表明该字符串应为一标识符。

编译原理实验报告:实验一编写词法分析程序

( 编译原理实验报告 , 实验名称:实验一编写词法分析程序 实验类型:验证型实验 指导教师:何中胜 专业班级:( 13软件四 姓名:丁越 学号: 实验地点:) 秋白楼B720

实验成绩: 日期:2016年 3 月 18 日

一、实验目的 通过设计、调试词法分析程序,实现从源程序中分出各种单词的方法;熟悉词法分析程序所用的工具自动机,进一步理解自动机理论。掌握文法转换成自动机的技术及有穷自动机实现的方法。确定词法分析器的输出形式及标识符与关键字的区分方法。加深对课堂教学的理解;提高词法分析方法的实践能力。通过本实验,应达到以下目标:[ 1、掌握从源程序文件中读取有效字符的方法和产生源程序的内部表示文件的方法。 2、掌握词法分析的实现方法。 3、上机调试编出的词法分析程序。 二、实验过程 以编写PASCAL子集的词法分析程序为例 1.理论部分 > (1)主程序设计考虑 主程序的说明部分为各种表格和变量安排空间。 数组 k为关键字表,每个数组元素存放一个关键字。采用定长的方式,较短的关键字后面补空格。 P数组存放分界符。为了简单起见,分界符、算术运算符和关系运算符都放在 p表中(编程时,还应建立算术运算符表和关系运算符表,并且各有类号),合并成一类。 id和ci数组分别存放标识符和常数。 instring数组为输入源程序的单词缓存。 ¥ outtoken记录为输出内部表示缓存。 还有一些为造表填表设置的变量。 主程序开始后,先以人工方式输入关键字,造 k表;再输入分界符等造p表。 主程序的工作部分设计成便于调试的循环结构。每个循环处理一个单词;接收键盘上送来的一个单词;调用词法分析过程;输出每个单词的内部码。 ⑵词法分析过程考虑 将词法分析程序设计成独立一遍扫描源程序的结构。其流程图见图 1-1。 …

编译原理实验报告2

学生学号实验课成绩 武汉理工大学 学生实验报告书 实验课程名称编译原理 开课学院计算机科学与技术学院 指导老师姓名饶文碧 学生姓名 学生专业班级

—学年第学期 实验课程名称:编译原理 实验项目名称单词的词法分析实验成绩 实验者专业班级组别 同组者实验日期 第一部分:实验分析与设计(可加页) 一、实验内容描述(问题域描述) 完成对某一种常用高级语言(如Pascal、C语言、PL/0语言)的各类单词进行词法分析,即对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词;并把其转换成属性字输出。 实验要求: (1)选择常用高级程序设计语言(如 Pascal、C语言、PL/0语言)的源程序作为词法分析对象。 (2)根据教学要求和学生具体情况,从上列语言之一中选取它的一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。其基本要求是:对源程序从左到右进行扫描,对组成源程序的字符串拼接成为单词,并把其转换成属性字输出。

二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑或者算法描述) #include #include #include #include char *table[7]={" ","main","int","if","then","else","return"},TOKEN[20],ch; //定义关键字 int lookup(char *TOKEN){ //关键字匹配函数 int m,i; for(i=1;i<6;i++){ if((m=strcmp(TOKEN,table[i]))==0) return(i); } return(0); } void out(int c,char *TOKEN){ //输出函数 printf("(%d,%s)\n",c,TOKEN); } void scanner(FILE *fp){ //扫描函数

编译原理实验报告(手打)

《编译原理》实验报告 班级:计C104 姓名:李云霄 学号:108490

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 三、实现方法与环境 1、首先设计识别各类单词的状态转换图。 描述无符号常数的确定、最小化状态转换图如图1所示。其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 图1 文法G[<无符号数>]的状态转换图 其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>, 1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。 四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢

编译原理实验报告

实验一词法分析程序实现 一、实验目的与要求 通过编写和调试一个词法分析程序,掌握在对程序设计语言的源程序进行扫描的过程中,将字符形式的源程序流转化为一个由各类单词符号组成的流的词法分析方法。 二、实验内容 选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。 三、实现方法与环境 1、首先设计识别各类单词的状态转换图。 描述无符号常数的确定、最小化状态转换图如图1所示。其中编号0,1,2, (6) 表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>,1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 图1 文法G[<无符号数>]的状态转换图 其中编号0,1,2,…,6代表非终结符号<无符号数>、<余留无符号数>、<十进小数>、<小数部分>、<指数部分>、<整指数>及<余留整指数>,1,2和6为终态,分别代表整数、小数和科学计数的识别结束状态。 在一个程序设计语言中,一般都含有若干类单词符号,为此可首先为每类单词建立一张状态转换图,然后将这些状态转换图合并成一张统一的状态图,即得到了一个有限自动机,再进行必要的确定化和状态数最小化处理,最后据此构造词法分析程序。 四则运算算术符号的识别很简单,直接在状态图的0状态分别引出相应标记的矢线至一个新的终态即可。根据自己的习惯,也可以将其转换为状态矩阵形式。 2、词法分析程序编写 根据描述语言中各类单词的文法状态转换图或状态矩阵,利用某种语言(C语言或JA V A 语言)直接编写词法分析程序。 3、词法分析程序测试 用于测试扫描器的实例源文件中应有词法正确的,也应有错误的字符串,对于输入的测试用例的源程序文件,以对照的形式将扫描器的分析结果信息在输出文件中表示出来。四、参考资料 实现无符号数识别的参考方法:将设计的状态转换图直接转化为一张程序流程图,并在外层再增加一个以EOF为循环终止条件的while循环,即形成能连续识别各类单词的词法分析程序。 各类单词的编码建议如表1。 表1 单词的内部编码

编译原理实验报告

实验一词法分析器的设计与实现 (1) 1)实验目的 (1) 2)实验内容 (1) 3)实验要求 (1) 4)实验原理 (1) 5)实验步骤 (1) 6)状态转化图及词法分析程序 (2) 7)测试 (7) 实验二语法分析器的设计与实现 (9) 1)实验目的 (9) 2)实验内容 (9) 3)实验要求 (9) 4)实验原理 (9) 5)实验步骤 (9) 6)语法分析程序 (10) 7)测试 (16)

编译原理实验报告 专业:计算机科学与技术 学生姓名: 学号: 48 完成时间:2020年11月25日

实验一词法分析器的设计与实现 1)实验目的 ①掌握正规式、状态转换图、C语言单词符号的划分及词法分析器的实现 ②掌握词法分析程序的作用和接口。 2)实验内容 设计及实现C语言程序的词法分析器。 3)实验要求 ①对任给的一个C语言源程序,能够虑掉空格、回车换行符、tab键及注释。 ②识别各类单词符号,如关键字、标识符、运算符、常数、界符,结果以二元式形式 输出。并构造符号表。 ③输出有词法错误的单词及所在行号。 4)实验原理 根据扫描到的单词符号的第一个字符的种类,分别转到相应的程序进行处理。这些程序的功能就是识别以相应字符开头的各类单词符号。

5)实验步骤 ①根据C语言各类单词的正规式,构造能识别各类单词的状态转换图。 ②根据状态转换图,构造识别各类单词的词法分析器。 6)状态转化图及词法分析程序

#include "" #include "" #include "" FILE *fp; int id; void main() { char cbuffer; char alphaprocess(char buffer); char digitprocess(char buffer); char otherprocess(char buffer); if ((fp=fopen("","r"))==NULL) /*以只读方式打开文件"",NULL在文件中已被定义为0*/ printf("error"); else { cbuffer=fgetc(fp); /*文件不为空则从文件中取字符*/ while (cbuffer!=EOF) /*EOF文件结束标志*/ { if(cbuffer==' '||cbuffer=='\n') /*掠过空格和回车符*/ { cbuffer=fgetc(fp); id=4; }

相关主题
文本预览
相关文档 最新文档