目的:熟練掌握自上而下的語法分析方法,並能用程式實現。
要求:
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,...