急求高人编写一个简单的词法分析程序

编制一个能够分析三种整数、标识符、主要运算符和主要关键字的词法分析程序。
1、采用C或C++语言,设计函数scan( ),实现该算法;
2、编制测试程序(主函数main);
3、调试程序:读入文本文件program.txt,运行程序得到输出结果result.txt,并检查输出结果是否正确。

输入数据:
编辑一个文本文件program.txt,在文件中输入一段程序代码,如:
if data+92>0x3f then
data=data+01;
else
data=data-01;
将输出结果存放在result.txt文件中,输出格式如下:
<if , ->
<0 , data>
<+ , ->
<1 , 92>
<> , ->
<3 , 3f>
<then , ->
<0 , data>
<= , ->
<0 , data>
<+ , ->
<2 , 1>
<; ,->
<else , ->
<0 , data>
<= , ->
<0 , data>
<- , ->
<2 , ->
<; , ->

很急,请在明天晚上之前完成,到时候会提高分数!
能够做到的话,在这里留个部分的,把完整的用百度消息留言给我吧!一定要快,只到明天傍晚!

嘿嘿,这个我做过哦。是编译原理的东西。
不过现在没有程序,没带来,给你一个参考的:虽然不是完全符合你的要求。不过其中很多函数你是要用到的,比如词法分析部分,其实你的要求就是进行词法分析的,无非你用scanf(),你用词法分析,分析出scanf()语句,再进行内部参数分析,就OK了;
祝你成功哦

///////////////////////////////////////////////////////////////////
for循环语句翻译 递归下降法 输出三地址码 /////////////

#define MAX 100
#include<iostream.h>
#include<stdio.h>
#include<string.h>

char str[MAX];
char ch;
int turn;

char strToken[MAX];
int kind;
int n=0;//存放strtoken[]元素的个数

struct Word//结构体 存放单词
{
int sort;
char word[MAX];//存放strtoken[]的内容
};
//record[x]=new Word;
Word *record[12];//放所有识别出来的单词,分别存放他们的编号以及字符串,x是其下标

////////////////////词法分析///////////////////////
int buffer()//载入
{
int i=0;

cout<<"输入程序,以“#”作为结束标志。"<<endl;

for(int n=0;n<=MAX;n++)
{
for(;i<=MAX;i++)
{
scanf("%c",&str[i]);
/////////////cin>>str[i]不可用,用C语言读入字符。
if(str[i]=='#')
break;///////如果尾数为识别码#,则表示程序读完,跳出循环.
}
break;
}

return(i);
}

bool IsLetter(char ch)///////////判断是否是字母
{
if(ch>=65&&ch<=90||ch>=97&&ch<=122)
return(true);
else
return(false);
}

bool IsDigit(char ch)//////////判断是否是数字
{
if(ch>=48&&ch<=57)
return(true);
else
return(false);
}

char GetChar(int i)///////读取字符
{
char ch;
ch=str[i];

return(ch);
}

char GetBC(char ch)////判断是不是空格或者换行,如果是,直接读取下一个字符直道不再空白为止
{
if(ch==32||ch==10)
{
turn++;
ch=GetChar(turn);
ch=GetBC(ch);/////////递归实现

return(ch);
}
else
return(ch);
}

void Concat()/////////////连接,即为strtoken[]赋值
{
strToken[n]=ch;
n++;
}

int Reserve()/////以单词为单位查找保留字,是则返回编码,不是则返回0,用来区分标志符和保留字
{
if(strcmp(strToken," DIM\0")==0)///////调用strcmp函数实现,
return(1);

else if(strcmp(strToken,"for\0")==0)
return(2);

else if(strcmp(strToken,"step\0")==0)
return(3);

else if(strcmp(strToken,"until\0")==0)
return(4);

else if(strcmp(strToken,"do\0")==0)
return(5);

else
return(6);
}

void clear()
{
n=0;
}

/////////////*语法递归分析*/////////////////
int A(int * c,int & q)
{
if(c[q++]==3)
{
if(c[q]==7)
{ q++;
return 1;
}
else {cout<<"step右部出错"<<endl;return 0;}
}else {cout<<"error 'step'"<<endl;return 0;}
}

