作业9月30号

1、              词法分析的功能:

词法分析器的主要任务是读入源程序的输入字符、将它们组成词素,生成并输出一个词法单元序列,每个词法单元对应于一个词素。

当词法分析器发现了一个标识符的词素时,要将这个词素添加到符号表中。

其他任务:

  • 过滤掉源程序中的注释和空白。
  • 将编译器生成的错误信息与源程序的位置联系起来。记录行号等。

词法分析器的两个级联的处理阶段:

  1. 扫描阶段:简单处理,删除注释,压缩空白字符。
  2. 词法分析阶段:处理扫描阶段的输出并生成词法单元。


2、符号与种别码对照表

单词符号


#


begin


if


then


while


do


End


+


-


*


/


:


: =


种别码


0


1


2


3


4


5


6


13


14


15


16


17


18


单词符号


<


<>


<=


>


>=


=


;


(


)


Letter(letter|digit)


digit digit*


种别码


20


21


22


23


24


25


26


27


28


10


11

二。符号与种别码的对照表以及源程序。

我所做的词法分析程序和大多数程序差不多,也有着很多的不足,我将需要进行翻译的各种单词符号的对应的种别码分成了若干个数组,并且在后期的修改中将老师的种别表进行了扩充,具体的功能是:输入需要翻译的东西作为字符串存储在A[][]的数组中,用字符ch来存储一个个的字符,在一次的循环中翻译出一个个种别类并将其用(,)来显示出来,一次循环,用数组TOKEN[]存储,进行下一次循环的同时清除里面的数据,方便进行下一次的翻译与存储。大致是如此。

