編譯器基本流程
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。