cpp: compiler -- 玩具
一、compiler 构思
1、文本读取:“编译器”,读取“源程序文本(xx.txt)”;
2、词法分析:“编译器”,将“xx.txt”分解成“字符串”;
3、语法/语义分析:“编译器”,检验“字符串”的语法规则;解析并且赋予“字符串”的语义属性;
4、翻译1:将“源程序文本”依据“字符串的语义”,翻译成“中间代码”;“中间代码”是“伪汇编代码”;
5、优化1:将“中间代码”优化成“简洁的中间代码”;“简洁的中间代码”仍然是“伪汇编代码”;
5、翻译2:将“简洁的中间代码”翻译成“机器代码”(二进制类型的程序);
6、连接:将分散的“多个程序段”合成一个可执行的文件,包含“重新定位各个程序段在内存中的位置”。
二、源码
1 [wit@fedora tmp]$ cat compiler.cpp
2 #include <iostream>
3 #include <string>
4
5 using namespace std;
6
7
8 void readf(string *fname, string *data)
9 {
10
11 }
12
13 void writef(string *fname, string *data)
14 {
15
16 }
17
18
19 void println(string *data)
20 {
21 cout << "<compiler> " ;
22 int i=0;
23 while(data[i] != "ENDS")
24 {
25 if ( i%5==0 && i!=0 ) { cout << endl; cout << "<compiler> " ; }
26 cout << data[i] << ' ' ;
27 i++;
28 }
29 i=0;
30 cout << endl;
31 }
32
33 int main(int argc, char *argv[], char *envp[])
34 {
35
36 string d[] = { "lidawei", "david", "lndavid", "lzdavid", "lnlidawei", "lzlidawei", "ENDS" };
37 string *data;
38 string fname = "f.txt";
39 data = d;
40 readf(&fname, data);
41 writef(&fname, data);
42 println(data);
43
44 return 0;
45 }
46 [wit@fedora tmp]$
三、运行
1 [wit@fedora tmp]$ alias | grep "gpp"
2 alias gpp='g++ -g -Wall -std=c++20 -o'
3 [wit@fedora tmp]$
4 [wit@fedora tmp]$
5 [wit@fedora tmp]$ gpp compiler compiler.cpp && ./compiler
6 <compiler> lidawei david lndavid lzdavid lnlidawei
7 <compiler> lzlidawei
8 [wit@fedora tmp]$
9 [wit@fedora tmp]$
四、参考
1、无
本文由 lnlidawei 原创、整理、转载,本文来自于【博客园】; 整理和转载的文章的版权归属于【原创作者】; 转载或引用时请【保留文章的来源信息】:https://www.cnblogs.com/lnlidawei/p/17953424