使用Flex&Bison创建新的编程语言

编译器基本流程

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

Flex&Bison简介

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

词法分析器(lexer)

词法分析也称为分词 ,此阶段编译器从左向右扫描源文件,将其字符流分割成一个个的词(token),是源文件中不可再进一步分割的一串字符,类似于英语中单词,或汉语中的词。
使用Flex&Bison创建新的编程语言_第2张图片

直接扫描法

func (l *Lexer) NextToken() token.Token {
	var tok token.Token

	l.skipWhitespace()

	switch l.ch {
	case '=':
		if l.peekChar() == '=' {
			ch := l.ch
			l.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.ch
			l.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.STRING
		tok.Literal = l.readString()
	case 0:
		tok.Literal = ""
		tok.Type = token.EOF
	default:
		if isLetter(l.ch) {
			tok.Literal = l.readIdentifier()
			tok.Type = token.LookupIdent(tok.Literal)
			return tok
		} else if isDigit(l.ch) {
			tok.Type = token.INT
			tok.Literal = l.readNumber()
			return tok
		} else {
			tok = newToken(token.ILLEGAL, l.ch)
		}
	}

	l.readChar()
	return tok
}

正则表达式

Flex

语法分析器(parser)

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

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

自顶向下分析

LL分析法

自底向上分析

LR分析法

Bison

你可能感兴趣的:(Operating,System)