源代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char TOken[10];//分开进行比较
char ch;
/*char rwtab[6]={"begin","if","then","while","do","end"};*/
char r1[]={"auto"};
char r2[]={"break"};
char r3[]={"case"};
char r4[]={"char"};
char r5[]={"const"};
char r6[]={"continue"};
char r7[]={"default"};
char r8[]={"do"};
char r9[]={"double"};
char r10[]={"else"};
char r11[]={"enum"};
char r12[]={"extern"};
char r13[]={"float"};
char r14[]={"for"};
char r15[]={"goto"};
char r16[]={"if"};
char r17[]={"int"};
char r18[]={"long"};
char r19[]={"register"};
char r20[]={"return"};
char r21[]={"short"};
char r22[]={"signed"};
char r23[]={"sizeof"};
char r24[]={"static"};
char r25[]={"struct"};
char r26[]={"switch"};
char r27[]={"typedef"};
char r28[]={"union"};
char r29[]={"unsigned"};
char r30[]={"void"};
char r31[]={"volatile"};
char r32[]={"while"};
char r33[]={"end"};
char r34[]={"include"};
char r35[]={"stdio"};
char r36[]={"string"};
char r37[]={"main"};
char r38[]={"stdlib"};//这是我定义的
char A[10000];//输入的所有值
int syn,row;
int n,m,p,sum,j;
static int i = 0;
void scaner();
int main()
{
row = 0 ;
p = 0 ;
printf("Please input string:(end of ‘@‘)\n");
do
{
scanf("%c",&ch);
A[p]=ch;
p++;
}//输入值到数组A【】中,以@结束
while(ch!=‘@‘);
do
{
scaner();//进入函数进行判定
switch(syn)
{
case 40: printf("(%d,%d)\n",syn,sum); break;//如果是40,那么就是数字
case 0: printf("(%d,%c)\n",syn,TOken[0]);break;//如果是0,那么是@ 结束
case -2: row=row++;break;
default: printf("(%d,%s)\n",syn,TOken);break;//否则,就是变量名、关键词
}
}
while (syn!=0);
}
void scaner()
{
/*
共分为三大块,分别是标示符、数字、符号,对应下面的 if else if 和 else

*/
for(n=0;n<7;n++)
TOken[n]=0;//每次循环完就清零
ch=A[i];
while(ch==‘ ‘||ch==‘\n‘)//如果字符是空格或者回车,跳过
{
i++;
ch=A[i];
}
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;m++;
i++;ch=A[i];
}
TOken[m]=‘\0‘;
//将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2......
if(strcmp(TOken,r1)==0){syn=1;}
else if(strcmp(TOken,r2)==0){syn=2; }
else if(strcmp(TOken,r3)==0){syn=3;}
else if(strcmp(TOken,r4)==0){syn=4;}
else if(strcmp(TOken,r5)==0){syn=5;}
else if(strcmp(TOken,r6)==0){syn=6;}
else if(strcmp(TOken,r7)==0){syn=7;}
else if(strcmp(r8,TOken)==0){syn=8;}
else if(strcmp(r9,TOken)==0){syn=9;}
else if(strcmp(r10,TOken)==0){syn=10;}
else if(strcmp(r11,TOken)==0){syn=11;}
else if(strcmp(r12,TOken)==0){syn=12;}
else if(strcmp(r13,TOken)==0){syn=13;}
else if(strcmp(r14,TOken)==0){syn=14;}
else if(strcmp(r15,TOken)==0){syn=15;}
else if(strcmp(r16,TOken)==0){syn=16;}
else if(strcmp(r17,TOken)==0){syn=17;}
else if(strcmp(r18,TOken)==0){syn=18;}
else if(strcmp(r19,TOken)==0){syn=19;}
else if(strcmp(r20,TOken)==0){syn=20;}
else if(strcmp(r21,TOken)==0){syn=21;}
else if(strcmp(r22,TOken)==0){syn=22;}
else if(strcmp(r23,TOken)==0){syn=23;}
else if(strcmp(r24,TOken)==0){syn=24;}
else if(strcmp(r25,TOken)==0){syn=25;}
else if(strcmp(r26,TOken)==0){syn=26;}
else if(strcmp(r27,TOken)==0){syn=27;}
else if(strcmp(r28,TOken)==0){syn=28;}
else if(strcmp(r29,TOken)==0){syn=29;}
else if(strcmp(r30,TOken)==0){syn=30;}
else if(strcmp(r31,TOken)==0){syn=31;}
else if(strcmp(r32,TOken)==0){syn=32;}
else if(strcmp(r33,TOken)==0){syn=33;}
else if(strcmp(r34,TOken)==0){syn=34;}
else if(strcmp(r35,TOken)==0){syn=35;}
else if(strcmp(r36,TOken)==0){syn=36;}
else if(strcmp(r37,TOken)==0){syn=37;}
else if(strcmp(r38,TOken)==0){syn=38;}
else{syn=100;} //变量名
}
else if((ch>=‘0‘&&ch<=‘9‘)) //数字
{
sum=0;
while((ch>=‘0‘&&ch<=‘9‘))
{
sum=sum*10+ch-‘0‘;//显示其数字sum
i++;
ch=A[i];
}
syn=40;
}
else switch(ch) //其他字符
{
case‘<‘:m=0;TOken[m]=ch;m++;
i++;ch=A[i];
if(ch==‘=‘)//<>为22
{
syn=41;
TOken[m]=ch;m++;i++;
}
else
{
syn=46;
}
break;
case‘>‘:m=0;TOken[m]=ch;m++;
i++;ch=A[i];
if(ch==‘=‘)
{
syn=42;
TOken[m]=ch;m++;i++;
}
else
{
syn=47;
}
break;
case‘:‘:m=0;TOken[m]=ch;m++;
i++;ch=A[i];
if(ch==‘=‘)
{
syn=44;
TOken[m]=ch;m++;i++;
}
else
{
syn=49;
}
break;
case‘@‘:syn=0;TOken[0]=ch;i++;break;
case‘=‘:syn=48;TOken[0]=ch;i++;break;
case‘#‘:syn=50;TOken[0]=ch;i++;break;
case‘+‘:syn=50;TOken[0]=ch;i++;break;
case‘-‘:syn=51;TOken[0]=ch;i++;break;
case‘*‘:syn=52;TOken[0]=ch;i++;break;
case‘/‘:syn=53;TOken[0]=ch;i++;break;
case‘(‘:syn=54;TOken[0]=ch;i++;break;
case‘)‘:syn=55;TOken[0]=ch;i++;break;
case‘{‘:syn=56;TOken[0]=ch;i++;break;
case‘}‘:syn=57;TOken[0]=ch;i++;break;
case‘;‘:syn=58;TOken[0]=ch;i++;break;
case‘.‘:syn=59;TOken[0]=ch;i++;break;
case‘\‘‘:syn=60;TOken[0]=ch;i++;break;
case‘\n‘:syn=-2;break;
default: syn=-1;break;
}
}

