算符優(yōu)先語法分析設計原理與實現(xiàn)技術-實驗報告-及源代碼-北京交通大學_第1頁
算符優(yōu)先語法分析設計原理與實現(xiàn)技術-實驗報告-及源代碼-北京交通大學_第2頁
算符優(yōu)先語法分析設計原理與實現(xiàn)技術-實驗報告-及源代碼-北京交通大學_第3頁
算符優(yōu)先語法分析設計原理與實現(xiàn)技術-實驗報告-及源代碼-北京交通大學_第4頁
算符優(yōu)先語法分析設計原理與實現(xiàn)技術-實驗報告-及源代碼-北京交通大學_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、算符優(yōu)先語法分析設計原理與實現(xiàn)技術XXX 1028XXX 計科1XXX班功能描述能夠有效識別以下算符優(yōu)先文法E E+T | E-TT T*F | T/F | FF (E) | i所描述算術表達式主要數(shù)據(jù)結構描述數(shù)據(jù)結構功能描述string 存儲該算符優(yōu)先文法,對棧頂元素進行規(guī)約時要用到map符號表中的元素映射成整數(shù)map將用整數(shù)表示的符號映射到響應的行或列map將整數(shù)映射成相應的字母表中的符號int 分析棧程序結構描述n 設計方法1. 由文法構造算符優(yōu)先矩陣+-*/()i#+-*/(=i#) 再找最左素短語的頭部()以分析表達式i+i*i為例,詳細過程如下:n 函數(shù)定義函數(shù)原型功能描述void

2、 init()各種初始化操作,主要是建立符號與整數(shù)、整數(shù)與行列號、整數(shù)與符號之間的映射,也包括各全局變量的初始化void isVt(int )判斷某整數(shù)所代表的符號是否是終結符號或#void comp(int a, int b)比較兩整數(shù)所代表的字符的優(yōu)先關系void advance()從輸入文件中讀入一個詞bool parser()算符優(yōu)先分析函數(shù),根據(jù)算符優(yōu)先矩陣進行語法分析int main(int argc, char *argv)主函數(shù),參數(shù)argv1代表輸入文件n 函數(shù)調(diào)用關系maininitisVtadvanceparsercompn 程序執(zhí)行圖程序測試測試用例一:(a+b*c)+

3、d+e+a*c/b首先調(diào)用實驗一的詞法分析程序,得到如下分析結果:(19, ()(12, a)(14, +)(12, b)(16, *)(12, c)(20, )(14, +)(12, d)(14, +)(12, e)(14, +)(12, a)(16, *)(12, c)(17, /)(12, b)在以此分析結果作為本程序?qū)嶒灲Y果的輸入,得到如下分析結果:該結果顯示了詳細的分析過程,且表明該表達式是一個符合該文法的表達式測試用例二:(a+b*c)+d*-a*c+(a+b同樣調(diào)用實驗一的詞法分析程序,得到如下結果:(19, ()(12, a)(14, +)(12, b)(16, *)(12,

4、c)(20, )(14, +)(12, d)(16, *)(15, -)(12, a)(16, *)(12, c)(14, +)(19, ()(12, a)(14, +)(12, b)以此分析結果作為本實驗程序的輸入,得到如下語法分析結果:實驗結果表明,在分析過程中出現(xiàn)了錯誤,分析過程未完成,該樣例是一個非法的表達式學習總結 按算符優(yōu)先關系所確定的應被規(guī)約的子串恰好是當前舉行的最左素短語 盡管算符優(yōu)先分析也屬于自底向上語法分析的范疇,但卻不是嚴格的從左至右的規(guī)范分析,每步所得的句型自然也不是一個規(guī)范句型 采用上述策略進行算符優(yōu)先分析時,盡管我們也指出了每一最左素短語應規(guī)約到的非終結符號,然而每

5、次在查找最左素短語時,起主導作用的是終結符號間的優(yōu)先關系,兩終結符號之間究竟是哪個非終結符號無關宏旨/ operator_prior.cpp : Defines the entry point for the console application./#include stdafx.h#include #include #include #include #include #define ID 12#define ADD 14#define SUB 15#define MUL 16#define DIV 17#define LP 19#define RP 20#define EOI 31#de

6、fine SHARP 32#define EQ 0#define BT 1#define LT 2#define UD 3#define N_Base 1000using namespace std;FILE *fp;int lookahead, yylineno;bool success;map intToint;map charToint;map intTochar;string grammer8 = E+T, E-T, T, T*F, T/F, F, (E), i;int prior_matrix99 = BT, BT, LT, LT, LT, BT, LT, BT, BT, BT, L

7、T, LT, LT, BT, LT, BT, BT, BT, BT, BT, LT, BT, LT, BT, BT, BT, BT, BT, LT, BT, LT, BT, LT, LT, LT, LT, LT, EQ, LT, UD, BT, BT, BT, BT, UD, BT, UD, BT, BT, BT, BT, BT, UD, BT, UD, BT, LT, LT, LT, LT, LT, UD, LT, EQ;void init() success = true; yylineno = 0; intTointADD = 0; intTointSUB = 1; intTointMU

8、L = 2; intTointDIV = 3; intTointLP = 4; intTointRP = 5; intTointID = 6; intTointSHARP = 7; charToint+ = ADD; charToint- = SUB; charToint* = MUL; charToint/ = DIV; charToint( = LP; charToint) = RP; charTointi = ID; intTocharADD = +; intTocharSUB = -; intTocharMUL = *; intTocharDIV = /; intTocharLP =

9、(; intTocharRP = ); intTocharID = i; intTocharSHARP = #; intTocharN_Base = N;bool isVt(int a) if (a = N_Base) return false; else return true;int comp(int a, int b) int x = intTointa; int y = intTointb; return prior_matrixxy;void advance() if (fscanf(fp, (%d, &lookahead) = EOF) lookahead = SHARP; els

10、e char ch; do ch = fgetc(fp); if (ch = n | ch = EOF) break; while (true); yylineno+;void parser() int stack100, top = 0; int i, j, k, ii, jj; stacktop+ = SHARP; advance(); do for (i = 0; i = 0; i-) if (isVt(stacki) break; int res = comp(stacki, lookahead); if (res = LT | res = EQ) stacktop+ = lookah

11、ead; advance(); else if (res = BT) int temp = stacki; for (j = i - 1; j = 0; j-) if (isVt(stackj) if (comp(stackj, temp) = LT) break; else temp = stackj; for (k = 0; k = A & grammerk.at(jj) = Z) if (isVt(stackii) break; else if (charTointgrammerk.at(jj) != stackii) break; ii+; jj+; while (ii top & jj = top) break; if (k = 8) success = false; return ; top = j + 1; stacktop+ = N_Base; else success = false; return ; if (stack0 = SHARP & stack1 = N_Base & stack2 = SHARP) printf(#N#n); break; while (true); success = true;int main(int argc, char

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論