簡單編譯器之語法分析

2022-07-09 06:36:13 字數 2720 閱讀 1484

ok,書接上文,今次這篇部落格是準備說語法分析。

其實詞法分析和語法分析可以說是一體的。詞法分析用於分析輸入的單詞,將其一一分門別類。語法分析分析已經分門別類好的單詞,看其組成的句子是否符合語言的文法。

首先,先確定乙個簡單的文法:

s -> if

( m )

s ->n

m - > p ==p

p -> id |digit

n -> int id ; | int id = num ; |q;

q - > id =e

e - > e + t |t

t - > id | digit| ( e )

if(1 == 1)

就如從正規表示式可以構造出詞法分析器一樣,也存在語法分析器的生成器之類的工具,可以用來構造**分析器。相關的演算法有ll(1)、lr(1)等。本文涉及的文法比較簡單,符合ll(1)文法,不需要用到lr(1)這樣強大而複雜的推理。因而本文準備用遞迴下降演算法來構造**分析器。

記得第一次看ll(1)描述時看的頭暈眼花,雲裡霧裡的。後來自己乾脆動手寫程式時,就突然一下子明白了,為了要有這些步驟,這些步驟到底用來做什麼的?

直接用例子來說明,以s -> if ( m ) 、s -> n 來說,我們要如何寫匹配這段文法的程式了?

1.獲取下乙個字元t;

2.根據t,判斷是走if ( m ) 這條路了,還是走n這條路;

3.如果t == 'if',而n的首字元沒有'if'的情況,那就妥妥的走if ( m ) ,反之也一樣;

4.如果n -> if blabla,那麼我就傻眼了,到底應該怎麼判斷了?

如果真出現4中的情況,那麼這個文法就不是ll(1)文法。因為從左到右只超前讀乙個字元無法推導出乙個唯一的結果。

事實上,無論是消除左遞迴、計算first集合、計算follow集合都是為了確認當前文法在出現分岔路時,每個分支的首個終結字元不相同

s -> if

(m)

s ->n

m -> p ==p

p -> id |digit

n -> n1 n11 |e

n1 -> int

idn11 -> = num | null

e ->te1

e1 -> + t |t

t -> id | digit | (e)

然後直接根據這個就可以得到下面的程式啦:

def

s():

#下乙個字元,用於**

token =seetopretict();

if(token == 'if'

): eat('if

');eat('(

');m();

eat(')

');eat(''

);

pass

elif(token == 'id'

or token == '

digit'):

n();

else

: #報錯

syntaxerror();

print

'complete';

pass

defm():

p();

eat('==

');p();

pass

defp():

#下乙個字元

token =gettoken();

if(token != 'id'

and token != '

digit'):

syntaxerror();

pass

defn():

token =seetopretict();

if(token == '

int'

): n1();

n11();

eat(';

');elif(token == 'id'

or token == '

digit'):

e();

eat(';

');else

: syntaxerror();

pass

defn1():

eat(

'int');

eat('id

');defn11():

token =seetopretict();

if(token == '='

): eat('=

');eat(

'digit');

pass

defe():

t();

e1();

defe1():

token =seetopretict();

if(token == '+'

): eat('+

');t();

elif(token == 'id'

or token == '

digit'):

t();

else

: syntaxerror();

deft():

token =gettoken();

if(token != 'id'

and token != '

digit'):

syntaxerror();

手工打造編譯器之語法分析器1

語法分析 分析程式的短語結構 文法描述一種語言。文法是如下產生式 production 的集合 symbol symbol,symbol 出現在左部的符號是非終結符 nonterminate 出現在右部的排除掉非終結符就是終結符 terminate 計算first,follow,nullable集合...

編譯原理簡單語法分析

一 實驗目的 了解掌握算符優先分析的基本方法 內容 學會科學思考並解決問題,提高程式設計能力。二 實驗內容與要求 用算符優先分析方法設計乙個分析解釋程式,對輸入的賦值語句 輸出語句 清除語句進行詞法分析 語法分析 表示式求值並儲存於指定變數中 若存在錯誤,提示錯誤相關資訊。三 文法表示 s v e ...

構建自己的編譯器(二)語法分析器

用來描述計算機語言語法的符號集。現在,幾乎每一位新程式語言書籍的作者都使用巴科斯正規化來定義程式語言的語法規則。擴充套件巴科斯 瑙爾正規化 ebnf 是表達作為描述計算機程式語言和形式語言的正規方式的上下文無關文法的元語法符號表示法。它是基本巴科斯正規化 bnf 元語法符號表示法的一種擴充套件。如由...