/*这是我定义的种别类 符号:

@ 0 # 33
auto 1 
break 2 
case 3 
char 4 
const 5 
continue 6 
default 7 
do 8 
double 9 
else 10 
enum 11 
extern 12
float 13 
for 14 
goto 15 
if 16 
int 17 
long 18
register 19 
return 20
short 21
signed 22
sizeof 23
static 24
struct 25
switch 26
typedef 27
union 28
unsigned 29
void 30
volatile 31
while 32
end 33
include 34
stdio 35
string 36
main 37
stdlib 38
qita 100
number 40

#      33

<=     41

>=     42

==     43

:=     44

<>     45

<      46

>      47

=      48

:      49

+  50

-  51

*  52

/  53

(  54

)  55

{  56

}  57

;  58

.  59

*/

三 .用文法描述词法规则。

这个概念我不是太懂,但是也说说自己的理解和想法。

首先是文法形式的定义:A-〉B ,A代表的是左部符号,‘-〉’意思是为生成,而B代表的是右部的符号串。

有着终结符号:如0,1:1.组成语言的终止符。2.基本有小写字母组成。

文法(Vn,Vt,P,S)

就比如说:A->a|b|e|Aa|Ae|Ao|A

Vn = {A},

Vt ={a,b,c,d,e,0,1}

P={A->a|b|e|Aa|Ae|Ao|A}

S = A .

其实A-〉Aa 就代表着循环的意思,每进行一次,就会增加一个a,假如A-〉Aaa,意思就是每循环一次,就增加aa,所以暂时也就是理解到了这个意思,然后通过几道题来强化自己的理解。

就好比Q={a,b},L={a^2n ,b^2n|n>=1}

首先是看好n的取值范围,然后看n具体指了多少个,那么就比如一起来进行循环,这个题a,b都有n,但是是分开的,所以不用一起进行。

解题思路如下:

1.增长的趋势:a^2n,aa aaaa aaaaaa........

b^2n,bb bbbb bbbbbb.......

2.循环规律:A->aa  A->Aaa

B->bb B->Bbb

3.S->A|B

A->aa|Aaa // 意思是aa为开头,循环不断增加aa

B->bb|Bbb // 意思是bb为开头,循环不断增加bb

时间: 2024-10-28 21:11:21

作业9月30号的相关文章

2017年06月30号课堂笔记

2017年06月30号 星期五 多云 空气质量:中度污染 内容:MySQL第三节课 一.delete 和 truncate的区别 01.delete begin (开启事务)select * from grade;(查询年级表中所有的数据) delete from grade; (删除年级表中所有的数据)select * from grade;(查询年级表中所有的数据,没有数据) rollback; (事务回滚)select * from grade;(查询年级表中所有的数据,删除的数据恢复)

【金阳光测试】KK公益讲座第63期-5月30号(周六晚八点) 分享主题: IOS专项测试基础

[金阳光测试]KK公益讲座第63期-5月30号(周六晚八点)分享主题: IOS专项测试基础听课地点:http://www.chuanke.com/1983382-110713.html主讲:小白老师老师简介:前风行网.腾讯测试,现为一流互联网公司任职高级开发测试时间:5月30号 晚上8点开始

7月30号=》306页-310页

13.5.5 比较运算符 >:大于,如果前面变量的值大于后面变量的值,则返回true. >=:大于等于,如果前面变量的值大于等于后面变量的值,则返回true. <:小于,如果前面变量的值小于后面变量的值,则返回true. <=:小于,如果前面变量的值小于等于后面变量的值,则返回true. !=:不等于,如果前后两个变量的值不相等,则返回true. ==:等于,如果前后两个变量的值不相等,则返回true. !==:严格不等于,如果前后两个变量的值不相等,或者数据类型不同,都将返回tr

