語法分析是編譯的第二個階段,語法分析的基本任務就是根據指定的文法識別輸入的句子當中的各類短語並構造它的分析樹,其實也就是識別由詞法分析給出的單詞符號串是否是給定文法的正確句子(程式)語法分析器根據語言的語法規則來解析**,解析階段決定了輸入的**是否能夠根據既定的語法組成token流
語法分析器則會定義一些函式來把**組織成一種被稱為ast的資料結構。解析器可以採用遞迴下降的解析技術自頂向下解析,並且相互遞迴的函式構建ast
為了方便,我們去定義乙個靜態的全域性變數current_token表示當前token的靜態全域性變數
static
int current_token;
然後我們再去定義從詞法分析器的輸入流獲得下乙個token
//從詞法分析器的輸入流獲得下乙個token
static
int next_token()
接下來我們去定義乙個函式,會根據詞法分析器確定的token型別呼叫特定的解析函式,然後去構造乙個乙個的ast物件,函式定義如下所示
static baseast * base_parser()
}
輸入流被詞法分析器構建成token流並且傳遞給語法分析器,current_token持有當前處理的token,在這一階段token型別是已知的,並且根據其型別來呼叫相應的解析函式來初始化ast接下來我們看下計算表示式的解析函式
//解析表示式的函式
static baseast * expression_parser()
下面就是關於數值表示式,就是去傳入數值然後去讀取下乙個字元,返回ast類物件
//解析表示式的函式
static baseast * expression_parser()
然後下面就是定義函式來解析解析識別符號表示式,識別符號可以是變數引用或者是函式呼叫,它們之間會由括號這乙個特徵來進行區分
//定義函式來解析函式的宣告
static functiondeclast *func_decl_parser()
if(current_token==',')
else
function_argument_names.push_back(identifier_string);
next_token();
} }
//讀到函式宣告末尾如果不是)那麼就返回
if(current_token != ')')
return
0; next_token();
return
new functiondeclast(fnname, function_argument_names);
}
下面我們再去定**析函式定義的函式
static functiondefnast *func_defn_parser()
關於括號的解析函式
static baseast* paran_parser()
對於二元表示式的運算的話,我們需要去定義運算子的優先順序和初始化優先順序的函式方便我們使用,然後再去定義乙個函式去返回已定義的二元運算子的優先順序
//優先順序的map陣列
static
std::map
operator_precedence;
//初始化運算子優先順序
static
void init_precedence()
static baseast* binary_op_parser(int old_prec, baseast *lhs)
lhs = new binaryast(std::to_string(binop), lhs, rhs);
}}
上面做的其實就是如果遇到乙個數值token,那麼呼叫數值表示式的建構函式並由解析器返回數值的ast物件,用數值資料去填充數值ast識別符號也是類似的,就是解析的資料可以是變數或者函式呼叫,對於函式宣告和定義來說,函式名和函式引數都會被解析,接著呼叫相應的ast類的建構函式
LR 語法分析器
lr語法分析器算是基本完成了,只需要乙個文法定義檔案 syntax 就可以進行對應語言的語法分析,最後形成語法樹。詞法分析是固定的,採用c 的詞法定義。以後將加入動態的詞法分析。壓縮包中檔案的描述 lrtable.exe 是用文法定義檔案 syntax檔案 生成lr動作表檔案 action檔案 使用...
LALR語法分析器
lalr分析器 是一種規範lr分析方法的簡化形式。它可以對上下無關文法進行語法分析。lalr即 l ook ahead lr 其中,look ahead為 向前看 l代表對輸入進行從左到右的檢查,r代表反向構造出最右推導序列。lalr分析器 可以根據一種程式語言的正式語法的 產生式而對一段文字程式輸...
LR語法分析器程式設計
include include include include struct code val const char p const char tnt i etf lr分析表列的字元 const int m 9 0表示出錯,s4用4表示。acc用99表示 r2用 2表示 int col char 列...