int B(int * b,int & o)
{
if(b[o++]==4)
{
if(b[o]==7)
{ o++;
return 1;
}
else {cout<<"until右部出错"<<endl;return 0;}
}else {cout<<"error 'until'"<<endl;return 0;}
}

int S2(int * d,int & h)
{
if(d[h++]==6)
{
if(d[h++]==8)
{
if((d[h]==6||d[h]==7)) {h++; return 1;}
else {cout<<"赋值语句右部出错 "<<endl;return 0;}
}else {cout<<"赋值语句缺少赋值运算符 "<<endl;return 0;}
}else {cout<<"赋值语句左部出错 "<<endl;return 0;}
}

int S1(int * m,int & n)
{
if(S2(m,n))
{
if(A(m,n))
{
if(B(m,n)) return 1;
else return 0;
}else return 0;
}else return 0;
}

int S(int *a,int & z)
{
if (a[z++]==2)
{
if (S1(a,z))
{
if(a[z++]==5)
{
if(S2(a,z))
{
cout<<"succeed!"<<endl;return 1;
}else return 0;
}else {cout<<"error 'do'"<<endl; return 0;}
}else return 0;
}else {cout<<"error 'for'"<<endl; return 0;}
}

void main()
{

cout<<"*************产生式***************"<<endl;// for step until do i j =
cout<<" S ->for S1 do S2"<<endl; // 编号 2 3 4 5 6 7 8
cout<<" S1 ->S2AB"<<endl;
cout<<" S2 ->i=j"<<endl;
cout<<" A ->stepj"<<endl;
cout<<" B ->untilj"<<endl;
int num;

turn=0;
num=buffer()-1;
int x=0;//计识别的单词的个数

for(;turn<=num;turn++)//总循环,ch存放刚读入的字符,strtoken[]存放已识别的标志付或保留字,turn是数组str[]的下标
{
ch=GetChar(turn);
ch=GetBC(ch);

if(IsLetter(ch))
{
while(IsLetter(ch)&&turn<=num||IsDigit(ch)&&turn<=num)
{
Concat();
ch=GetChar(++turn);
}

strToken[n]='\0';
ch=NULL;//此ch不是标志符中的符号
turn=turn-1;

kind=Reserve();
record[x]=new Word; record[x]->sort=kind;//12345或6
//cout<<kind; //测试
cout<<"(";
for(int i=0;i<n;i++)
{
record[x]->word[i]=strToken[i];
cout<<record[x]->word[i];//输出识别的标志符或保留字
}
cout<<","<<kind<<")"<<endl;
record[x]->word[i]='\0';
clear();
x++;

}

else if(IsDigit(ch))
{
while(IsDigit(ch)&&turn<=num)
{
Concat();
ch=GetChar(++turn);
}

ch=NULL;
turn=turn-1;

kind=7;
//////////////
record[x]=new Word;

record[x]->sort=kind;
////////////////

cout<<"(";

for(int i=0;i<n;i++)
{

record[x]->word[i]=strToken[i];
cout<<record[x]->word[i];
}
cout<<","<<kind<<")"<<endl;
record[x]->word[i]='\0';
clear();x++;

}

else if(ch=='=')
{
kind=8;
///////
record[x]=new Word;
record[x]->word[0]='=';
record[x++]->sort=kind;
cout<<"(=,"<<kind<<")"<<endl;

}

else
cout<<"error input!"<<endl;
}

//////////////////////*语法分析*////////////////
//int y;

/*for(y=0;y<x;y++)
{cout<<record[y]->sort<<" ";//打印单词的编号 。

}cout<<endl;*/

int ana[MAX];//存放词法分析得到的单词序列的编号的序列
int m;
for(m=0;m<x;m++)
{
ana[m]=record[m]->sort;//将sort作为数组保存起来

}
/////////语法分析///////
int j=0;

///////////////////制导翻译//////////////////
if(!S(ana,j)) cout<<"语法出错!"<<endl;
else
{ cout<<"三地址码如下:"<<endl;
cout<<"100 ";
int i=0;
while(record[1]->word[i]!='\0')
cout<<record[1]->word[i++];cout<<record[2]->word[0];
i=0;
while(record[3]->word[i]!='\0')
cout<<record[3]->word[i++];cout<<endl;
cout<<"101 goto 103"<<endl;
cout<<"102 ";
i=0;
while(record[1]->word[i]!='\0')
cout<<record[1]->word[i++];cout<<":=";
i=0;
while(record[1]->word[i]!='\0')
cout<<record[1]->word[i++];cout<<"+";
i=0;
while(record[5]->word[i]!='\0')
cout<<record[5]->word[i++];cout<<endl;
cout<<"103 if ";
i=0;
while(record[1]->word[i]!='\0')
cout<<record[1]->word[i++];cout<<"<";
i=0;
while(record[7]->word[i]!='\0')
cout<<record[7]->word[i++];
cout<<" goto 105"<<endl;
cout<<"104 goto 107"<<endl;
cout<<"105 ";
i=0;
while(record[9]->word[i]!='\0')
cout<<record[9]->word[i++];cout<<":=";
i=0;
while(record[11]->word[i]!='\0')
cout<<record[11]->word[i++];cout<<endl;
cout<<"106 goto 102"<<endl;
cout<<"107 end"<<endl;

}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-11-16
主函数我在用消息发给你,不过消息能发的内容太少了。我就多分几次发
/*****************************************************************************
* 程序名:词法分析器 *
* 功能:从program.txt读入一段完整c++代码,根据原有的关键字表(keyword)、 *
* 算符表(Operator)、界符表(seperator)以及新建的标识符表对每个词 *
* 进行分类,找出每个词的词性及在对应表中的位置。对关键字,只输出一次 *
* (即后面再出现相同的关键字时,不在重新输出)。标识符表为identifier.txt, *
* 对于数字常量,直接输出,并标记为constant。每个词的词性、位置均输出在 *
* result.txt里。 标识符先存放在数组内,等对所有词进行判断之后才输出到文件中 *
* 这样的话,可以比较判断是否有相同的标识符。 *
* * *
* 大体思路:用get()函数从文件中一次读入一个字符,对该字符进行判断。分情 *
* 况讨论,对大部分的情况,都必须预先读取下一位来对该位进行判断才可以。个 *
* 别情况甚至得预先读取两位来判断。 *
*****************************************************************************/
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<string>

using namespace std;
//关键字表
string keyword[63]={"and","auto","bool","break","case","catch","char","class","const","const_cast",
"continue","default","delete","do","double","dynamic_cast","else","enum","long",
"explicit","extern","false","float","for","friend","goto","if","inline","int","include",
"mutable","namespace","signed","typeid","typename","union","unsigned","short","typedef",
"new","operator","or","private","protected","public","register","reinterpret_cast","return",
"sizeof","static","static_cast","struct","switch","template","this","throw","true","try",
"using","virtual","void","volatile","while"}; //关键字表

int used[42]; //判断关键字是否已经使用过

//算符表
string Operator[23]={"+", "++", "-", "--", "*", "/", "%", "!", "?:", "=", "==",
"||", "&&", "&" ,"**", "*=", "+=", "-=", "/=", "!=","|","<=",">="};

//界符表
string seperator[17]={"<", ">", "(", ")", ",", "[", "]", ";", "{", "}",
"#", "\"", ":", "\'", ">>", "<<","::"};

int iskeyword(char *a) //是否为关键字,是的话返回关键字的下标加1。不是的话返回0
{
int i;
for(i=0;i<63;i++)
if( strcmp(a,keyword[i].c_str())==0 )
return i+1;
return 0;
}

int isoperator(char *a) //是否为操作符,是的话返回关键字的下标加1。不是的话返回0
{
int i;
for(i=0;i<23;i++)
if(strcmp(a,Operator[i].c_str())==0)
return i+1;
return 0;
}

int isseperator(char *a) //是否为分隔符,是的话返回关键字的下标加1。不是的话返回0
{
int i;
for(i=0;i<17;i++)
if(strcmp(a,seperator[i].c_str())==0)
return i+1;
return 0;
}本回答被提问者采纳
第2个回答  2008-11-16
哥们,哪学校的
我们刚交完作业,或许可以帮你,哈哈
相似回答