⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cifa.txt

📁 词法分析程序
💻 TXT
字号:
        



题目:词法分析程序


(一)实验要求目的:

目的:设计,编制,调试一个具体的词法分析程序,加深对词法分析原理的理解。

要求:通过对PL/0分析程序(GETSYM)的分析,并在此基础上按照下面给出的语法,编制一个词法分析程序。
此程序应具有以下功能:

a. 输入为字符串(待进行词法分析的源程序),输出为单词串,即由(单词,类别)所做成的二元组序列。

b. 有一定检查错误的能力,例如能发现2A等不能作为单词的字符串。

(二)算法要求:

PL/0 词法分析程序通过读入源程序,对源程序进行扫描分析出其中的关键字,标识符,数字,错误的标识符,
非法字符,各种运算符号,
程序对分析结果进行打印。词法分析程序的的主要部分是个c_cymbol类。 它通过内置涵数c_get(char *s)读入的
一个字符串,从左至右扫描完成词法分析。在c_symbol.check()内部先将所有字符串属性定义为“symbol”,如果
第一位为数字,且其余为也为数字,定义其为“Number”,否这为非法标识。如果第一位不为数字,与保留字表和
符号表比较如有相同则赋相应的属性值。

在分析到begin、end、(、) 时,对其标志进行++或——操作,最后判断标志奇偶,或是否非零来确认begin—end “
(”—“)”数量是否匹配。

(三)程序流程图:

(四)主要变量名说明:

char ch,a[10]; ch为读入字符 a

sym 定义的标识符类

begin_end=0;

(五)调试情况及说明:

在设计的初期没有给予编制程序,而是仔细分析了题目要求,设计出了基本算法并绘制了流程图。在调试过程中
没有出现严重的算法错误。但一些简单的语法和逻辑错误层出不穷。总结原因为平时动手实践太少所致。

在程序的执行中还发现了一些逻辑上的错误,比如说将判断输入的字符是不是字母的条件(ch>='a'&&ch<'=z')写成了(ch<='a'&&ch>'=z')不仔细看是看不出错误的,而且这种逻辑错误编译器也不能发现,所以往往在调试的过程中最难发现的错误就是这些逻辑上的错误。反复分析程序中每一行代码,最终将这种错误全部改正。

(六)设计心得:

经过一周的编译原理课程设计,使我加深了对编译理论知识的理解和对C++程序的使用,并能达到基本上的运用。同时也增强了动手和实践的能力。虽然在遇到了不少困难,但是正因为这些困难,我也学到了更多的东西。首先,要勇于面对困难,只要敢于去做,并将所学灵活运用,定能取得成功;其次,我也更好的了解到合作的重要性,在和同学探讨和认真分析后,最终找到解决方案。程序的最终顺利运行,是离不开同学的互相帮助的。通过课程设计,知道自己知识的匮乏,认识问题的不全面及在平时的学习中很不扎实,更让自己懂得了学习应该踏踏实实。在课程设计的过程中,得到老师的细心指点,在此,向给予所有的老师和同学表示衷心的感谢。

(七)程序清单:

/*

* getsym.cpp in compiler v1.0.1

* Copyleft 2005 - 2006 yanshan2004@yanshan. All Rights Reserved.

*/

#include

#include

#include

#include

ofstream outf;

struct wtable

{

char *word,*value;

};

wtable w_table[]=

{

{"begin","beginsym"},

{"end","endsym"},

{"const","constsym"},

{"call","callsym"},

{"do","dosym"},

{"if","ifsym"},

{"then","thensym"},

{"odd","oddsym"},

{"procdure","procsym"},

{"read","readsym"},

{"var","varsym"},

{"while","whilesym"},

{"write","writesym"}

};

struct stable

{

char *word,*value;

};

stable s_table[]=

{

{"+","plus"},

{"-","minus"},

{"*","times"},

{"/","slash"},

{"(","lparen"},

{")","rparen"},

{"=","eql"},

{",","comma"},

{".","period"},

{"#","neq"},

{";","semicolon"},

{":=","becomes"}

};

