我确实很努力地想了,但是没办法,也许有些函数不懂吧,做不出来,原题如下:
扫描C++源程序,给出其中的常量、变量和函数列表,包括出现位置(行号)、定义性/使用性出现、类型(函数给出行参类型和返回值类型),最终判断是否满足“先定义后使用”原则。我的思路如下:
string s1,s2,s3;
ifstream fin;
ofstream fout;
fin.open("compiler.cpp");
fout.open("d:\\file.txt");
fin>>s1;
while(fin){
fin>>s2;
if(s1=="const"&&isVar(s2)){
fin>>s3;
fout<<s3<<" is a constant!"<<endl;
s1=s3;
}else if(isVar(s1)&&s2.find("(")!=basic_string::npos){
fout<<s2<<" is a variable!"<<endl;
s1=s2;
}else s1=s2;
其中有个函数如下:
bool isVar(string s1){
if(s1=="char"||s1=="short"||s1=="int"||s1=="long"||s1=="bool")
return 1;
else return 0;
}有哪位热心人,给点思路
扫描C++源程序,给出其中的常量、变量和函数列表,包括出现位置(行号)、定义性/使用性出现、类型(函数给出行参类型和返回值类型),最终判断是否满足“先定义后使用”原则。我的思路如下:
string s1,s2,s3;
ifstream fin;
ofstream fout;
fin.open("compiler.cpp");
fout.open("d:\\file.txt");
fin>>s1;
while(fin){
fin>>s2;
if(s1=="const"&&isVar(s2)){
fin>>s3;
fout<<s3<<" is a constant!"<<endl;
s1=s3;
}else if(isVar(s1)&&s2.find("(")!=basic_string::npos){
fout<<s2<<" is a variable!"<<endl;
s1=s2;
}else s1=s2;
其中有个函数如下:
bool isVar(string s1){
if(s1=="char"||s1=="short"||s1=="int"||s1=="long"||s1=="bool")
return 1;
else return 0;
}有哪位热心人,给点思路
2) Implement GetToken, read the next token.
3) Implement a symbol table
4) Implement Factor
5) Implement Term
6) Implement Expression
7) Implement statement
8) Implement Function parser
至于先定义后使用的判断,就必须要在分析过程中建立符号表了。词法分析器是编译器里相对最简单的部分了,就不说了。至于语法分析这么简单的功能考虑用递归下降翻译吧,没必要用太复杂的算法。按照你们的要求词法分析程序返回类型声明符的时候读一下后面的标识符,先查表,在这里判断是否先定义后使用。之后判断一下是不是函数后填表就可以了。是函数再判断一下是定义还是声明。就用超前读取的方法判断就可以了,反正这个题目也没必要用二次扫描的。可能说得比较简单,但是我觉得实现这些要求代码至少应该在300~500行。你这几行代码没太细看,但是肯定不合要求吧。就说isVar,函数返回值就不能是int,bool一类的吗……根据这个判断是否是函数是不可行的,至少应该看看标识符后面有无形参列表。建议把用得到的语法树写出来,会方便很多,写程序的过程中应该会反复要看的。也许只是实现这些要求不一定非要用词法分析语法分析符号表一类的东西,不过建议楼主还是严格按照编译器构造的原理来写自己的程序。感觉编译学好了对你以后任何语言甚至技术的学习都是由长远的影响的。
你有例子吗?
《编译原理及实践》,冯博琴 冯岚 译
Compiler Construction Principles and Practice ,Kenneth C.Louden著
机械工业出版社个人认为这本书不错
enum{INT,FLOAT,...};
switch(char)
case "int"
return INT;
break;
case "float"
return FLOAT;
break;
等等。由语法分析调用,比如返回INT就可以读入下面的一个标识符,如果不是保留字就查表,看这个变量/函数是否存在,存在就属于重复定义的情况,不存在就填表了。至于标识符的组合过程应该写过一些程序了吧。就是对字符串的一些处理罢了。按照你的要求,不是字符串的就都可以直接pass了,读到下一个空格再判断。判断函数也是类似的,还是建议看着语法树做程序,至少要明白符号间的前驱后继关系。看你的要求语法树肯定很简单的。先做做看吧符号表我自己认为最简单的实现方法是用vector向量。自己写两个函数用于查表填表供语法分析调用