大連理工大學編譯原理第4次上機 語法分析2

2021-09-29 23:56:41 字數 1349 閱讀 4271

目的:熟練掌握自上而下的語法分析方法,並能用程式實現。

要求

1. 使用的文法如下:

e->te'

e' -> _te'|#

t->ft'

t'->*ft'|#

f-> (e)|id

2. 對於任意給定的輸入串(詞法記號流)進行語法分析,非遞迴**分析方法可以任選其一來實現。

3. 要有一定的錯誤處理功能。即對錯誤能提示,並且能在一定程度上忽略盡量少的記號來進行接下來的分析。可以參考書上介紹的同步記號集合來處理。

可能的出錯情況:idid*id,  id**id,  (id+id, +id*+id ……

4. 輸入串以#結尾,輸出推導過程中使用到的產生式。例如:

輸入:id+id*id#

輸出:e -> te'

t -> ft'

f -> id

e' -> +te'

t -> ft'

……如果輸入串有錯誤,則在輸出中要體現是跳過輸入串的某些記號了,還是彈棧,彈出某個非終結符或者是終結符了,同時給出相應的出錯提示資訊。比如:

idid*id對應的出錯資訊是:「輸入串跳過記號id,使用者多輸入了乙個id」;

id**id對應的出錯資訊是:「彈棧,彈出非終結符f,使用者少輸入了乙個id」

(id+id對應的出錯資訊是:「彈棧,彈出終結符 ) ,使用者少輸入了乙個右括號(或者說,括號不匹配)」

cpp實現如下:

#include#include#includeusing namespace std;

static string input;

static string ahead;

void e();

void ee();

void t();

void te();

void f();

bool whether_in(string target,vectorv)

else if(whether_in(ahead,synch))

else if(ahead=="$"||ahead==")")

else }

void t()

else if(whether_in(ahead,synch))

else if(ahead=="$"||ahead=="+"||ahead==")")

else

}void f()

else if(ahead=="(")

else if(whether_in(ahead,synch))

else }

int main()

大連理工大學資料結構上機 最小堆

include include using namespace std templateclass minheap void disp void buildheap 建立最小堆 bool isleaf int pos const 判斷是否為葉子 int leftchild int pos const...

大連理工大學CSDN俱樂部新學期招新工作圓滿完成

大連理工大學csdn俱樂部成立於2011年3月,俱樂部以提高會員計算機水平,激發創造思維,鍛鍊會員能力為目的,從成立到發展壯大一直受到學部的關懷,辦講座 做培訓也受到學校同學的廣泛關注。目前俱樂部已經走進第三屆,以技術引領發展的口號卻沒有改變,如今,社團急需新鮮血液補充進來,於是我們開始了新一學年的...

2016大連理工大學計算機考研經驗

時間飛快的流逝,唯獨現在,我有一種想對愛因斯坦發牢騷的心情,岡部,時間根據每個人的主觀感受,既會變長,也會變短,相對論真是既浪漫又傷感的東西呢。牧瀨紅莉棲 命運石之門 2016考研成績已出,本人報考大連理工大學電腦科學與技術 本科也在大連理工 初試總分387排名第一,政治64,數學114,英語78,...