昆明理工大学 编译原理 实验二 语法分析器

  • 格式:doc
  • 大小:119.50 KB
  • 文档页数:11

下载文档原格式

  / 11
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

昆明理工大学信息工程与自动化学院学生实验报告

(2011 —2012 学年第 1 学期)

课程名称:编译原理开课实验室: 445 2011年 12 月 19日年级、专业、

计科093 学号200910405310 姓名孙浩川成绩

实验项目名称语法分析器指导教师严馨

师评语

该同学是否了解实验原理: A.了解□ B.基本了解□ C.不了解□

该同学的实验能力: A.强□ B.中等□ C.差□

该同学的实验是否达到要求: A.达到□ B.基本达到□ C.未达到□

实验报告是否规范: A.规范□ B.基本规范□ C.不规范□

实验过程是否详细记录: A.详细□ B.一般□ C.没有□

教师签名:

年月日

一、实验目的及内容

实验目的:编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检

查和结构分析。

实验内容:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。

已知待分析的C语言子集的语法,用EBNF表示如下:

<程序>→main()<语句块>

<语句块> →‘{’<语句串>‘}’

<语句串> → <语句> {; <语句> };

<语句> → <赋值语句> |<条件语句>|<循环语句>

<赋值语句>→ID=<表达式>

<条件语句>→if‘(‘条件’)’<语句块>

<循环语句>→while’(‘<条件>’)‘<语句块>

<条件> → <表达式><关系运算符> <表达式>

<表达式> →<项>{+<项>|-<项>}

<项> → <因子> {* <因子> |/ <因子>}

<因子> →ID|NUM| ‘(’<表达式>‘)’

<关系运算符> →<|<=|>|>=|==|!=

二、实验原理及基本技术路线图(方框原理图或程序流程图)

三、所用仪器、材料(设备名称、型号、规格等或使用软件)

1台PC以及VISUAL C++6.0软件

四、实验方法、步骤(或:程序代码或操作过程)

#include

#include

using namespace std;

char prog[80],token[8];

char ch;

int syn,p,m,n,sum,k=0;

char *key[6]={"main","int","char","if","else","while"};

void scaner();

void lrparser();

void yucu();

void statement();

void expression();

void term();

void factor();

void main()

{

p=0;

cout<<"语法分析"<

cout<<"请输入字符串,以“@”结尾:"<

do {ch = getchar(); prog[p++]=ch;}

while(ch!='@');

p=0;

scaner();

lrparser();

}

void scaner()

{

sum=m=0;

for(n=0;n<8;n++) token[n]=NULL;

ch=prog[p++];

while(ch==' ') ch=prog[p++];

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

{

while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')) {token[m++]=ch; ch=prog[p++];}

token[m++]='\0';

p--;

syn=10;

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

if(strcmp(token,key[n])==0)

{syn=n+1; break;}

}

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

{

while(ch>='0'&&ch<='9')

{

sum=sum*10+ch-'0';

ch=prog[p++];

}

p--;

syn=20;

}

else

switch(ch)

{

case '<': m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='<') {syn=33; token[m++]=ch;}

else if(ch=='=') {syn=35; token[m++]=ch;}

break;

case '>': m=0;token[m++]=ch;

ch=prog[p++];

if(ch=='=') {syn=34; token[m++]=ch;}

else {syn=32; p--;}

break;

case '=':token[m++]=ch;

ch=prog[p++];

if(ch=='=')

{ syn=36;

token[m++]=ch;

}