分享
 
 
 

一个小语言的词法分析程序

王朝vc·作者佚名  2006-01-17
窄屏简体版  字體: |||超大  

一个小语言的词法分析程序

作者:loyalzu

下载本文示例代码

前些天写了个小语言的词法分析程序,因为前些天在VC知识库看到一个pascal词法分析的程序,觉得写得挺复杂的。其实词法分析程序的原理都是一样的,所以我想只要搞明白了简单的词法分析程序,再写复杂的就不难了,无非是多加几个关键字,多写几个条件判断语句而已。词法分析是编译程序的基础,也是最简单的。好,现在让我们看程序吧。

先让我们看看这个小语言的文法吧。

G[<程序>]:

<程序>∷=<程序首部>;<分程序>.

<程序首部>∷=program<标识符>

<分程序>∷=<复合语句>

<复合语句>∷=begin<语句序列>end

<语句序列>∷=<语句>{;<语句>}

<语句>∷=<赋值语句>|<复合语句>|<条件语句>

<赋值语句>∷=<标识符>:=<表达式>

<条件语句>∷=if <布尔表达式> then <语句> else <语句>

<表达式>∷=<项>{(+|-)<项>}

<项>∷=<因式>{(*|/)<因式>}

<因式>∷=<标识符>|<无正负号常量>|’(’<表达式>’)’

<布尔表达式>∷=<表达式><关系运算符><表达式>

<关系运算符>∷= =|<|<=|>|>=|<>

<标识符>∷=<字母>{<字母>|<数字>}

<无正负号常量>∷=<数字>{<数字>}[.<数字>{<数字>}]

<字母>∷=a|b|c|d|e|f|g|……|u|v|w|x|y|z

<数字>∷=0|1|2|3|4|5|6|7|8|9

根据此文法,构造一词法分析程序。输入以“#”为结束符

按照这个文法,找出该语言的关键字,如program,begin,end ,if,then,else,以及其他一些特殊符号,然后再构造一个分析表,如下表:

单词符号

类别编号

标识符

1

常数

2

if

3

then

4

else

5

program

6

begin

7

end

8

+

9

-

10

*

11

/

12

(

13

)

14

>

15

>=

16

<

17

<=

18

<>

19

:=

20

;

21

.

22

,

23

根据这个表来构造程序,程序的核心是下面的这个函数,/********************************************************************

以下为主分析函数

从输入文件里面读,把分析结果写到输出文件中

参数:fpin :输入文件指针 fpout: 输出文件指针

********************************************************************/

void parse(FILE* fpin,FILE* fpout)

{

char arr[MAXBUF];//读出的最长的字符串不超过MAXBUF,MAXBUF定义为255,够长了我想

int i=0;//分析含字母的字符串用

int j=0;//分析纯数字的字符串用

while(1)

{

fscanf(fpin,"%c",&ch);//从输入文件中读入一个字符

if( ch=='' ''|| ch ==''\t'')//过滤掉空格和tab

;

else if( ch==''\n'')//回车换行符,为下面进行错误判断

lineno++;

else if( IsDigit(ch))//读入的是数字

{

while(IsDigit(ch))

{

arr[j] = ch;

j++;

fscanf(fpin,"%c",&ch);

}

fseek(fpin,-1L,SEEK_CUR);//文件指针后退一个字节

char* temp1 =(char*)malloc(j+1);/

memcpy(temp1,arr,j);

temp1[j] =''\0'';//把数组里面的内容拷贝到连外一个数组里面,因为我定义的

//arr为255个字节,实际上写不到那么多,所以只拷贝实际上有数据的

j=0;//恢复初始状态,以备下次使用

fprintf(fpout,"%s\t\t%d\n",temp1,2);//常数

free(temp1);//释放内存

}

else if(IsAlpha(ch))//是字母开头的

{

while(IsAlpha(ch) || IsDigit(ch))

{

arr[i] =ch;

i++;

fscanf(fpin,"%c",&ch);

}

fseek(fpin,-1L,SEEK_CUR);

char* temp = (char*)malloc(i+1) ;

memcpy(temp,arr,i);

temp[i] =''\0'';

i=0;

/*基本思想同处理数字的*/

if(FindOK(temp))//FindOK函数在关键字表中查找和temp字符串相同的,找到就返回类别编号

{

fprintf(fpout,"%s\t\t%d \n",temp,FindOK(temp));

}

else

{

fprintf(fpout,"%s\t\t%d\n",temp,1);//标示符号

}

free(temp);

}

//以下为2字节的运算符号

else if( ch=='':'')//符号“:=”

{

fscanf(fpin,"%c",&ch);

if(ch==''='')

fprintf(fpout,"%s\t\t%d\n",":=",20);

else

fprintf(fpout,"error in compileing %d lines unknown character %c \n",lineno,ch);//出错了

}

else if(ch=='''')//符号 “ “ 和”=”

{

fscanf(fpin,"%c",&ch);

if(ch==''='')

fprintf(fpout,"%s\t\t%d\n","=",16);

else

fprintf(fpout,"\t\t15\n");

}

else if( ch==''<'') //符号 “< “ 和”<=”

{

fscanf(fpin,"%c",&ch);

if(ch==''='')

{fprintf(fpout,"<=\t\t18\n");}

else if( ch=='''')

{fprintf(fpout,"<\t\t19");}

else

{fprintf(fpout,"<\t\t19\n");}

}

else {

//以下为一个字节的运算符号

if(ch==''-'') {fprintf(fpout,"%s\t\t%d\n",''-'',10);continue;}//在文件中输出为“- 10”

if(ch=='';'') {fprintf(fpout,";\t\t21\n");continue;}

if(ch==''+'') {fprintf(fpout,"+\t\t9\n");continue;}

if(ch==''*'') {fprintf(fpout,"*\t\t11\n");continue;}

if(ch==''/'') {fprintf(fpout,"/ \t\t12\n");continue;}

if(ch==''('') {fprintf(fpout,"(\t\t13\n");continue;}

if(ch=='')'') {fprintf(fpout,")\t\t14\n");continue;}

if(ch==''.'') {fprintf(fpout,".\t\t22\n");continue;}

if(ch=='','') {fprintf(fpout,",\t\t23\n");continue;}

if(ch==''#'') break;//分析结束

else fprintf(fpout,"error in compileing %d lines unknown character %c \n",lineno,ch);//出错了,输出出错信息

}

}

}

其他请看源代码,注释很详细,但是肯定有不足的地方,请大家吝赐教。有什么问题,可以给我发邮件。这是我第一次向VC知识库投稿,以后将会陆续写一些VC方面的程序来和大家共享。我的email:brilliant_zhang@21cn.com,QQ:110902663,

谢谢大家。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有