高俊峰——运维工程师如何逆袭,11月30号QQ群575837909视频直播

时间:11月30号晚8点-9点30. 地点:QQ群直播 575837909  分享老师:高俊峰 IT系统架构专家,上海好耶集团运维总监,畅销书<循序渐进Linux>.<高性能Linux服务器构建实战>作者,51CTO专家博主. 分享内容:运维工程师如何逆袭 分享大纲: 2016年11月30号晚上8点准时开始 课前活动:到场学员晚7:58开始签到,前10名签到学员奖励100学分. 晚8:00-8:15,高俊峰老师的个人运维成长经验(15分钟) 晚8:15-9:10,运维工程师逆袭需要

8月30号作业

1.总结文本编辑工具vim的使用方法: VIM是一种LINUX和UNIX下的文本编辑器,可以对文件进行编辑,在实际的工作中,是不可缺少的工具. 其具体的用法简单些讲,就是类似于WIN上的WORD,不过它没有图形界面,只有命令行,比如复制一行的快捷键是yy,复制N行,用nyy; 在文件里显示行号,用:set nu; 删除一行,用dd; 粘贴用p:反悔刚才的动作用u:用:wq,即为保存退出.以下的VIM用法,来自于网络,借鉴,记录一下: :%s/old/new/g 全文中的字符串old全部替换成ne

高项-3月30号培训作业

项目采购管理 采购管理包括哪些过程?(记) 编制采购计划 编制询价计划 询价.招投标 供方选择 合同管理和收尾 编制采购计划过程的成果是什么? 确定项目的某些产品.服务和成果是项目团队自己提供还是通过采购来满足 确定采购的方法和流程 找出潜在的卖方,确定采购多少,何时采购,并把这些结果都写到项目采购计划中. 判断:每个采购工作说明书都来自于项目范围基准 对 结合表,工作说明书应该清楚地描述哪些内容? 采购目标的详细描述 采购工作范围 i.             详细描述本次采购各个阶段要完成的

2010年6月30号至今天我来北京整整五年,我把一切告诉你!

北京,我来了整整五年了.这五年有过快乐,有过幸福,有过悲伤,难过,无助,有过全身上下就剩1.5元熬过了一周的时候. 北京,为什么这么多人喜欢来这里,我也是,至今我都没搞明白自己为什么要来北京.或许是因为开始了就停不下来了,有的人在这里失败了,有的人在这里成功了,他们笑了. 既然来了为什么要负能量的做事情呢,早上7点半到八点半地铁上,公交上那么的人,为什么你们要拥挤,为什么要安于现状.那是因为你们不够野,人不给自己逼一把永远不知道自己有多厉害. 刚来北京那时候我一哥们和我经常做公交车26路,讨论一

作业8月10号

文斗新闻 重庆市开县人民发来电报 重庆市开县人民发来电报 重庆市开县人民发来电报 重庆市开县人民发来电报 重庆市开县人民发来电报 将进酒 作者:李白 君不见,黄河之水天上来,奔流到海不复回. 君不见,高堂明镜悲白发,朝如青丝暮成雪. 人生得意须尽欢,莫使金樽空对月. 天生我材必有用,千金散尽还复来. 烹羊宰牛且为乐,会须一饮三百杯. 岑夫子,丹丘生,将进酒,杯莫停. 与君歌一曲,请君为我倾耳听. 钟鼓馔玉不足贵,但愿长醉不复醒. 古来圣贤皆寂寞,惟有饮者留其名. 陈王昔时宴平乐,斗酒十千恣欢谑.

注释:这50个词,在这10月30号之前完成

1.多项式分布 2.文本的多项式分布建模 3.共轭先验 4.概率平滑{Lapace平滑.加1平滑.Dirichlet贝叶斯平滑.2阶段语言模型} 5.似然函数 6.log似然函数 7.期望最大化算法 8.条件概率 9.贝叶斯全公式 10.生成模型 11.判别模型 12.条件期望 13.拉格朗日系数 14.VSM,LSI,PLSI,LDA... 15.CRF.HMM.SVM.NN.DT.MEM... 16.协同过滤 17.expert finding 18.信息抽取 19.贝叶斯决策论 20.KL