使用Flex&Bison創建新的編程語言

編譯器基本流程

編譯器基本流程

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.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
}

語法解析器(parser)

解析器是軟件的組成部分,它接受輸入數據(通常爲文本)然後構建數據結構,一般是一棵解析樹或者抽象語法樹,構建過程中也會檢查其中的語法錯誤。解析器的先前步驟通常是詞法分析器,詞法分析器的輸出是字符串構成的一系列 token。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章