使用FlexBison创建新的编程语言

el/2024/5/21 20:31:13

编译器基本流程

  1. 对源文件进行扫描,将源文件的字符流拆分分一个个的词(记号),此为词法分析;
  2. 根据语法规则将这些记号构造出语法树,此为语法分析;
  3. 对语法树的各个节点之间的关系进行检查,检查语义规则是否被违背,同时对语法树进行必要的优化,此为语义分析;
  4. 遍历语法树的节点,将各节点转化为中间代码,并按特定的顺序拼装起来,此为中间代码生成;
  5. 对中间代码进行优化;
  6. 将中间代码转化为目标代码;
  7. 对目标代码进行优化,生成最终的目标程序。
    编译器基本流程

Flex&Bison简介

Flex是一个词法分析器(lexer),是Unix lex的GNU克隆,作用是把"词"抽象成符号(token),供程序识别。
Bison则是一个语法解析器(parser),也是Unix yacc的GNU克隆,语法就是在这里定义,是语言设计的核心。
如果你需要分析或处理Linux或Unix中的文本数据,可以使用flex和bison迅速解决问题。不但可以应付复杂的语法处理,也可以拿来制作简单的分析器,如配置文件等。

词法分析器(lexer)

词法分析也称为分词 ,此阶段编译器从左向右扫描源文件,将其字符流分割成一个个的词(token),是源文件中不可再进一步分割的一串字符,类似于英语中单词,或汉语中的词。
词法分析

直接扫描法
func (l *Lexer) NextToken() token.Token {var tok token.Tokenl.skipWhitespace()switch l.ch {case '=':if l.peekChar() == '=' {ch := l.chl.readChar()tok = token.Token{Type: token.EQ, Literal: string(ch) + string(l.ch)}} else {tok = newToken(token.ASSIGN, l.ch)}case '+':tok = newToken(token.PLUS, l.ch)case '-':tok = newToken(token.MINUS, l.ch)case '!':if l.peekChar() == '=' {ch := l.chl.readChar()tok = token.Token{Type: token.NOT_EQ, Literal: string(ch) + string(l.ch)}} else {tok = newToken(token.BANG, l.ch)}case '/':tok = newToken(token.SLASH, l.ch)case '*':tok = newToken(token.ASTERISK, l.ch)case '<':tok = newToken(token.LT, l.ch)case '>':tok = newToken(token.GT, l.ch)case ';':tok = newToken(token.SEMICOLON, l.ch)case '(':tok = newToken(token.LPAREN, l.ch)case ')':tok = newToken(token.RPAREN, l.ch)case ',':tok = newToken(token.COMMA, l.ch)case '{':tok = newToken(token.LBRACE, l.ch)case '}':tok = newToken(token.RBRACE, l.ch)case '[':tok = newToken(token.LBRAKET, l.ch)case ']':tok = newToken(token.RBRAKET, l.ch)case ':':tok = newToken(token.COLON, l.ch)case '"':tok.Type = token.STRINGtok.Literal = l.readString()case 0:tok.Literal = ""tok.Type = token.EOFdefault:if isLetter(l.ch) {tok.Literal = l.readIdentifier()tok.Type = token.LookupIdent(tok.Literal)return tok} else if isDigit(l.ch) {tok.Type = token.INTtok.Literal = l.readNumber()return tok} else {tok = newToken(token.ILLEGAL, l.ch)}}l.readChar()return tok
}
正则表达式
Flex

语法分析器(parser)

语法分析器接受输入数据(通常为文本)然后构建数据结构,一般是一棵解析树或者抽象语法树,构建过程中也会检查其中的语法错误。解析器的先前步骤通常是词法分析器,词法分析器的输出是字符串构成的一系列 token。

语法分析的过程就是不断的将语法规则应用于源程序,将源程序解析成一棵抽象语法树。
语法分析
语法分析可以说是编译器中最基础的一步,它将人可以理解的语法规则转换成计算机可以 “理解” 的树形结构,之后的语义分析、代码生成甚至代码优化都是基于对这个抽象树进行遍历、检查和修改优化的操作上进行的。

自顶向下分析

LL分析法