class c_symbol

{

private:

int i;

char ch;

char *name,*group;

public:

c_symbol()

{

}

void c_get(char *s)

{

name=s;

}

void c_out()

{

cout<<<"---"<<

outf.put('[');

for(i=0;i<10;i++)

{

if(name[i]=='\0')

break;

else

outf.put(name[i]);

}

for(i=0;i<3;i++)

{

outf.put('-');

}

for(i=0;i<10;i++)

{

if(group[i]=='\0')

{

outf.put(']');

outf.put('\n');

break;

}else

outf.put(group[i]);

}

}

void check()

{

group="symbol";

if (name[0]<='9' && name[0]>='0')

for(i=1;i<10;i++)

{

if(name[i]=='\0') break;

if((name[i]<='9') && (name[i]>='0') )

group="Number";

else

if ((name[i]>='a' && name[i]<='z')||(name[i]>='A' && name[i]<='Z') )

group="非法标识";

}

else

{

for(i=0;i<13;i++)

{

if(!strcmp(name,w_table[i].word))

group=w_table[i].value;

}

for(i=0;i<12;i++)

if(!strcmp(name,s_table[i].word))

group=s_table[i].value;

}

}

};

main(int argc,char *argv[])

{

system("CLS");

char ch,a[10];

int k,period, paren,begin_end;

c_symbol sym;

begin_end=0;

paren=0;

period=0;

//head=ob=NULL;

if(argc!=2)

{

cout<<"Bad command !\n";

return 0;

}

ifstream inf(argv[1]);

for(k=0;k<10;k++)

if(argv[1][k]!='.')

a[k]=argv[1][k];

else

{a[k]='.';a[++k]='o';a[++k]='u';a[++k]='t';}

outf.open(a);

if(!inf)

{

cout<<"Cannot open source file!";

return 1;

}

if(!outf)

{

cout<<"Cannot creat Output file!";

return 1;

}

while(inf)

{

inf.get(ch);

if ((ch>='a' && ch<='z')||(ch>='A' && ch<='Z')||(ch>='0' && ch<='9'))

{

k=0;

while((ch>='a' && ch<='z')||(ch>='A' && ch<='Z')||(ch>='0' && ch<='9'))

{

if(k<10)

{

a[k]=ch;

k++;

a[k]='\0';

}

inf.get(ch);

}//while

if(!strcmp("begin",a)) begin_end++;

if(!strcmp("end",a)){begin_end--;if(begin_end<0) cout<<"出错,缺少“begin”!"<

sym.c_get(a);

sym.check();

sym.c_out();

}//if

switch (ch)

{

case '+':sym.c_get("+");sym.check();sym.c_out();break;

case '-':sym.c_get("-");sym.check();sym.c_out();break;

case '*':sym.c_get("*");sym.check();sym.c_out();break;

case '/':sym.c_get("/");sym.check();sym.c_out();break;

case '(':sym.c_get("(");sym.check();sym.c_out();paren++;break;

case ')':sym.c_get(")");sym.check();paren--;if(paren<0)cout<<"出错,缺少“(”!"<

case '=':sym.c_get("=");sym.check();sym.c_out();break;

case ',':sym.c_get(",");sym.check();sym.c_out();break;

case '.':sym.c_get(".");sym.check();sym.c_out();period=1;break;

case '#':sym.c_get("#");sym.check();sym.c_out();break;

case ';':sym.c_get(";");sym.check();sym.c_out();break;

}

if(ch==':')

{

inf.get(ch);

if(ch=='=')

{

sym.c_get(":=");

sym.check();sym.c_out();

}

else cout<<"出错,“:=”缺少“=”"<

}

}//while(inf)

if(paren>0) cout<<"出错,缺少“)”!"<

if(begin_end>0) cout<<"出错,缺少“end”!"<

if(!period) cout<<"出错,缺少“.”!"<

inf.close();

outf.close();

return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -