cpp: compiler -- 玩具

发布时间 2024-01-08 22:47:57作者: lnlidawei

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、无