flex-bison

前言

这段时间沉迷编译原理…踩了不少坑也涨了不少姿势…
一个项目:https://github.com/imbaya2466/java2native
用于java到本地代码的编译….写到最后基本就剩个基本的函数语句native化了….语法太庞大了根本写不动啊..

个人的小见解:

脚本语言 :适合小型命令式快速脚本,依托于万能的库
面向对象语言 :适合工程项目,易于建模。
过程语言 : 贴近底层(汇编就是过程式的)全面控制计算机

建议: 一门万能语言c++ 、一门脚本语言py 、一门纯对象式语言java

编译器基本架构–这部分提出单做一篇博客

以中间IR指令分为俩大部分

前端

从源码生成中间指令IR

词法分析

输入:代码字符流
输出:单词token
正则通常是描述词法的.
基本的过程有俩种,通过文法构造NFA,再简化NFA到DFA,基于DFA实现代码.
或者直接通过正则构造NFA,DFA.这个步骤可以用自动工具解决.比如lex

语法分析

输入:单词token流
输出:语法树的后序遍历.最好直接生成AST
BNF是描述文法的
语法分析主要分俩类,自底向上与自上而下.上下如算符优先法与递归下降.下上如移进归约
LL表示从左到右分析左归约,LR表示从左到右分析右归约.归约顺序不影响语法树的生成.语法树始终与语法描述一致.
每种分析法可分析的语法语义强度不同.LR(K)分析表范围更大.
核心为将文法转化为分析表,这同样有自动化工具,如yacc.顺提一下语法分析工具非常的多,甚至有的提供了大量的语言解析库,可以直接生成目标代码的AST…..如ANTLR

AST

语法树的抽象,简单来讲就是去掉了语法树中没用的部分,提出了语法的核心:函数定义,语句,表达式.
去掉的部分如:各种标点符号关键字,树结构本身能代表{}()之类的符号,关键字每个节点的类型就表达了。
其意义就是输入源的最简洁抽象树型表示。

语义分析

这部分还未实现,了解中…
其意义是保证该单元可进行编译,符合语言的要求。这部分专心检查与填符号表信息(放临时变量与类型、大小,不放相对地址)符号表项与AST节点往往对应。
解析AST,判断其内容是否符合类型定义,属性与符号表内容的主要填写时机.
属性文法:每个AST节点携带属性值,如类型,长度,位置等.按节点类型不同有所不同
生成的符号表是链式表示作用域的,相对地址确定在中间代码生成时,地址与作用域无关!!!作用域大多数是编译器在该时段检查的。而地址则是根据过程、全局中的定义与初始化语句确定的,在中间代码生成时填写。

中间代码

专心翻译成三地址码-表示数据与操作,数据全部来源于符号表。
变量无限。此时已经没有了作用域的概念,只有数据与操作。以过程为单位书写,数据的位置决定其相对地址(过程外的为数据区地址,过程内的为栈中相对地址)–这种表示贴近汇编。
中间代码与汇编比较:

  1. 中间代码变量无限,变量不用定最终地址,非临时变量与部分变量定相对过程地址即可
  2. 中间代码操作更抽象,只表示基本操作->函数调用对象与参数、跳转、数据计算、赋值、等。而汇编往往指令更多。

了解中…

后端

我还没写。见llvm

flex

要点:

  1. 匹配正则按最长,同长按先出现的,因此先写关键字的匹配再写标识符
  2. 可以用状态机制(干预自动生成的DNF)处理注释内容
  3. 正则优先级:()[] 大于 *+? 大于 字符连接 大于 |
  4. 转义有俩种方式:”xxx”或者\x “”内的内容作为字符匹配
  5. 数字+-交给语法分析,因为根据最长规则会使3-2匹配为3 -2
  6. 识别每个单词后有动作,使用return可以在yylex函数中返回,使得每次调用yylex读取一个token
  7. yylval由yacc定义,是用于内容栈的,而yylex返回的用于分析栈

bison

要点:

  1. 一个分析栈和一个内容栈。分析栈中保存着终结符和非终结符, 并且代表当前剖析状态。内容栈是一个 YYSTYPE 元素的数组,对于分析栈中的每一个元素都保存着一个对应的值。
  2. lex return的类型进入分析栈–lex返回终结符一步步语法分析。yylval进入内容栈。$$访问的是内容栈,其类型为YYSTYPE。正是属性文法的属性
  3. 当bison分析语法规则时遇到冲突时,会查优先级表来解决冲突。优先级表按下方的高,同等级按结合性.优先级的表示可以用语法也可以用优先级规则,这样可以省去很多语法说明
  4. 以进归约冲突默认以进,归约归约冲突按先出现的
  5. %prec可以指定某个产生式的优先级-可以尝试用其在不改变bnf的情况下解决错误
  6. 用<>选择yystype的类型
  7. 关于flex与bison的详细资料可以查看flex与bison 中文版 第二版