老师要我做个C++ compiler,不知道应该不应该过来问

holmes98 2004-04-30 11:46:57
我确实很努力地想了,但是没办法,也许有些函数不懂吧,做不出来,

原题如下:
扫描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;
}

有哪位热心人,给点思路
...全文
121 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ybbqy 2004-06-14
  • 打赏
  • 举报
回复
还算简单…
hyperioncc 2004-05-02
  • 打赏
  • 举报
回复
没学过编译原理就让做这些啊……怎么这么安排

至少手头要有本编译的书吧,不然那些名词解释起来一下午就不用干别的了。什么书倒是无所谓,能出书的至少不至于看不懂。是编译的书,内容应该都不会差太多的。

词法分析主要是通过FengYuanMSFT(袁峰)先生写的第一步getch组合好的标识符或保留字判断单词类型的,最简单的方法用switch语句就可以实现了
enum{INT,FLOAT,...};
switch(char)
case "int"
return INT;
break;
case "float"
return FLOAT;
break;
等等。由语法分析调用,比如返回INT就可以读入下面的一个标识符,如果不是保留字就查表,看这个变量/函数是否存在,存在就属于重复定义的情况,不存在就填表了。

至于标识符的组合过程应该写过一些程序了吧。就是对字符串的一些处理罢了。按照你的要求,不是字符串的就都可以直接pass了,读到下一个空格再判断。

判断函数也是类似的,还是建议看着语法树做程序,至少要明白符号间的前驱后继关系。看你的要求语法树肯定很简单的。先做做看吧

符号表我自己认为最简单的实现方法是用vector向量。自己写两个函数用于查表填表供语法分析调用
holmes98 2004-05-02
  • 打赏
  • 举报
回复
五月一号按照 FengYuanMSFT(袁峰) 的思路做了一下,大约用了大半天,

未果,CLASS 设计了半天,感觉到没学过《编绎原理》

真是不行,哪位学长把有关的东西帖一点出来,

3号图书馆开了再去借本书看看,

ranxiaoxiao 2004-05-02
  • 打赏
  • 举报
回复
《编译技术课程设计与上机指导》霍林主编的 由重庆大学出版社出版的,上面有源程序以及设计过程和对源程序的详细说明,它是对类C语言进行编译的,买它看看,不错的,我正在看。
sct 2004-05-02
  • 打赏
  • 举报
回复
我们当时学编译原理用的是
《编译原理及实践》,冯博琴 冯岚 译
Compiler Construction Principles and Practice ,Kenneth C.Louden著
机械工业出版社

个人认为这本书不错
iintsy 2004-05-01
  • 打赏
  • 举报
回复
我以前用过一个工具软件,就是类似的分析,应该是先分析出现的每一个词汇,然后判断是否关键字,比如说int,float,return,class,..。只要不是关键字就是变量,如果是变量定义的话就存入hash表,如果不是的话就说明该变量没有声明。然后可能的话,加入一些规则。
nik_Amis 2004-05-01
  • 打赏
  • 举报
回复
up
薛定谔之死猫 2004-05-01
  • 打赏
  • 举报
回复
to hyperioncc(hyperion)
你有例子吗?
薛定谔之死猫 2004-05-01
  • 打赏
  • 举报
回复
对了,要做词法分析和语法分析程序,CSDN的兄弟发了一个词法分析的给我,还没看就找不到了,可能被我干掉了,上课不听,现在要从头搞起了,楼主解决了给小弟一份借鉴,小弟依妹儿:ljw_jellyfish@163.com

谢先。

kugou123 2004-05-01
  • 打赏
  • 举报
回复
楼主应该好好研究一下《编译原理》的书。
hyperioncc 2004-05-01
  • 打赏
  • 举报
回复
这个哪能叫作Compiler啊……只是个词法分析器而已,只有判断函数形参和返回值类型的时候涉及到了一点点的语法分析……
至于先定义后使用的判断,就必须要在分析过程中建立符号表了。

词法分析器是编译器里相对最简单的部分了,就不说了。至于语法分析这么简单的功能考虑用递归下降翻译吧,没必要用太复杂的算法。按照你们的要求词法分析程序返回类型声明符的时候读一下后面的标识符,先查表,在这里判断是否先定义后使用。之后判断一下是不是函数后填表就可以了。是函数再判断一下是定义还是声明。就用超前读取的方法判断就可以了,反正这个题目也没必要用二次扫描的。

可能说得比较简单,但是我觉得实现这些要求代码至少应该在300~500行。你这几行代码没太细看,但是肯定不合要求吧。就说isVar,函数返回值就不能是int,bool一类的吗……根据这个判断是否是函数是不可行的,至少应该看看标识符后面有无形参列表。建议把用得到的语法树写出来,会方便很多,写程序的过程中应该会反复要看的。

也许只是实现这些要求不一定非要用词法分析语法分析符号表一类的东西,不过建议楼主还是严格按照编译器构造的原理来写自己的程序。感觉编译学好了对你以后任何语言甚至技术的学习都是由长远的影响的。
FengYuanMSFT 2004-05-01
  • 打赏
  • 举报
回复
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
薛定谔之死猫 2004-04-30
  • 打赏
  • 举报
回复
我们也是,思路都还没有,关注
pigpig 2004-04-30
  • 打赏
  • 举报
回复
是应该看看编译原理的东西,要做一个成功的编译器,还应该看看设计模式方面的书,这两门课程都非常有用,及时你以后不开发编译器,自动机,设计模式都能让你受益终身
konista 2004-04-30
  • 打赏
  • 举报
回复
应该是编译原理的课程设计吧,当时我们做的可是复杂多了,要完成对整个程序代码的分析呢,自己做吧,会有很大收获的,特别是字符串的分析,那叫一个彻底阿......加油!
环境:Windows XP S3、VC++ 6.o 目的:学习C++程序开发语言 使用步骤:下载之后,双击.dsw文件即可打开该示例工程 说明: 在学习《Thinking in C++》一书关于数组声明与定义时,Bruce说如果这样声明一个数组: int b[6] = {0}; Here, the compiler will use the first initializer for the first array element, and then use zero for all the elements without initializers.(意思是说如果这样声明并且定义一个数组,那么编译器会把0赋给第一个数组元素,其它五个元素会赋值0).于是我使用class声明一个类型Test。在这个类中有一个成员方法叫getArray(),在该方法中使用以上方式声明一个数组,然后返回数组的指针,然后在另一个成员方法showPointerOfArray(int*)接收传过来的int指针,在这个方法操作数组。 但是在运行时没有出现我想要的结果,于是其它的方法中测试这样声明方式,却是运行正确的。于是让我很纳闷?带这个题与本中心庄鹏飞老师讨论之后,发现原来我没有搞清楚在C++中指针分为栈指针和堆指针。参见int* Test::getArray()方法中关于数组的声明以及本人非常详细的说明,那么我想会给学习C++编程的人员带来收获。 结论:C++不是纯粹的OO语言,这是bruce说的。本人在学习过程中确实感觉C++这种语言比Java难得多。不像Java那么直观易学,这可能也就是为什么世界上所有程序员中有20%左右的人是Java程序员,而不是C++程序员的原因吧。 另外,本人使用QT的g++编译器编译通过了,因为是使用记事本手写的,所以完全是Java的书写风格^_^ 把它搞成VC++的工程是为了大家方便学习。。。 学习对象:希望编写效率高于Java应用的程序员。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