导航:首页 > 源码编译 > yacc编译器开发

yacc编译器开发

发布时间:2022-08-03 03:48:28

1. 如何编写简单的java编译器(用java语言),比如说能翻译诸如"public static void main" 的就行。

看看《编译原理》或许对你有帮助。
要编译一门语言,你要知道它的语法 syntax 和语义 semantics,语法是用来检查所谓的“语法错误”,语义是让语句变得有意义,对计算机程序语言来说,就是把它翻译成计算机能执行的指令。
你需要了解最基本的一些概念诸如正则表达式,上下文无关语言,上下文相关语言,等等。

《编译原理》是很通用的基础书籍,里面我记得有介绍了 yacc 的用法,这是 GNU 里的一款编译器的编译器,对应有一个 Java 的 Project 叫 yacc for Java,你可以去 google 找一下。

如果你能写出一个检查语法错误的程序就已经很不错了,你可以考虑改做一个编辑器之类的软件(只需要找错,不需要编译)。如果你真要做编译器,工程量巨大不说,你首先需要对至少两种语言都熟悉,你需要对计算机的指令和它的执行方式有深刻理解,尤其是 Java 这种动态的高级语言,有类啊对象啊什么的,要把它翻译成机器指令实属不易,至今除了 Sun 的 javac 都没有很成功的编译器,那个 GCJ(把 Java 编译成本地代码)的尝试也只成功了一半,以前还被 MingW 包含在工具箱里(和 GCC 什么的一起),但是有很多特性不支持,而且已经很久不更新了,新版本的 MingW 里都没有了。想一个人从零开始设计一款 Java 的编译器,即使是专家都做不到啊。

2. 正在做一个小型编译器,请问如何把中间表达式如何生成C语言

你的意思不是很明白。
我就简单说下一个我当时写一个简单编译器的流程吧
首先你得确定文法,然后再开始写编译器
1. 用flex写词法分析程序,具体的网上有很多资料。
2. 用yacc写语法分析程序,可以分几步来写
先写一个语法树生成程序,打印出语法树,可以进行简单的类型检查;
再使用语法制导的翻译方案,写一个中间代码生成程序。
3. 将中间代码翻译成汇编语言,优化就不做了太麻烦。

推荐龙书

3. 汇编语言编译器是怎么编写的

编译器自举!搜索这个关键字
程序都是编译器编译的。这个是肯定的
至于第一款X语言编译器是不是直接1010101010自己写的那就不知道啦

一般开发编译器的话。有两条路选择
1.利用yacc(或者其变种)&lex(词法分析)-等工具自己生成语法模板
词法语法都可以使用这些工具自己生成
然后自己编写生成的中间码和生成的机器码就可以了
一般做编译原理类似试验都是如此的。许多编译器也的确是这样

2.自己写词法分析和语法分析。可以参考一些开源的编译器
lcc-这个是ANSI C99标准的编译器是开源的
或者nasm,watcom等编译器到www.sf.net上不少开源的编译器

总的来说。高级语言编译器比较难写
如果想快速写出一个的话
可以采用第一种做法。利用工具生成语法词法模板
先写一个简单的汇编编译器比较简单
开源的有nasm,jwasm(支持masm语法开源的编译器)
http://www.japheth.de/JWasm.html
fasm(这款编译器是自举的.就是自己可以编译自己),
http://flatassembler.net/

剩下的就是自己做好语言规则关键字map
引用高手的话。语言map做好了你的编译器也做好一半了
剩下的都是机械性的工作了。
生成x86或者arm指令。

优化工作这个很难解释.根据你所需要的做吧
毕竟可以做出一个无错,又XX的编译器已经很难得

你可以选择使用现有的编译器开发自己的编译器
然后等到你的编译器支持相当数量指令和成熟度的时候
使用自己的语法重新写一遍编译器.
这样你就可以用自己的编译器开发自己的编译器了(是不是很邪恶?)

