使用Flex Bison建立新的程式語言

2021-09-27 01:16:49 字數 2769 閱讀 5397

對原始檔進行掃瞄,將原始檔的字元流拆分分乙個個的詞(記號),此為詞法分析;

根據語法規則將這些記號構造出語法樹,此為語法分析;

對語法樹的各個節點之間的關係進行檢查,檢查語義規則是否被違背,同時對語法樹進行必要的優化,此為語義分析;

遍歷語法樹的節點,將各節點轉化為中間**,並按特定的順序拼裝起來,此為中間**生成;

對中間**進行優化;

將中間**轉化為目標**;

對目標**進行優化,生成最終的目標程式。

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為模板,拷貝生成乙個新...