我确实很努力地想了,但是没办法,也许有些函数不懂吧,做不出来,原题如下:
扫描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;
}有哪位热心人,给点思路

解决方案 »

  1.   

    我以前用过一个工具软件,就是类似的分析,应该是先分析出现的每一个词汇,然后判断是否关键字,比如说int,float,return,class,..。只要不是关键字就是变量,如果是变量定义的话就存入hash表,如果不是的话就说明该变量没有声明。然后可能的话,加入一些规则。
      

  2.   

    Not is not a compiler, just a simple syntax analyser.1) Implement Nextch, read the next character.
    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
      

  3.   

    这个哪能叫作Compiler啊……只是个词法分析器而已,只有判断函数形参和返回值类型的时候涉及到了一点点的语法分析……
    至于先定义后使用的判断,就必须要在分析过程中建立符号表了。词法分析器是编译器里相对最简单的部分了,就不说了。至于语法分析这么简单的功能考虑用递归下降翻译吧,没必要用太复杂的算法。按照你们的要求词法分析程序返回类型声明符的时候读一下后面的标识符,先查表,在这里判断是否先定义后使用。之后判断一下是不是函数后填表就可以了。是函数再判断一下是定义还是声明。就用超前读取的方法判断就可以了,反正这个题目也没必要用二次扫描的。可能说得比较简单,但是我觉得实现这些要求代码至少应该在300~500行。你这几行代码没太细看,但是肯定不合要求吧。就说isVar,函数返回值就不能是int,bool一类的吗……根据这个判断是否是函数是不可行的,至少应该看看标识符后面有无形参列表。建议把用得到的语法树写出来,会方便很多,写程序的过程中应该会反复要看的。也许只是实现这些要求不一定非要用词法分析语法分析符号表一类的东西,不过建议楼主还是严格按照编译器构造的原理来写自己的程序。感觉编译学好了对你以后任何语言甚至技术的学习都是由长远的影响的。
      

  4.   

    对了,要做词法分析和语法分析程序,CSDN的兄弟发了一个词法分析的给我,还没看就找不到了,可能被我干掉了,上课不听,现在要从头搞起了,楼主解决了给小弟一份借鉴,小弟依妹儿:[email protected]谢先。
      

  5.   

    to hyperioncc(hyperion)
      你有例子吗?
      

  6.   

    五月一号按照 FengYuanMSFT(袁峰) 的思路做了一下,大约用了大半天,未果,CLASS 设计了半天,感觉到没学过《编绎原理》真是不行,哪位学长把有关的东西帖一点出来,3号图书馆开了再去借本书看看,
      

  7.   

    我们当时学编译原理用的是
    《编译原理及实践》,冯博琴 冯岚 译
    Compiler Construction Principles and Practice ,Kenneth C.Louden著
    机械工业出版社个人认为这本书不错
      

  8.   

    没学过编译原理就让做这些啊……怎么这么安排至少手头要有本编译的书吧,不然那些名词解释起来一下午就不用干别的了。什么书倒是无所谓,能出书的至少不至于看不懂。是编译的书,内容应该都不会差太多的。词法分析主要是通过FengYuanMSFT(袁峰)先生写的第一步getch组合好的标识符或保留字判断单词类型的,最简单的方法用switch语句就可以实现了
    enum{INT,FLOAT,...};
    switch(char)
    case "int"
        return INT;
        break;
    case "float"
        return FLOAT;
        break;
    等等。由语法分析调用,比如返回INT就可以读入下面的一个标识符,如果不是保留字就查表,看这个变量/函数是否存在,存在就属于重复定义的情况,不存在就填表了。至于标识符的组合过程应该写过一些程序了吧。就是对字符串的一些处理罢了。按照你的要求,不是字符串的就都可以直接pass了,读到下一个空格再判断。判断函数也是类似的,还是建议看着语法树做程序,至少要明白符号间的前驱后继关系。看你的要求语法树肯定很简单的。先做做看吧符号表我自己认为最简单的实现方法是用vector向量。自己写两个函数用于查表填表供语法分析调用