分享
 
 
 

Pascal语言子集词法分析器

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

有空再来写注释^o^

测试用Pascal代码片断

begin

ab2a:=9;

if x>=0 then x:=x+1;

while a=0 do

b:=a*x/33455;

end

#

---------------------------------------------------------------------

测试结果

syn |value

________|________

1 |begin

10 |ab2a

18 |:=

11 |9

26 |;

2 |if

10 |x

24 |>=

11 |0

3 |then

10 |x

18 |:=

10 |x

14 |+

11 |1

26 |;

4 |while

10 |a

25 |=

11 |0

5 |do

10 |b

18 |:=

10 |a

16 |*

10 |x

17 |/

11 |33455

26 |;

6 |end

0 |#

Press any key to continue

分析器的C代码------------------------------------------------------------------------------------------

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#define MAX_WD_LEN 255

#define MAX_INT 32767

#define MAX_SRC_LEN 1000

#define MAX_WD_CNT 100

#define KWD_CNT 6

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

union value_type{

int d;

char c;

char s[MAX_WD_LEN];

};

typedef struct{

int syn;

union value_type value;

}word_type;

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

char *keywords[20]={"begin","if","then","while","do","end"};

char source[MAX_SRC_LEN];

word_type word_stack[MAX_WD_CNT];

int line=1,wtop=0,ip=0;

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

void p_word_stack(){

int i;word_type w;

printf("syn\t|value\n");

printf("________|________\n");

for(i=0;i<wtop;i++){

w=word_stack[i];

if( (w.syn>=1 && w.syn<=10) || w.syn==18 || w.syn==21 || w.syn==22

|| w.syn==24)

printf("%d\t|%s\n",w.syn,w.value.s);

else if(w.syn==11)

printf("%d\t|%d\n",w.syn,w.value.d);

else

printf("%d\t|%c\n",w.syn,w.value.c);

}

return ;

}

void tell_err(){

printf("error in line %d\n",line);

exit(1);

return ;

}

void scan(){

word_type w;

char c;

int j=0;

if(isdigit(c=source[ip])){

w.syn=11; /* dd* */

w.value.d=c-'0';

while(isdigit(c=source[++ip]))

w.value.d=w.value.d*10+c-'0';

if(!isalpha(c))

word_stack[wtop++]=w;

else

tell_err();

return;

}

if(isalpha(c=source[ip])){

w.syn=10; /* (ll|d) */

w.value.s[0]=c;

while(isalpha(c=source[++ip]) || isdigit(c))

w.value.s[++j]=c;

w.value.s[j+1]='\0';

for(j=0;j<KWD_CNT;j++){

if(strcmp(keywords[j],w.value.s)==0)

w.syn=j+1;

}

word_stack[wtop++]=w;

return ;

}

switch(c=source[ip]){

case '+' :

w.syn=14; /* '+' */

w.value.c='+';

word_stack[wtop++]=w;

ip++;

break;

case '-' :

w.syn=15; /* '-' */

w.value.c='-';

word_stack[wtop++]=w;

ip++;

break;

case '*' :

w.syn=16; /* '*' */

w.value.c='*';

word_stack[wtop++]=w;

ip++;

break;

case '/' :

w.syn=17;

w.value.c='/';

word_stack[wtop++]=w;

ip++;

break;

case ':' :

w.syn=19;

w.value.c=':';

if( (c=source[++ip]) !='='){

word_stack[wtop++]=w;

}

else if(c=='='){

strcpy(w.value.s,":=");

w.syn=18;

word_stack[wtop++]=w;

ip++;

}

break;

case '<' :

w.syn=20;

w.value.c='<';

if( (c=source[++ip]) !='>' && c!='='){

word_stack[wtop++]=w;

}

else if(c=='>'){

w.syn=21;

strcpy(w.value.s,"<>");

word_stack[wtop++]=w;

ip++;

}

else if(c=='='){

w.syn=22;

strcpy(w.value.s,"<=");

word_stack[wtop++]=w;

ip++;

}

break;

case '>' :

w.syn=23;

w.value.c='>';

if( (c=source[++ip]) !='='){

word_stack[wtop++]=w;

}

else if(c=='='){

w.syn=24;

strcpy(w.value.s,">=");

word_stack[wtop++]=w;

ip++;

}

break;

case '=' :

w.syn=25;

w.value.c='=';

word_stack[wtop++]=w;

ip++;

break;

case ';' :

w.syn=26;

w.value.c=';';

word_stack[wtop++]=w;

ip++;

break;

case '(' :

w.syn=27;

w.value.c='(';

word_stack[wtop++]=w;

ip++;

break;

case ')' :

w.syn=28;

w.value.c=')';

word_stack[wtop++]=w;

ip++;

break;

case ' ' :

while(source[++ip]==' ');

break;

case '\n' :

line++;

while(source[++ip]=='\n')line++;

break;

case '\t' :

while(source[++ip]=='\t');

break;

case '\r' :

while(source[++ip]=='\r');

break;

default:

tell_err();

}

return;

}

int main(){

FILE* fp;

int i=0;

word_type w;

fp=fopen("input.txt","r");

while(!feof(fp))

source[i++]=getc(fp);

fclose(fp);

while(source[ip]!='#')

scan(ip);

w.syn=0;

w.value.c='#';

word_stack[wtop++]=w;

p_word_stack();

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有