编译原理 c语言词法分析器 Microsoft Visual C++ 6.0
一实验目的 ................................................................................................................................................................................3 二实验内容 ................................................................................................................................................................................3 三实验要求 ................................................................................................................................................................................4 四,程序流程图 ........................................................................................................................................................................4 五,原程序代码 ........................................................................................................................................................................7 六,程序运行截图 ....................................................................................................................................................................7 七,个人体会和经验
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
......................................................................................................................................................17
2
1.加强对词法分析原理、方法和基本实现技术的理解;
2.灵活运用这学期所学的知识对词法分析,语法分析有进一步的理解; 3.强化对系统软件综合
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
实现能力的训练;
1.
调研报告
关于民族工作的调研报告关于就业的调研报告XX公司人才现状调研报告XX村综治维稳工作的调研报告干部职工思想状况调研报告
:
内容:关于编译器开发的工具的调研
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
通过网络,文献或书籍了解编译技术的发展过程,编译工具的市场,如各种语言如C,C++,Java等程序设计语言
对应的编译器,特点等发展过程,功能,特点等,常用的生成编译器的编译器如lex,YACC等工具的使用,甚至
是反编译器的使用。
可以就某一个编译器进行系统的介绍,也可以对多个编译器进行概述。最好与我们学过的内容相结合。
结构:目录、摘要、正文、小结、参考文献
2.代码调试
熟练了解PL/0编译程序并调试通过36页第7-8题。
第七题.正确的程序为:
var a,b,c;
begin
read(a,b);
c:=100;
if a>0 then
begin
b:=b+1;
write(b)
end;
write(a,b,c);
end.
第八题.(1) 扩充条件语句的语法图为:
then else 条件 语句 If
语句
EBNF的语法描述为:〈条件语句〉?if〈条件〉then〈语句〉[else〈语句〉] (2) 扩充repeat语句的语法图为:
3
resent Until 条件 语句
EBNF的语法描述为:〈repeat循环语句〉? repeat〈语句〉{;〈语句〉}until〈条件〉
3.程序设计(任选一部分完成)词法分析器
参考教材P43流程图及程序实现词法分析器
1.明确课设任务,复习与查阅有关资料
2.按要求完成课设内容,课设报告要求文字和图工整、思路清楚、正确。
3.注意增强程序界面的友好性。凡用户输入时,给出足够的提示信息使用户感到方便使用。
4.注意提高程序的可读性和可理解性:程序中应有适当的注释,变量命名应符合实际含义,程序结构清晰,
易于阅读和理解。
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号
的第一个字符的种类,拼出相应的单词符号。
3.1 主程序示意图:
主程序示意图如图3-1所示。其中初始包括以下两个方面: ? 关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在一张
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
中(称为关键字表),当扫描程序识别出标识符时,查
关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如
下:
char * keywords[38] =
{ "auto","default","do", "extern","goto",
"int","short","static","struct","switch",
"typedef","void","break","case","char",
"const","continue","double","else", "enum",
"float","for","if","long", "register",
"return","signed","zhaixinyuan","sizeof","union",
"unsigned","volatile","while","main","printf",
"scanf","include","define","string"
4
置初值
调用扫描子程序
输出单词二元组
否 输入串结束
是
结束
5
扫描子程序主要部分流程如图所示。
变量初始化
忽略空格
是 是
是否文件结束? 返回
否
字母
数字 其他
运算符、 符号 拼数 界符等符号
拼字符串
否
是 是否关键字?
对不同符号给报错 sign 出相应的值 标识200
Auter=1
返回
6
#include
#include
int i,j,k,sign,number,flag,run,sum,autuor; /*flag which is use to judge the string is keywords or not!*/ char ch;
char words[10] = {" "};
char program[500];
int Scan(char program[])
{ char * keywords[39] =
{ "auto","default","do", "extern","goto",
"int","short","static","struct","switch",
"typedef","void","break","case","char",
"const","continue","double","else", "enum",
"float","for","if","long", "register",
"return","signed","zhaixinyuan","sizeof","union",
"unsigned","volatile","while","main","printf",
"scanf","include","define","string"
};
number = 0;
flag = 0;
j = 0;
ch = program[i++];
/* To handle the lettle space ands tab*/
while ((ch == ' ') || (ch == '\r')||(ch=='\n'))
ch=program[i++]; //空格、回车、换行 /* 跳过不理睬 */
/*handle letters*/
if ((ch >= 'a') && (ch <= 'z' ))
{
while ((ch >= 'a') && (ch <= 'z' ))
{
words[j++]=ch;
ch=program[i++];
}
i--;
words[j++] = '\0';
for (k = 0; k < 38; k++)
if (strcmp (words,keywords[k]) == 0)//字符串比较,keywords[k]) == 0
{sign=k+1;flag=1;
if(k==27) autuor=1;
break;
}
7
if (flag == 0)
{ sign = 100; /*为关键字*/
}
}/* if 是关键字*/
/*handle digits*/
else if ((ch >= '0') && (ch <= '9'))
{ number = 0;
while ((ch >= '0' ) && (ch <= '9' ))
{ number = number*10+(ch-'0');
ch = program[i++];
}
sign = 200; /*为数字*/
i--;
}
/*opereation and edge handle*/
else switch (ch)
{
case '=':
{
if (ch == '=')
words[j++] = ch;
words[j] = '\0';
ch = program[i++];
if (ch == '=')
{words[j++] = ch;
words[j] = '\0';
sign= 401; /* = = */
}
else
{ i--; /*退回一个字符*/
sign = 402; /* = */
}
break;
}
case'>':
{ if (ch == '>')
words[j++] = ch;
words[j] = '\0';
ch = program[i++];
if (ch == '=')
{words[j++] = ch;
words[j] = '\0';
sign = 403; /* >= */
}
8
else if(ch=='>')
{ words[j++] =ch;
words[j] ='\0';
sign =419; /* >> */
}
else
{ i--;
sign = 404; /* > */
}
break;
}
case'<':
{if (ch == '<')
words[j++] = ch;
words[j] = '\0';
ch = program[i++];
if (ch == '=')
{ words[j++] = ch;
words[j] = '\0';
sign = 405;
}
else if(ch=='<')
{ words[j++] = ch;
words[j] = '\0';
sign = 420;
}
else
{ i--;
sign = 406;
}break;
}
case'!':
{if (ch == '!')
words[j++] = ch;
words[j] = '\0';
ch = program[i++];
if (ch == '=')
{words[j++] = ch;
words[j] = '\0';
sign= 407;
}
else
{i--;
sign= 408;
} break;
}
9
case'+':
{
if (ch == '+')
words[j++] = ch;
words[j] = '\0';
ch = program[i++];
if (ch == '=')
{ words[j++] = ch;
words[j] = '\0';
sign= 409;
}
else if (ch == '+')
{ words[j++] = ch;
words[j] = '\0';
sign= 410;
}
else
{i--;
sign = 411;
}
break;
}
case'-':
{if (ch == '-')
words[j++] = ch;
words[j] = '\0';
ch = program[i++];
if (ch == '=')
{ words[j++] = ch;
words[j] = '\0';
sign= 412;
}
else if( ch == '-')
{ words[j++] = ch;
words[j] = '\0';
sign= 413;
}
/* 负数的情况 */
else if((ch >= '0') && (ch <= '9'))
{while( (ch >= '0') && (ch <= '9') )
{words[j++] = ch;
ch = program[i++];
}
words[j] = '\0';
sign = 1000; /* 标志为1000 */
/* 负数 */
10
i--;
break;
}
else
{ i--;
sign = 414;
}break;
}
case'*':
{ if (ch == '*')
words[j++] = ch;
words[j] = '\0';
ch = program[i++];
if (ch == '=')
{words[j++] = ch;
words[j] = '\0';
sign = 415;
}
else
{
i--;
sign = 416;
}
break;
}
case'/':
{ if (ch == '/')
words[j++] = ch;
words[j] = '\0';
ch = program[i++];
if (ch == '=')
{
words[j++] = ch;
words[j] = '\0';
sign = 417;
}
else
{
i--;
sign = 418;
}
break;
}
case'^':
{
if(ch=='^')
11
words[j++] = ch;
words[j] = '\0';
sign =421;
break;
}
case';':
{
words[j] = ch;
words[j+1] = '\0';
sign = 501;
break;
}
case'(':
{
words[j] = ch;
words[j+1] = '\0';
sign = 502;
break;
}
case')':
{
words[j] = ch;
words[j+1] = '\0';
sign = 503;
break;
}
case'[':
{
words[j] = ch;
words[j+1] = '\0';
sign = 504;
break;
}
case']':
{
words[j] = ch;
words[j+1] = '\0';
sign = 505;
break;
}
case'{':
{
words[j] = ch;
words[j+1] = '\0';
sign = 506;
break;
12
}
case'}':
{
words[j] = ch;
words[j+1] = '\0';
sign = 507;
break;
}
case':':
{
words[j] = ch;
words[j+1] = '\0';
sign = 508;
break;
}
case'"':
{
words[j] = ch;
words[j+1] = '\0';
sign = 509;
break;
}
case'%':
{
if (ch == '%')
words[j++] = ch;
words[j] = '\0';
ch = program[i++];
if (ch == '=')
{
words[j++] = ch;
words[j] = '\0';
sign = 510;
}
else
{
i--;
sign = 511;
}
break;
}
case',':
{
words[j] = ch;
words[j+1] = '\0'; sign = 512;
13
break;
}
case'#':
{
words[j] = '#';
words[j+1] = '\0';
sign = 0;
break;
}
default:
{
sign = -1; /* 错误 */
break;
}
}
return sign;
}
void display()
{printf("Autuor: zhaixinyuan\n");
printf("class: 200720721102\n");
printf("time: 2010-07-10\n");
printf("Email: 510meinv@sina.com.cn\n");
printf("QQ: 1030243890\n");
}
int main()
{
i=0; run=1;
while(run)
{ int ent;
int j;
ent=autuor=sum=0;
for( j = 0; j < 500; j++)
program[j] = ' ';
for( j = 0; j < 10; j++)
words[j] = ' '; /* 初始化 */
printf("enter the program end with '#':\n");
do
{
ch = getchar();
program[i++] = ch;
}while(ch != '#');
i = 0;
do{sign = Scan(program);
if (sign == 200)
{printf("(number , %8d, %5d) ",number,sign);
sum++; ent=1;
14
}
else if (sign == -1)
{ printf("(error , %5d) ",sign);//出错
sum++; ent=1;
}
else if(sign>=1&&sign<=38)
{printf("(keyword , %8s, %5d) ",words,sign);
sum++; ent=1;
}
else if(sign>=401&&sign<=421)
{ printf("(operator, %8s, %5d) ",words,sign);//运算符
sum++; ent=1;
}
else if(sign>=501&&sign<=513)
{printf("(symbol , %8s, %5d) ",words,sign);//符号
sum++; ent=1;
}
if(sum%2==0&&ent==1) puts("\r"),ent=0;
}
while (sign != 0);
puts("\n");
if(autuor==1)display(), puts("\n");
printf("continue?(Y or N):");
getchar(); ch=getchar();
if(ch=='N'||ch=='n') run=0;
} return 0;
getchar();
} (1) 当程序开始时会出现程序输入界面,接着输入C语言原程序,如下面图(二)所示:
15
(2)按回车键后,程序就会运行并输出结果,如下面图(三)所示:
16
(3)此程序另外还加入了一个身体标志,当程序输入的单词中包含“zhaixinyuan” 的字符串是,运行程序后,会在正常输出的最后面出现几行关于个人身份信息。如下面图(四)所示:
(1)刚开始,这个程序是先看了网上的一个类似程序之后,在他的基础上面完善而得到了这个程序,
当然这个程序还有一些不足,如符号“&&“,”||”,”^”等不能识别,并且个别关键字也没有加入
进去,所以当遇到这些会以错误形式输出。 (2)看原程序时,总以为很简单,但真的当自已去做的的时候,发现原来程序的完善是无穷无尽的,
你只能做到更好,却做不到最好。
(3)在上理论课时,理性的觉得很难,当看到程序是如何识别一个一个关键字,一个一个字符的时
候,那成就感绝对加倍,感觉兴趣相当浓厚。
17