#include\x0d\x0a\x0d\x0avoid main(void)\x0d\x0a{\x0d\x0aFILE *fpIn // 输入
文件的指针\x0d\x0a\x0d\x0aFILE *fpOut // 输出文件的指针\x0d\x0a\x0d\x0achar str[120] // 用来存储从文件中读取出的”一行“字符串信息\x0d\x0a\x0d\x0aint row = 1\x0d\x0a\x0d\x0afpIn = fopen("data5612.cpp", "r") // 以只读和文本格式打开data5612.cpp,这里的文件名无所谓大小写\x0d\x0a\x0d\x0afpOut = fopen("data5612.txt", "w") // 以创建方式(也叫写方式)打开data5612.txt文件\x0d\x0a\x0d\x0afgets(str, 81, fpIn) // 从文件中读取一行信息,保存到str数组中。这里要注意的是这个81,一般情况下,编写文本格式文件的人,都习惯遇到行尾就敲回车,所以,一般情况下,文本文件一行最多80个字符。如果,一行不够80个字符,这个函数会自动只读到'\n'就结束了。\x0d\x0awhile(!feof(fpIn))// 判断上一次fgets()是否正常(即,没有遇到文件尾部)\x0d\x0a\x0d\x0a{\x0d\x0a\x0d\x0afprintf(fpOut, "%04d %s\n", row, str)// 在读入的每一行信息前,加入0000到9999的
行号(应该够用了吧),呵呵呵呵\x0d\x0a\x0d\x0arow++// 行号加一\x0d\x0a\x0d\x0afgets(str, 81, fpIn)// 读取下一行\x0d\x0a\x0d\x0a}\x0d\x0a\x0d\x0afclose(fpIn) // 关闭文件\x0d\x0a\x0d\x0afclose(fpOut)\x0d\x0a\x0d\x0a}\x0d\x0a\x0d\x0a程序已验证,木有问题。
一个源程序到一个可执行程序的过程:预编译、编译、汇编、链接。其中,编译是主要部分,其中又分为六个部分:词法分析、语法分析、语义分析、中间代码生成、目标代码生成和优化。
预编译:主要处理源代码文件中的以“#”开头的预编译指令。处理规则如下:
1、删除所有的#define,展开所有的宏定义。
2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”。
3、处理“#include”预编译指令,将文件内容替换到它的位置,这个过程是递归进行的,文件中包含其他文件。
4、删除所有的注释,“//”和“/**/”。
5、保留所有的#pragma 编译器指令,编译器需要用到他们,如:#pragma once 是为了防止有文件被重复引用。
6、添加行号和文件标识,便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号。
扩展资料:
编译过程中语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断,其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义。
其中,静态语义通常包括:声明和类型的匹配,类型的转换,那么语义分析就会对这些方面进行检查,例如将一个int型赋值给int*型时,语义分析程序会发现这个类型不匹配,编译器就会报错。
评论列表(0条)