![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
编译原理
文章平均质量分 83
编译原理课程实验集萃
逆行的炸酱面
一斤代码十撮头发
展开
-
借助Flex实现SysY词法分析
词法分析(lexical analysis)是编译器的第一阶段,主要是将代码的字符序列转换为token的过程。简单地来说,就是对代码进行切块的一个过程,并将每一块添加上其所属的类别标签。比如说int asd=897;,其词法分析的结果即为int :< TYPE , ‘int’ >asd :< ID , ‘ast’ >= ...原创 2022-03-22 04:40:45 · 2898 阅读 · 1 评论 -
<编译原理> NFA转DFA算法
本文借助Graphviz库实现了NFA转DFA,并输出DFA的状态转移图。∅ Graphviz库介绍你一定很疑惑我昨天刚介绍完Transitions库今天怎么就就换了一个绘制库。ummm…Transitions库其实更注重于状态机本身的实现,当你想用状态机来实现某些功能时,Transitions库是一个很好的选择,而绘制状态转移图只是其中的一个子功能,更重要的是无法(...原创 2022-05-11 17:41:38 · 145 阅读 · 0 评论 -
<编译原理> 提取左公因子算法
本文实现了一个较为简单的算法——文法的左公因子提取。umm其实也称不上是算法。我们的目标非常明确,就是将文法产生式的左公因式都提出来,需要注意以下几点:在一个产生式中需要提取范围最大的公因式,即拥有该左公因式的右部应该尽可能得多提取左公因子之后会产生新的产生式,该产生式也可能存在左公因子,需要一并提取,因此是一种递归的思想好像也就这两点…那么我们只需要...原创 2022-06-06 08:47:59 · 286 阅读 · 0 评论 -
手撕词法分析Lexer
本文介绍如何手撕词法分析器,整体来说难度不大,还是文件读取麻烦。lexer.h#ifndef LEXER_H#define LEXER_H#include <iostream>#include <fstream>#include <vector>#include <string>using namespac...原创 2022-05-30 01:24:59 · 74 阅读 · 0 评论 -
<编译原理> 左递归消除算法
本文介绍消除文法左递归的算法,并输出新文法产生式。消除左递归在语法分析阶段是比较重要的一个过程,尤其在自顶向下的分析过程中,编译器会尝试各个推导式,如果存在左递归,那么推导过程将会用永无止境。比较显式的左递归我们称之为直接左递归,比如说其中表示非空的表达式,表示不以非终结符A开头的表达式。那么我们知道对于非终结符A来说,最终只能以到来结束,否则依然会含有非终结符...原创 2022-05-17 06:32:09 · 78 阅读 · 0 评论 -
Bison^Flex=语法分析生成中
两种思路本质上就是选择树的根还是叶子结点作为分析的起点来考虑的,但这并不是本文的重点,你只需知道Bison生成的语法分析器代码采用的是自底向上的思路,而我们只要提供给Bison相应的文法即可得到该文法对应语言的语法分析器。中,token的值是在Flex与Bison之间传递,而非终结符的值则是在产生式之间传递,即当一个非终结符A被归约出来后,我们可以对其进行相应类型的赋值,随后在A被归约时则会带着之前的赋值从产生式左部转移到另一个产生式的右部,那么我们就可以用A的值来定义新归约出来的非终结符的值。原创 2022-05-05 06:10:54 · 2728 阅读 · 5 评论 -
<编译原理> 正则表达式转NFA算法
本文借助transitions库基于逆波兰表示法(Reverse Polish Notation,RPN)实现了正则表达式转NFA,并画出相关的状态转移图。∅ Transitions库介绍引用官网中的一句话“They say a good example is worth 100 pages of API documentation, a million direct...原创 2022-05-09 10:35:02 · 52 阅读 · 0 评论