lnlidawei

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  430 随笔 :: 1 文章 :: 3 评论 :: 21万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

 

posted on   lnlidawei  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2023-01-08 asm:debug 命令(windows)
点击右上角即可分享
微信分享提示