用java写一个编译器(1)基本知识

   由于想研究一些底层的东西,就学习了编译原理。无意中在b站看到了coding迪斯尼老师的 java写编译器的课程,学完真让我收益匪浅。但学归学,终究还是要动手实操一下的。先走一遍知识脉络。详细的可看coding迪斯尼老师的博客(tyler_download

https://blog.csdn.net/tyler_download/article/details/50708807

1.概述:

       编译器就是将高级语言编译(翻译)成汇编语言的过程

2.词法分析在这个过程中干了些啥:============>给每个符号(单词)打上标签。这样计算机就能认识每个单词(能辨别那个是动词,那个是名词,那个是形容词,介词。。。。。)       

 

词法分析:                                                                             语法分析:

                                     

.3.语法分析:在词法分析的基础上(知道哪个是乘号,那个是加号,那个是左括号。。。),根据语法规则(先执行啥,后执行啥==========一个算法式子里:规定的语法就是先执行括号里面的,在执行乘除,然后加减)来解释并交给cpu去执行(计算)用户传来的文本(运算表达式)。计算结果是对的,就说明它正确读懂了这个句子。==============如上图:由词法分析计算机先知道了这个字符串里有数字1,2,3,有运算符+和*,由词法分析,计算机知道了:我要先给数字1,2,3分配内存(放到操作栈里面),再计算2*3的值,最好才执行加1的操作

 

一个完整的编译器一个非常复杂的任务,需要掌握编译原理、数据结构、算法等知识。以下是一个简单的示例,用于说明编编译器的基本流程。 1. 词法分析器(Tokenizer):从源代码中读取字符流,将其转换为标记流(Token Stream),并识别出每个标记的类型。例如,标识符、关键字、数字、运算符、界符等。 2. 语法分析器(Parser):将标记流转换为语法树(Syntax Tree),并检查其语法结构是否正确。例如,检查是否缺失分号、是否有未定义的变量、是否存在歧义等。 3. 语义分析器(Semantic Analyzer):对语法树进行语义分析,检查其语义是否正确。例如,检查类型匹配、作用域、函数调用参数正确性等。并对语法树进行变换,消除歧义。 4. 代码生成器(Code Generator):将语法树转换为目标代码。这个过程通常是将语法树转换为中间代码(Intermediate Representation),然后再将中间代码转换为目标代码。中间代码可以是抽象语法树(Abstract Syntax Tree)或三地址码(Three Address Code)。 5. 目标代码优化(Code Optimization):对目标代码进行优化,以提高代码的执行效率。例如,常量折叠、死代码消除、循环不变式外提等。 以下是一个简单的Java编译器示例: ```java public class Compiler { public static void main(String[] args) { String input = "class HelloWorld {\n" + " public static void main(String[] args) {\n" + " System.out.println(\"Hello, World!\");\n" + " }\n" + "}\n"; Tokenizer tokenizer = new Tokenizer(input); Parser parser = new Parser(tokenizer); AST ast = parser.parse(); SemanticAnalyzer semanticAnalyzer = new SemanticAnalyzer(); semanticAnalyzer.analyze(ast); CodeGenerator codeGenerator = new CodeGenerator(); String code = codeGenerator.generate(ast); System.out.println(code); } } ``` 这个编译器的功能很简单,只能编译一个输出"Hello, World!"的Java程序。但是,它演示了一个编译器的基本流程,包括词法分析、语法分析、语义分析和代码生成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值