(1)若action[sm , ai] = s則將s移進狀態棧,並把輸入符號加入符號棧,則三元式變成
為:(s0s1…sm s , #x1x2…xm ai , ai+1…an#)
(2) 若action[sm , ai] = rj則將第j個產生式a->β進行歸約。此時三元式變為
(s0s1…sm-r s , #x1x2…xm-ra , aiai+1…an#)
(3) 若action[sm , ai]為「接收」,則三元式不再變化,變化過程終止,宣布分析成功。
(4) 若action[sm , ai]為「報錯」,則三元式的變化過程終止,報告錯誤。
};//定義lr文法的分析表
class lranalysetable;
//定義終結符的個數
int ternum =6;
char nonterminalchar[100]=;
//定義非終結符的個數
int nonternum = 3;
//定義狀態數
int statusnum = 12;
string action[12][6]=,,,,,,
,,,,,};
int goto[12][3] = ,,,,,,,,,,,};
//獲取終結符的索引
int getterminalindex(char var)
//讀取輸入的字串
void readstr()
//把#加入容器
inputstr.push_back('#');
}//對棧容器進行輸出,i=0,返回status中的字串,i=1,返回sign中的字串,i=2返回inputstr中的字串
string vecttrancstr(int i)
return str;
}//輸出符號棧
else if(i == 1)
}//輸出待分析的字串
else
}buf[count] = '\0';
string str(buf);
return str;
}//總控,對輸入的字串進行分析
void lranalyse()
}int r = s;
//修改s
s = analysetable.goto[oldstatus][analysetable.getnonterminalindex(nonterch)];
cout<對於正確的輸入串i+i*i執行結果如下:
對於不正確的輸入串i+i)執行結果如下:
基於C 實現的語法分析之LL 1 分析法實現
一 設計目的 根據某一文法編制除錯ll 1 分析程式,以便對任意輸入的符號串進行分析。本次實驗的目的主要是加深對 分析ll 1 分析法的理解。二 設計要求 程式輸入 輸出示例 對下列文法,用ll 1 分析法對任意輸入的符號串進行分析 原文法e e t e t t t t f t f f f id e...
語法分析 LL(1)分析的python實現
語法分析 將切分的單詞序列組合成各類短語短語,常見的方法 自上而下,自下而上。ll 1 左掃瞄,左推導。大體步驟 1.從檔案或其他方式匯入 儲存文法 實質就是幾行符號流 並把其中的終結字元和非終結字元存在陣列 列表裡 2.把文法每行的 或 切分成兩個即a b c 切分為a b和a c for i i...
二分查詢法的實現(基於C)
在乙個長度為t的順序陣列中,尋找目標為target的值,找到則返回該值在資料中的位置,否則返回 1.二分查詢法通過對陣列的範圍跟蹤來解決問題。開始時,範圍是整個陣列,通過將範圍中間的元素與目標target值比較並丟棄一半範圍,範圍被縮小一半,這個過程將一直持續,直到target值被發現,或那個能夠包...