2011-01-13 86 views
4

我想在C語言中構建一個編譯器。我現在寫了一個詞法分析器,它可以讀取輸入文件並輸出一個令牌流。 現在,我理解語法背後的理論,並且我知道如何爲不同的表達式手工編寫解析樹。 但我有點失落,將其與實際的代碼相關聯! 我得到令牌後應該如何開始解析過程? 首先,我的解析器程序在接收到第一個標記時應該做些什麼?我知道它必須以樹的形式排列。但我該如何開始? 任何幫助都會很棒,我只是一個初學者。一旦詞法分析器返回一個標記,如何開始分析? (建立一個編譯器)

非常感謝!


它處理當前令牌後的下一個令牌。現在,我打算假設我的語言完全由賦值語句組成。
所以,BNF形式是一樣的東西:

<assignment_statement> ::= <destination> := <factor> 
<destination> ::= <identifier> 
<identifier> ::= [a-zA-Z][a-zA-Z0-9]* 
<factor > ::= <name>|<number>|<string> 
<name> ::= <identifier> 
<number> ::= [0-9]+ 
<string> ::="[a-zA-Z0-9]*" 

現在,當我看到這樣的聲明:var := 9,詞法分析器將返回的第一個標記爲「無功」,會出現什麼父規則是和子規則是? 另外,我該如何去構建這個語句的解析樹?

非常感謝!

回答

4

一種常見模式是讓解析器請求令牌。解析器循環的形式通常是「讀取下一個標記,確定如何處理它,更新部分解析的樹,重複」,如果解析器本身調用詞法分析器(而不是從第三個代碼讀取詞法分析器並將令牌提供給解析器)。

當然,解析器的核心依賴於你正在使用的算法(遞歸下降,LR ...),但它通常包括確定新的標記是否符合你當前解析的規則(如查找一個-當閱讀EXPR = '-' EXPR | ...),符合一個子規則(如找到class,當讀DEF = CLASS | ...,如CLASS = 'class' ...)或根本不適合(在這一點上,你應該終止當前的規則,構建相應的AST節點,並重復父規則上的過程)。

遞歸下降解析器做到這一點與子調用(分則)和返回值(可以追溯到父規則),而RL解析器往往會壓縮一些規則和分則成一個,要麼轉變留在當前的一組規則或減少終止規則並建立一個或多個AST節點。

+3

或者您可能想要使用YACC,或者更確切地說,它的盛大的孩子Bison。 – 2011-01-13 14:18:02

相關問題