計算機語言需要設計語言的文法並設計語法分析程式(為編譯程式的一部分)來分析程式設計師所寫的程式碼是否符合該語言的文法。
假設某種程式語言文法共有三條,描述如下:
文法(I) <A> → X | (<B>)
文法(II) <B> → <A><C>
文法(III) <C>→ {+<A>}
其中 <A>、<B>、<C>分別代表一個項目(或是代碼token),符合此程式語言文法的程式必須從項目<A>開始衍生。
其中,單向箭頭(→)符號代表左邊的項目可以衍生成右邊的項目、項目與字元或項目與項目的組合。
例如文法(II) <B>→ <A><C> 代表左邊的項目<B>可以衍生成兩個項目的組合,項目<A>在前而項目<C>在後。
垂直符號(|) 代表或(OR)的意思,例如於文法(I)中 <A> → X | (<B>),左邊的項目<A>可以衍生成合法的字元”X” 或是以左括號字元 ”(“ 與右括號字元 ”)” 包圍的一個項目<B>。
文法(III) <C> →{+<A>}代表項目<C>衍成出由大括號所包圍的內容零個(不產生)或多個組合(一個或一個以上)項目組合。
此文法中,組合項目為加號 ”+”字元再緊接著一個項目<A>。
符號{<A>}代表左右兩個大括號內所包含的項目<A>可以出現零次或多次。
假設本程式語言中合法的字元僅有大寫英文字元”X”、加號”+”、左括號”(“與右括號”)”四種字元,其餘均視為不合文法之字元。
對於輸入的程式(簡單的以一列中的文字的字串表示),當檢測其是否符合程式語言的文法時,從起始項目<A>開始,套用文法規則、不斷衍生,直到消除所有項目符號並可以形成一個與輸入字串相同的字串。
在衍生的過程中,要試著套用各種可能的文法衍生規則。
若套用所有文法規則後仍無法產生該程式,則為不符合文法規則的程式。
考慮以下範例,對於字串(X)),套用所有可能的文法產生機制均無法產生(X)) (因為左括號與右括號於套用文法(I)時會同時產生),故該字串不符合文法,則輸出FALSE。
對於字串((((X))))
<A> → (<B>) 套用文法(I)右邊
→ (<A><C>) 套用文法(II)
→ (<A>) 套用文法(III) 將<C>產生零次+<A>
→ ((<B>)) 套用文法(I)右邊
→ ((<A><C>)) 套用文法(II)
→ ((<A>)) 套用文法(III) 將<C>產生零次+<A>
→ (((<B>))) 套用文法(I) 右邊
→ (((<A><C>))) 套用文法(II)
→ (((<A>))) 套用文法(III) 將<C>產生零次+<A>
→ ((((<B>)))) 套用文法(I) 右邊
→ ((((<A><C>)))) 套用文法(II) 將<C>產生零次+<A>
→ ((((<A>)))) 套用文法(III)
→ ((((X)))) 套用文法(I) 左邊
可以衍生輸入字串 ((((X)))) 故該字串符合文法輸出TRUE
設計一個文法分析程式,從讀入檔案,每一列的文數字代表一個程式,檢查該程式是否符合以上的文法,若是則輸出 TRUE 若否則輸出FALSE。
第一個整數字代表需要分析的程式數,其後每一列為代表程式的文數字。
輸出字串是否符合以上的文法,若是輸出TRUE,若否則輸出FALSE,不同字串之檢測結果依序以不同列輸出。
3 (X)) (X1+X) (((X)
FALSE FALSE FALSE
編號 | 身分 | 題目 | 主題 | 人氣 | 發表日期 |
沒有發現任何「解題報告」 |