编译器基本流程
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。