對原始檔進行掃瞄,將原始檔的字元流拆分分乙個個的詞(記號),此為詞法分析;
根據語法規則將這些記號構造出語法樹,此為語法分析;
對語法樹的各個節點之間的關係進行檢查,檢查語義規則是否被違背,同時對語法樹進行必要的優化,此為語義分析;
遍歷語法樹的節點,將各節點轉化為中間**,並按特定的順序拼裝起來,此為中間**生成;
對中間**進行優化;
將中間**轉化為目標**;
對目標**進行優化,生成最終的目標程式。
flex是乙個詞法分析器(lexer),是unix lex的gnu轉殖,作用是把"詞"抽象成符號(token),供程式識別。
bison則是乙個語法解析器(parser),也是unix yacc的gnu轉殖,語法就是在這裡定義,是語言設計的核心。
如果你需要分析或處理linux或unix中的文字資料,可以使用flex和bison迅速解決問題。不但可以應付複雜的語法處理,也可以拿來製作簡單的分析器,如配置檔案等。
詞法分析也稱為分詞 ,此階段編譯器從左向右掃瞄原始檔,將其字元流分割成乙個個的詞(token),是原始檔中不可再進一步分割的一串字元,類似於英語中單詞,或漢語中的詞。
直接掃瞄法
func
(l *lexer)
nexttoken
() token.token
}else
case
'+':
tok =
newtoken
(token.plus, l.ch)
case
'-':
tok =
newtoken
(token.minus, l.ch)
case
'!':
if l.
peekchar()
=='='
}else
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.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()
case0:
tok.literal =
"" tok.type = token.eof
default:if
isletter
(l.ch)
else
ifisdigit
(l.ch)
else
} l.
readchar()
return tok
}
正規表示式
flex語法分析器接受輸入資料(通常為文字)然後構建資料結構,一般是一棵解析樹或者抽象語法樹,構建過程中也會檢查其中的語法錯誤。解析器的先前步驟通常是詞法分析器,詞法分析器的輸出是字串構成的一系列 token。
語法分析的過程就是不斷的將語法規則應用於源程式,將源程式解析成一棵抽象語法樹。
語法分析可以說是編譯器中最基礎的一步,它將人可以理解的語法規則轉換成計算機可以 「理解」 的樹形結構,之後的語義分析、**生成甚至**優化都是基於對這個抽象樹進行遍歷、檢查和修改優化的操作上進行的。
自頂向下分析
ll分析法
自底向上分析
lr分析法
bison
使用新的vs建立物件
在執行任務期間,我看到其他開發人員,他們使用 allargsconstructor access accesslevel.private 建立了乙個類,該類使該類的建構函式私有.然後,他們使用代替建立乙個物件.使用new和of建立之間有什麼區別?a a new a a a a.of allargsc...
python中使用fork建立新的程序
python中如果要建立新程序的話,可以使用os模組中的fork方法。為了了解其中工作原理,筆者結合linux的檢視程序ps命令,對這個方法做了一些測試。python執行時程序 python一開始執行的時候,系統會生成乙個新的程序。先看下面 1 2 3 4 5 6 usr bin env pytho...
建立新的client
在sap 伺服器安裝時,預設設定了三個client,分別是000,001和066。這些client是sap的標準client,它們包含了client的初始資料,一般不要拿來用。如果要開始配置系統,請以client 000為源拷貝乙個新的client。我們以000這個client為模板,拷貝生成乙個新...