手写一个c语言编译器,【图片】17年1.9开启我的C语言学习之路—小白篇【c语言吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

什么是程序呐?

我们说这个程序与你的生活有关,通常是达到某个目标或解决某个问题中所需要的步骤或过程,这一系列的步骤就是程序。

生活中的程序与计算机中的程序的认识?

先说下生活中的程序,打个比方,老板给秘书打电话,老板向秘书下达指令,今天要做1.2.3.4个事务,这其中那个1.2.3.4个事务就是秘书要执行的一组指令。

在说下计算机程序的认识吧,和上述很相同,只是把秘书换成了一台计算机,也是通过1.2.3.4这四个指令向计算传达过去,计算机会严格事务的顺序去执行命令,所以我们在来看一下计算机中的程序概念:为了让计算机执行某些指令或解决某些问题而编写的一些列有序的指令集合。

什么是算法?

解决问题的具体的步骤和方法

举个列子我们要让计算机输出长方形的面积

们需要四个步骤:

1.我们需要用户输出长方形的长度和宽度的值

2.我们要判断用户输入的两个值是否大于0

3.如果两个值大于0,让长度值乘以宽度值得到面积,否则输出输入错误。

4.显示输出的面积

什么是流程图?

流程图就是算法的一种图形化表示

流程图有什么作用?

流程图的作用在于清晰,能让人更直观的理解程序员的算法,也能让程序设计者思路更清晰。

流程图有那几个部分?

有开始/结束、输入/输出、处理、判断、流程线、连接符

编程语言分为高级语言和低级语言,能让机器也就是计算机更容易理解的语言我们称之为低级语言,通过某些技术软件能让人更容易理解的语言我们称之为高级语言,C语言就是那个技术软件,我们可以通过我们人能理解的语言去编写程序,所以C语言是一种高级的语言,之后C语言通过编译器或解释器把人的语言转换为机器也就是计算机能懂得二进制语言。

我还了解到了一些细节,比如说C语言既是高级语言也是低级语言,原因在于C语言实现了对硬件的编程操作,它既可以用于系统软件的开发,也适用于应用软件的开发

C语言的特点,可移植性强,开发效率高

(以上是小弟纯手写笔记,只是笔记而已,如果有错误或是我理解不到位的地方,非常欢迎吧友们指点一二,小弟在此谢过)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成一个完整的C语言子集编译器需要进行很多工作,下面是一个简单的步骤说明: 1. 词法分析器:使用正则表达式库regex或自己手写有限状态自动机来实现。 2. 语法分析器:采用递归下降分析法,根据C语言的文法规则进行递归下降分析,生成语法树。 3. 语义分析器:对语法树进行遍历,进行类型检查和语义检查,生成中间代码。 4. 中间代码优化:对中间代码进行优化,例如常量折叠、死代码删除、循环展开等。 5. 目标代码生成:将优化后的中间代码转换为目标代码,例如汇编语言或机器语言。 下面是一个简单的代码示例: ```c++ #include <iostream> #include <regex> #include <string> #include <vector> using namespace std; // 定义单词类型 enum TokenType { KEYWORD, // 关键字 IDENTIFIER, // 标识符 CONSTANT, // 常量 OPERATOR // 运算符 }; // 定义单词结构体 struct Token { TokenType type; // 单词类型 string value; // 单词值 int line; // 单词所在行数 }; // 定义词法分析器类 class Lexer { public: Lexer(string code) { this->code = code; this->pos = 0; this->line = 1; } // 获取下一个单词 Token getNextToken() { // 如果已经到达代码末尾,返回空单词 if (this->pos >= this->code.size()) { return Token{OPERATOR, "", this->line}; } // 匹配关键字和标识符 regex keyword_regex("^(int|float|double|char|void|if|else|for|while|do|switch|case|default|return)\\b"); regex identifier_regex("^([a-zA-Z_][a-zA-Z0-9_]*)\\b"); smatch match; if (regex_search(this->code.substr(this->pos), match, keyword_regex)) { string keyword = match[1]; this->pos += keyword.size(); return Token{KEYWORD, keyword, this->line}; } else if (regex_search(this->code.substr(this->pos), match, identifier_regex)) { string identifier = match[1]; this->pos += identifier.size(); return Token{IDENTIFIER, identifier, this->line}; } // 匹配常量 regex constant_regex("^([0-9]+(\\.[0-9]+)?)\\b"); if (regex_search(this->code.substr(this->pos), match, constant_regex)) { string constant = match[1]; this->pos += constant.size(); return Token{CONSTANT, constant, this->line}; } // 匹配运算符 vector<string> operators = {"+", "-", "*", "/", "%", "(", ")", "{", "}", "=", "==", "!=", "<", ">", "<=", ">="}; for (string op : operators) { if (this->code.substr(this->pos, op.size()) == op) { this->pos += op.size(); return Token{OPERATOR, op, this->line}; } } // 如果无法匹配任何单词,返回空单词 return Token{OPERATOR, "", this->line}; } private: string code; // C代码 int pos; // 当前扫描位置 int line; // 当前行数 }; // 定义语法分析器类 class Parser { public: Parser(Lexer lexer) { this->lexer = lexer; this->current_token = this->lexer.getNextToken(); } // 解析程序入口 void parse() { while (this->current_token.type != OPERATOR) { if (this->current_token.type == KEYWORD) { this->parseKeyword(); } else if (this->current_token.type == IDENTIFIER) { this->parseIdentifier(); } else if (this->current_token.type == CONSTANT) { this->parseConstant(); } else if (this->current_token.type == OPERATOR) { this->parseOperator(); } } } private: Lexer lexer; // 词法分析器 Token current_token; // 当前单词 // 解析关键字 void parseKeyword() { // TODO: 解析关键字 cout << "解析关键字 " << this->current_token.value << endl; this->current_token = this->lexer.getNextToken(); } // 解析标识符 void parseIdentifier() { // TODO: 解析标识符 cout << "解析标识符 " << this->current_token.value << endl; this->current_token = this->lexer.getNextToken(); } // 解析常量 void parseConstant() { // TODO: 解析常量 cout << "解析常量 " << this->current_token.value << endl; this->current_token = this->lexer.getNextToken(); } // 解析运算符 void parseOperator() { // TODO: 解析运算符 cout << "解析运算符 " << this->current_token.value << endl; this->current_token = this->lexer.getNextToken(); } }; int main() { string code = "int main() { int a = 1 + 2; return a; }"; Lexer lexer(code); Parser parser(lexer); parser.parse(); return 0; } ``` 这是一个简单的例子,实现了词法分析器和语法分析器的基本功能。需要注意的是,这只是一个简化版的编译器,实际的编译器需要处理更多的语法规则和语义信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值