- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
山东理工大学编译原理词法分析实验报告
实验报告
——词法分析程序设计
【实验项目】
了解词法分析的主要任务。2、熟悉编译程序的编制。
【实验要求】
1、构造一个小语言的文法;
2、设计单词的输出形式,单词的种类和值的表示方法;
3、编写词法分析程序cffx.c;
4、生成并输出单词符号表。
【实验内容】
根据某文法,构造一个基本词法分析程序。找出该语言的关键字、标识符、整数以及其他一些特殊符号,给出单词表(内容包括单词种类和值),构造符号表(内容包括name、kind、value和address等)。
【实验步骤】
1. 类C语言子集的文法
G[程序]:程序→分程序
分程序→程序首部{程序体}
程序首部→program 标识符:
程序体→语句序列
语句序列→语句序列;语句|语句
标识符→字母|标识符字母|标识符数字
语句→定义语句|输入语句|复合语句|输出语句
类型→int | double | llint | lldouble
定义表→标识符|标识符,定义表
定义语句→类型定义表
输入语句→scanf(类型,标识符)
复合语句→赋值语句|循环语句|条件语句
输出语句→printf(类型,标识符)
赋值语句→标识符=表达式
循环语句→for型循环语句|while型循环语句
for型循环语句→for(表达式;表达式;表达式){语句|表达式}
while型循环语句→while(表达式){语句|表达式}
条件语句→if(表达式){语句|表达式}else{语句|表达式}
表达式→因式运算符因式|因式运算符;
运算符→=|==|#||=||=|++|--|+|-|*|/|%
因式→(表达式)|标识符|数字|数字数字
字母→a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z
数字→0|1|2|3|4|5|6|7|8|9
2.单词分类
1 、keyword (关键字):program | int | double | llint | lldouble | scanf | printf | for | while | if |else 2 、identification (标识符): a|b|c|……3 、digit(数据):0|1|2|3|4|……4 、operatorsign (运算符):=|==|#||=||=|+ +|- -|+|-|*|/|%
boundarysign(界符):{ } |( )| :| ;| ,
词法分析源程序
/**********************头文件**********************/
#include stdio.h
#include string.h
#include conio.h
#include ctype.h
/*********************全局变量*********************/
char word[20];/*暂存单词*/
char test[500],*p;
int count=1;
char Keyword[11][10]={program,int,double,llint,lldouble,scanf,printf,for,while,if,else};//关键字数组
char Operatorsign[14][10]={=,==,#,,=,,=,++,--,+,-,*,/,%};//运算符数组
/*****************函数1:关键字、标识符识别****************/
char alpha()
{
int i=0,j=0;/*j=0是标识符,j=1是关键字*/
char *opp;
while(isalnum(*p))/*检查是字母还是数字,如果是字母返回1,是数字返回2*/
{
word[i]=*p;
p++;i++;
}
opp=word;
for(i=0;i11;i++)/*把字母与关键字表核对,如果是关键字就设置j=1*/
{
if(!(strcmp(opp,Keyword[i])))/*比较两个字符串*/
{
printf( %d Keyword %s\n,count,opp); /*识别关键字*/
j=1;
}
}
if(j==0) printf( %d Identification %s\n,count,opp); /*识别标识符*/
p--; /*回退多读进的字符*/
return 0;
}
/*****************函数2:数据识别******************/
char digit()
{
int i=0;
while(isdigit(*p))/*如
文档评论(0)