第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;
}本回答被提问者采纳