自底向上分析

LR分析法

Bison

http://www.ngui.cc/el/5239390.html

相关文章

信息论(信息熵、KL散度、交叉熵以及互信息)

信息论是一门用数理统计方法来研究信息的度量、传递和变换规律的科学。 它主要是研究通讯和控制系统中普遍存在着信息传递的共同规律以及研究最佳解决信息的获限、度量、变换、储存和传递等问题的基础理论。 这似乎与概率论和机器学习的关注点相去甚远&#xff0c;但实际上两者…

[蓝桥杯2019初赛]后缀表达式 题解

题目描述 给定N 个加号、M 个减号以及N M 1 个整数A1,A2,…,ANM1 小明想知道在所有由这N 个加号、M 个减号以及N M 1 个整数凑出的合法的后缀表达式中&#xff0c;结果最大的是哪一个&#xff1f; 请你输出这个最大的结果。 例如使用1 2 3 -&#xff0c;则“2 3 1 -” 这…

The Blocks Problem 题解

The Blocks Problem 题目传送门 UVA - 101 刷刘大爷紫书的第二天 大致思路 这道题的大致思路应该比较明显&#xff0c;对每根柱子上的木块进行归位和转移两种操作 我的想法是用map存每个木块的在哪跟柱子上&#xff0c;再进行查找&#xff0c;归位和移动的操作 不过要主题…

多重背包的拆分问题

多重背包应该算是背包问题里面比较麻烦的一种了&#xff0c;基本思路就是拆分转化为01背包&#xff0c;进而套01背包的模版 今天在洛谷刷题的时候遇到一道题,是一个多重背包和完全背包的组合型问题 题目描述 爱与愁大神后院里种了n棵樱花树&#xff0c;每棵都有美学值Ci。爱…

D. a-Good String

传送门 题意 一个字符串如果长度为1 并且为’a’ 那么就是 a -good 字符串&#xff0c; 当长度大于1时&#xff0c; 需要满足 &#xff1a; 将总区间划分成一半&#xff0c; 其中一半全是a&#xff0c;另一半必须为b-good 字符串 以此类推 分析 这道题的做法比较直观&#…

大师 洛谷P4933

大师 题目链接 大师 题目描述 建筑大师最近在跟着数学大师ljt12138学数学&#xff0c;今天他学了等差数列&#xff0c;ljt12138决定给他留一道练习题。 ljt12138首先建了n个特斯拉电磁塔&#xff0c;这些电塔排成一排&#xff0c;从左到右依次标号为1到n&#xff0c;第i个…

C. Good String

传送门 分析 给你一串字符串&#xff0c;你可以擦去一部分字符&#xff0c;剩下一个字符串t,要求最后剩下的字符串t满足这样的性质&#xff1a;字符串&#x1d461;2&#x1d461;3…&#x1d461;&#x1d45b;−1&#x1d461;&#x1d45b;&#x1d461;1和字符串 &#x…

Travel 最短路

链接&#xff1a;https://ac.nowcoder.com/acm/problem/14292 来源&#xff1a;牛客网 题目描述 精灵王国有N座美丽的城市&#xff0c;它们以一个环形排列在Bzeroth的大陆上。其中第i座城市到第i1座城市花费的时间为d[i]。特别地&#xff0c;第N座城市到第1座城市花费的时间为…

飞行路线 |分层图初步学习

链接&#xff1a;https://ac.nowcoder.com/acm/problem/15073 来源&#xff1a;牛客网 题目描述 Alice和Bob现在要乘飞机旅行&#xff0c;他们选择了一家相对便宜的航空公司。该航空公司一共在n个城市设有业务&#xff0c;设这些城市分别标记为0到n-1&#xff0c;一共有m种航…

设计密码 —— 状态机

来源&#xff1a;acwing 题目描述 你现在需要设计一个密码 S&#xff0c;S 需要满足&#xff1a; S 的长度是 N&#xff1b; S 只包含小写英文字母&#xff1b; S 不包含子串 T&#xff1b; 例如&#xff1a;abc 和 abcde 是 abcde 的子串&#xff0c;abd 不是 abcde 的子串…
最新文章