a068: 語法分析程式設計
標籤 :
通過比率 : 0人/0人 (0%) [非即時]
評分方式:
Tolerant

最近更新 : 2021-10-26 16:30

內容

計算機語言需要設計語言的文法並設計語法分析程式(為編譯程式的一部分)來分析程式設計師所寫的程式碼是否符合該語言的文法。

假設某種程式語言文法共有三條,描述如下:

文法(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,不同字串之檢測結果依序以不同列輸出。

範例輸入 #1
3
(X))
(X1+X)
(((X)
範例輸出 #1
FALSE
FALSE
FALSE
測資資訊:
記憶體限制: 64 MB
公開 測資點#0 (50%): 1.0s , <1K
公開 測資點#1 (50%): 1.0s , <1K
提示 :
標籤:
出處:
107資訊學科能力台中區 [管理者: ]


編號 身分 題目 主題 人氣 發表日期
沒有發現任何「解題報告」