词法分析程序
编译原理课程设计
题目:词法分析程序
日期:2005.6.13,6.17
(一)实验要求目的:
目的:设计,编制,调试一个具体的词法分析程序,加深对词法分析原理的理解。 要求:通过对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;
(五)调试情况及说明:
在设计的初期没有给予编制程序,而是仔细分析了题目要求,设计出了基本算法并绘制了流程图。在调试过程中没有出现严重的算法错误。但一些简单的语法和逻辑错误层出不穷。
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
原因为平时动手实践太少所致。
在程序的执行中还发现了一些逻辑上的错误,比如说将判断输入的字符是不是字母的条件(ch>='a'&&ch<'=z')写成了(ch<='a'&&ch>'=z')不仔细看是看不出错误的,而且这种逻辑错误编译器也不能发现,所以往往在调试的过程中最难发现的错误就是这些逻辑上的错误。反复分析程序中每一行代码,最终将这种错误全部改正。
(六)设计心得:
经过一周的编译原理课程设计,使我加深了对编译理论知识的理解和对C++程序的使用,并能达到基本上的运用。同时也增强了动手和实践的能力。虽然在遇到了不少困难,但是正因为这些困难,我也学到了更多的东西。首先,要勇于面对困难,只要敢于去做,并将所学灵活运用,定能取得成功;其次,我也更好的了解到合作的重要性,在和同学探讨和认真分析后,最终找到解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
。程序的最终顺利运行,是离不开同学的互相帮助的。通过课程设计,知道自己知识的匮乏,认识问题的不全面及在平时的学习中很不扎实,更让自己懂得了学习
应该踏踏实实。在课程设计的过程中,得到老师的细心指点,在此,向给予所有的老师和同
学表示衷心的感谢。
(七)程序
清单
安全隐患排查清单下载最新工程量清单计量规则下载程序清单下载家私清单下载送货清单下载
:
/*
* 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;
}