另外举几个例子
Delphi的编译器是C++ Builder开发的。
而C++ Builder的IDE是Delphi开发的
C++ Builder的编译器是C++ Builder开发的-这个就是编译器自举了。。Delphi和C++ Builder共享一个后端化优化器。
Delphi 早期的版本的编译器是tasm直接编译的。可见Anders的汇编功力多强悍(Anders也就是后来VJ++,C#,.NET工程的核心架构师.最关键的灵魂级人物)

VC++的编译器是VC++开发的。很明显这都说明了编译器自举
自己开发自己。如果一个编译器可以做到自己编译自己。那基本上就可以实现任何功能了。

关于编译器开发的书籍可以看一下
龙书《编译原理(第二版)》
虎书《现代编译原理-C语言描述》
鲸书《高级编译器设计与实现》
建议从鲸书看起。然后是龙书
再来是虎书--虎书里面描述了许多现代编译器(正如其名)技术
例如面向对象啦,优化,垃圾回收等等.
鲸书看完基本上就可以实现一个简单的Tiny C编译器了
然后在龙书巩固,读一下语言规范,自己看一些开源的汇编编译器代码
自己就可以尝试做一个汇编语言编译器了.等到技术提高了
在尝试做一些高级语法识别,参考LCC代码做一下ANSI C99的
C语言编译器。再来就看你自己的兴趣和领悟度拉
如果想支持C++的话就得要对编译器做许多方便的研究

类似Java那种跨平台或者Ruby,Python等动态语言
虎书中也有描述。当然看自己功力了

4. YACC用的是哪种翻译程序,是汇编程序、编译程序还是解释程序

YACC的输入文件称为YACC 源文件,它包含一组以BNF书写的形式文法规则以及对每条规则进行语义处理的C语言语句。输出的是基于表驱动的编译器,包含输入的语法规约的处理代码部分。在生成LALR分析表的过程中发现冲突时,YACC解决冲突的基本思想是:对各个重写规则和各个终结符号给一个优先级。并且指明终结符号具有左结合性还是右结合性,而且还允许对于不具有结合性的运算符指明不可结合性。文法连同优先级与结合性等信息在YACC说明书中给出,它由YACC编译器翻译为识别程序源程序,再由C编译器编译连接成可执行的识别程序。因此,YACC说明书也称为YACC源程序。

5. 如何利用yacc自动生成工具得到语法语义分析程序

  1. 通常是作为编译器或解释器的组件出现的,它的作用是进行语法检查、并构建由输入的单词组成的数据结构(一般是语法分析树、抽象语法树等层次化的数据结构)。

  2. 语法分析器通常使用一个独立的词法分析器从输入字符流中分离出一个个的“单词”,并将单词流作为其输入。实际开发中,语法分析器可以手工编写,也可以使用工具(半)自动生成。

6. 很奇怪为什么国内没有任何组织或个人开发最底层的中文编译器呢

这是一个技术问题,你如果没读过编译原理(龙书)的话,你是看不懂下面的回答的。因为中国技术不足,没人能写出支持中文的lex和yacc。首先词法分析生成器lex,就对中文不友好,它只支持ascii字母,不支持中文。这意味着你编译器里的词汇只能是英文单词,不能是中文词汇。其次就是语法分析生成器yacc了,也不支持中文,只支持用英文写的语法规则,不能用中文书写。这意味着最最基本的语法规则是全英文的,这算哪门子中文编程语言。非常遗憾,中国目前没有牛人造出支持中文的lex和yacc来,否则全中文编译器一定会满天飞的,多到烂大街。为什么说多到烂大街?一个全中文的编译器其实仅仅需要修改编译器的前端词法分析器和语法分析器(语法分析器甚至无需大改动),后端直接对接开源代码即可,开源英文编译器已经烂大街了,把它们的后端移植过来就行了。但关键就是没有支持中文的自动化工具lex和yacc。
自动化这条路走不通,纯手写总可以吧。我猜测易语言就是前端纯手写的全中文编译器。你可以使用易语言,绝对可以达到你的要求。但是从技术的角度来讲,lex和yacc的技术高度远高于易语言,毕竟lex和yacc号称编译器的编译器,编译器之母。

7. 如何用Yacc实现一个Python的编译器

理论上是可以的,关键点在于您要在Lexer和Parser之间要多加一层,用于分析哪些地方是进入缩进,哪些地方是退出缩进。然后匹配到缩进的时候插入INDENT和DEDENT这样的Token。至于分析的方法,您可以先建一个Stack来存放每一层缩进块的Token,然后根据Lexer送来的Token中的行号、列号等信息来和Stack栈顶的数据进行对比,判断下来是该进入缩进的就push一个INDENT,并这个INDENT插入到输出的Token流中。发现是Stack中旧的Token匹配的,就把之前的缩进块pop出来,并在输出的Token流中插入DEDENT。然后在Paser层面处理语句块的时候可以这样处理(我只写大概意思的伪码,具体您自己看着办)block ::= INDENT NLS statements NLS DEDENTif ::= IF LPAREN expression RPAREN COLON block

8. 怎样去写一个编译器(用C语言写C语言编译器),需要哪些知识做铺垫,可以给一下相关网站和书籍的推荐吗

写编译器重点就是设计并实现一些数据结构和算法,语言特点太多的话,代码写起来不容易,建议你找一个小语言尝试下,不要一开始就去尝试成熟语言。否则你会在写完语法分析程序以后,遭遇到很大的困难。多数人都是在写语义分析程序的时候,突然发现自己设计的数据结构很烂,后边越写越要命。
如果你想入门编译器的话,那么可以看《编译原理与实践》,整本书先将编译器理论,然后后边教你一步步实现c-miuns(c的子集)的编译器,包括lex,yacc,都在几千行代码左右。这本书讲的比较简单易懂一点
也可以学学斯坦福大学的编译器设计公开课(aiken设计了一个叫cool的语言,专门用来教人写编译器),课程地址上面有人给了:Compilers。这门课以前有个实验环境(据说已经给了,我以前写的时候还是用的网上一个不完整的实验环境),把和编译器知识无关的内容都给你写好了,你只需要在固定的地方填上你的内容就可以写出你的编译器(不要觉得很简单哦,人家的代码写的很精巧的,读完就发现写个好编译器还是很费脑子的),另外,这个实验环境有个特点,就是在每一步都提供标准程序做对比,你可以在写完一部分以后就同标准程序对比,及时发现错误。这种方式为写编译器又提供了很多帮助
先找个小的,慢慢研究,弄懂了整体的结构再说

9. 请问学x86汇编语言用什么编译器

编译器自举!搜索这个关键字
程序都是编译器编译的。这个是肯定的
至于第一款X语言编译器是不是直接1010101010自己写的那就不知道啦

一般开发编译器的话。有两条路选择
1.利用yacc(或者其变种)&lex(词法分析)-等工具自己生成语法模板
词法语法都可以使用这些工具自己生成
然后自己编写生成的中间码和生成的机器码就可以了
一般做编译原理类似试验都是如此的。许多编译器也的确是这样

2.自己写词法分析和语法分析。可以参考一些开源的编译器
lcc-这个是ANSI C99标准的编译器是开源的
或者nasm,watcom等编译器到上不少开源的编译器

总的来说。高级语言编译器比较难写
如果想快速写出一个的话
可以采用第一种做法。利用工具生成语法词法模板
先写一个简单的汇编编译器比较简单
开源的有nasm,jwasm(支持masm语法开源的编译器)

fasm(这款编译器是自举的.就是自己可以编译自己),

剩下的就是自己做好语言规则关键字map
引用高手的话。语言map做好了你的编译器也做好一半了
剩下的都是机械性的工作了。
生成x86或者arm指令。

优化工作这个很难解释.根据你所需要的做吧
毕竟可以做出一个无错,又XX的编译器已经很难得

你可以选择使用现有的编译器开发自己的编译器
然后等到你的编译器支持相当数量指令和成熟度的时候
使用自己的语法重新写一遍编译器.
这样你就可以用自己的编译器开发自己的编译器了(是不是很邪恶?)

另外举几个例子
Delphi的编译器是C++ Builder开发的。
而C++ Builder的IDE是Delphi开发的
C++ Builder的编译器是C++ Builder开发的-这个就是编译器自举了。。Delphi和C++ Builder共享一个后端化优化器。
Delphi 早期的版本的编译器是tasm直接编译的。可见Anders的汇编功力多强悍(Anders也就是后来VJ++,C#,.NET工程的核心架构师.最关键的灵魂级人物)

VC++的编译器是VC++开发的。很明显这都说明了编译器自举
自己开发自己。如果一个编译器可以做到自己编译自己。那基本上就可以实现任何功能了。

关于编译器开发的书籍可以看一下
龙书《编译原理(第二版)》
虎书《现代编译原理-C语言描述》
鲸书《高级编译器设计与实现》
建议从鲸书看起。然后是龙书
再来是虎书--虎书里面描述了许多现代编译器(正如其名)技术
例如面向对象啦,优化,垃圾回收等等.
鲸书看完基本上就可以实现一个简单的Tiny C编译器了
然后在龙书巩固,读一下语言规范,自己看一些开源的汇编编译器代码
自己就可以尝试做一个汇编语言编译器了.等到技术提高了
在尝试做一些高级语法识别,参考LCC代码做一下ANSI C99的
C语言编译器。再来就看你自己的兴趣和领悟度拉
如果想支持C++的话就得要对编译器做许多方便的研究

类似Java那种跨平台或者Ruby,Python等动态语言
虎书中也有描述。当然看自己功力了

阅读全文

与yacc编译器开发相关的资料

热点内容
压迫感的照片是什么app 浏览:249
今日股价突破三年新高源码 浏览:840
苹果x为什么按着app屏抖 浏览:737
java反射创建实例 浏览:739
e筋翻样需要加密狗吗 浏览:606
多火文件夹怎么删 浏览:932
对m1卡进行加密 浏览:767
基岩版服务器如何加模组 浏览:133
3dmax移除命令 浏览:553
w7自动关机命令无效 浏览:677
潜水泵3kw线圈能加密吗 浏览:470
解压要带什么去车管所 浏览:54
宝马live导航数据无法解压 浏览:785
检测目标单片机需要多久 浏览:602
5日均线上穿25日均线源码 浏览:294
手机系统无命令 浏览:999
云服务器怎么穿透 浏览:189
abb机器人码垛编程序 浏览:153
不专业程序员的日常解密 浏览:486
安卓手机怎么变成苹果封面 浏览:511