編譯原理實驗(繪圖語言解釋器)講義_第1頁
編譯原理實驗(繪圖語言解釋器)講義_第2頁
編譯原理實驗(繪圖語言解釋器)講義_第3頁
編譯原理實驗(繪圖語言解釋器)講義_第4頁
編譯原理實驗(繪圖語言解釋器)講義_第5頁
已閱讀5頁,還剩116頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、編譯原理實驗黃誠13550301222449557241內(nèi)容1. 實驗?zāi)康?. 函數(shù)繪圖語言3. 題目與要求4. 參考解決方案:遞歸子程序方法聚詞法分析器來語法分析器親語法制導(dǎo)翻譯5. 改進(jìn)建議1實驗?zāi)康目贤ㄟ^做上機題加深對編譯器構(gòu)造原理和方法的理解,鞏所學(xué)知識1. 會用正規(guī)式和產(chǎn)生式設(shè)計簡單語言的語法2. 會用編寫編譯器或解釋器會寫上機實驗報告52函數(shù)繪圖語言肯函數(shù)繪圖語言簡介1. 函數(shù)繪圖語句循環(huán)繪圖(FORDRAW)、比例設(shè)置(SCALE)、角度旋轉(zhuǎn)(ROT)、 坐標(biāo)平移(ORIGIN)注釋(或/)2. 屏幕(窗口)的坐標(biāo)系左上角為原點,x方向從左向右增長,y方向從上到下增長(與一 般的

2、坐標(biāo)系方向相反)3. 源程序示例origin is (100, 300);-設(shè)置原點rot is 0; scale is (1, 1);-設(shè)置旋轉(zhuǎn)角度(不旋轉(zhuǎn))-設(shè)置橫縱坐標(biāo)的比例for T from 0 to 200 step 1 draw (t, 0);畫橫坐標(biāo)for T from 0 to 150 step 1 draw (0, -t);畫縱坐標(biāo)_4for T from 0 to 120 step 1 draw (t, -t);畫函數(shù)f(t)二t2函數(shù)繪圖語言令語法和語義語句滿足下述規(guī)定:1. 各類語句按任意次序書寫,且以分號結(jié)尾,以出現(xiàn)的先 后順序處理;2. ORIGIN、ROT和SC

3、ALE語句只影響其后的繪圖語句,且遵循最后語句有效的原則;3. 無論ORIGIN、ROT和SCALE語句的出現(xiàn)順序如何,圖 形的變換順序總是:比例變換一旋轉(zhuǎn)變換一平移變換;4. 語言對大小寫不敏感,例如for、For、FOR等,均被認(rèn) 為是同一個保留字;5. 表達(dá)式的值均為雙精度類型,旋轉(zhuǎn)角度單位為弧度且為 逆時針旋轉(zhuǎn),平移單位為點。循環(huán)繪圖(FOR-DRAW)語法:FOR T FROM起點TO終點STEP步長DRAW(橫坐標(biāo),縱坐標(biāo));語義:令T從起點到終點每次改變一個步長,繪制點(橫坐標(biāo),縱坐標(biāo));示例:FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (cos(T

4、), sin(T);說明:令T從0到2*PI、步長PI/50,繪制出各個點(cos(T), sin(T),即一個單位圓,實際是左上角的一個點。因為繪圖系統(tǒng)的默認(rèn)值是ORIGIN IS (0,0);ROT IS 0;SCALE IS (1, 1);比例設(shè)置(SCALE)語法:SCALE IS (ffi坐標(biāo)比例因子,縱坐標(biāo)比例因子);語義:設(shè)置橫坐標(biāo)和縱坐標(biāo)的比例,并分別按照比例因子進(jìn)行 縮放;示例:SCALE IS (100, 100);說明:將橫坐標(biāo)和縱坐標(biāo)的比例設(shè)置為1:1,且放大100倍。坐標(biāo)平移(ORIGIN)語法:ORIGIN IS (橫坐標(biāo),縱坐標(biāo));語義:將坐標(biāo)系的原點平移到橫坐標(biāo)

5、和縱坐標(biāo)規(guī)定的點處;示例:ORIGIN IS (360, 240);說明:將原點從(0, 0)平移到(360, 240)處;角度旋轉(zhuǎn)(ROT)語法:ROT IS弧度;語義:逆時針旋轉(zhuǎn)角度所規(guī)定的弧度值。具體計算公式: 旋轉(zhuǎn)后X二旋轉(zhuǎn)前X*COS(角度)+旋轉(zhuǎn)前Y*SIN(角度) 旋轉(zhuǎn)后Y二旋轉(zhuǎn)前Y*COS(角度)-旋轉(zhuǎn)前X*SIN(角度)示例:ROT IS PI/2;說明:逆時針旋轉(zhuǎn)PI/2,即逆時針旋轉(zhuǎn)90度。注釋(“或/) 語法: / This is a comment line-此行是注釋語義:或-之后,直到行尾,均是注釋說明:便于理解,也用于屏蔽暫時不需要的語句。112函數(shù)繪圖語言語句

6、功能的測試ORIGIN IS (360, 240);SCALE IS (100, 100);SCALE IS (100, 100/3);ROT IS PI/2;(1)原點移至(360, 240)圖形放大100/(3)縱坐標(biāo)縮小為三分之一逆時針旋轉(zhuǎn)90度-繪制圓的軌跡FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (cos(T), sin(T);2函數(shù)繪圖語言2函數(shù)繪圖語言加入加入僅和(2)2函數(shù)繪圖語言152函數(shù)繪圖語言其他函數(shù)圖形C.#2函數(shù)繪圖語言穹電號的語法和語義記號種類:常數(shù)、參數(shù)、函數(shù)、保留字、運算符、分隔符1. 常數(shù)常數(shù)字面量和標(biāo)識符形式的常量名均稱為常數(shù)

7、。字面量的 形式為普通的數(shù)值,如果沒有小數(shù),可省略小數(shù)點,如2、2. 、2.0o PI、E也是常數(shù),代表圓周率和自然對數(shù)的底。常數(shù)不能有符號位,如亠+2處理為一元運算的表達(dá)式。2. 參數(shù)唯一的、已經(jīng)被定義好的變量名T。T也是一個表達(dá)式。作 圖語言中無需變量或參數(shù)的聲明和定義語句。3. 函數(shù)當(dāng)前僅支持Sin、Cos、Tan> Sqrt> Exp和Ln。可自行加入 其他函數(shù)。4保留字語句中具有固定含義的標(biāo)識符,包括:ORIGIN, SCALE, ROT, IS, TO, STEP, DRAW, FOR, FROM5運算符PLUS, MINUS, MUL, DIV, POWER即:+*6

8、. 分隔符SEMICO, L_BRACKET, R_BRACKET, COMMA即:;()193題目與要求題目:函數(shù)繪圖語言的解釋器為函數(shù)繪圖語言編寫一個解釋器,解釋器接受用繪圖語言編寫的源程 序,經(jīng)語法和語義分析之后,將源程序所規(guī)定的圖形顯示在顯示屏(或窗口)中目的:通過編寫解釋器,掌握語言翻譯特別是語言識另u的基本方法 令解釋器的實現(xiàn)來 用某種程序設(shè)計語言(如C+、C#、Java等)和遞歸下降子程序方 法編寫完整的解釋器(參考程序統(tǒng)一采用VC+6.0實現(xiàn))#3題目與要求詞法分析器 語法分析器 語義子程序A C/C+編譯器 數(shù)繪圖語言 解釋器實驗任務(wù):手工編寫函數(shù)繪圖語言源程序-函數(shù)繪圖語言

9、解釋器A函數(shù)圖形實驗成果213題目與要求-任務(wù)劃分與上機報告任務(wù)劃分:詞法分析器、語法分析器、語義分析器 要求:驗收經(jīng)過測試的程序,提交上機報告,包括:1任務(wù)與目的2. 軟件設(shè)計 軟件的總體結(jié)構(gòu)與模塊劃分 關(guān)鍵算法與重要數(shù)據(jù)結(jié)構(gòu)3. 測試?yán)淘O(shè)計與測試結(jié)果分析4總結(jié)、體會、改進(jìn)建議等建議:每個階段均進(jìn)行設(shè)計與測試,并且寫出報告;采用增量式設(shè)計;工作全部完成后進(jìn)行總結(jié)234參考解決方案一遞歸子程序方法4.1詞法分析器步驟:正規(guī)式一 NFA 一 DFA 一最小DFA -編寫程序一測試 肯記號的設(shè)計1. 詞法分析器的三個任務(wù):濾掉源程序中的無用成分;輸出 記號供語法分析器使用;識別非法輸入,標(biāo)記為出

10、錯記號2. 記號的組成:記號的類別和屬性。3. 記號的數(shù)據(jù)結(jié)構(gòu):struct Token記號的數(shù)據(jù)結(jié)構(gòu)Token_Type type; 類別char * lexeme;/屬性,原始輸入的字符串double value;屬性,若記號是常數(shù)則是常數(shù)的值double (* FuncPtr)(double);/屬性,若記號是函數(shù)則是函數(shù)指針; 16254.1詞法分析器4. 函數(shù)繪圖語言中記號的分類與表示 enum Token_Type/ 記號的類別 ORIGIN, SCALE, ROT, IS,保留字(一字一碼)TO, STEP, DRAW,FOR, FROM, 保留字 T,/參數(shù)SEMICO, L_

11、BRACKET, R_BRACKET, COMMA,/ 分隔符 PLUS, MINUS, MUL, DIV, POWER, / 運算符 FUNC,函數(shù)CONSTJD,/ 常數(shù)NONTOKEN,空記號(源程序結(jié)束)ERRTOKEN岀錯記號(非法輸入);274.1詞法分析器竊記號的正規(guī)式letter = a|b|.|z|A|B|.|Z digit = 0|1|.|9 digits = digit digit* COMMENT 二 / 丨WHITE_SPACE = (n n I t I n )+SEMICOL_BRACKET(R_BRACKET)COMMAPLUS+MINUSMUL*DIV/POWE

12、R*CONST_IDdigits 1 digits.digitsID二二 letter (letter 1 digit)手工構(gòu)造詞法分析器,正規(guī)式 個數(shù)越少越便于程序編寫, 因而設(shè)計時模式相同的記 號可共用一個正規(guī)式常數(shù)的字面量部分設(shè)計為 CONST.ID,而常量名則合 并到ID中。問題:函數(shù)繪圖語言中的保留 字、常量名、參數(shù)名、以 及函數(shù)名均被描述為ID, 當(dāng)識別為ID后如何區(qū)分?竊區(qū)分記號的符號表static Token TokenTab 二CONST_ID,CONST ID,nEn,XT,F(xiàn)UNC,” SIN”,F(xiàn)UNC,” COS”,F(xiàn)UNC,” TAN”,F(xiàn)UNC,nLN,f,FUN

13、C,nEXPn,FUNC,nSQRTn,ORIGIN,“ORIGIN”,SCALE,” SCALE”,ROT,” ROT”,IS,nISFOR,” FOR”,F(xiàn)ROM,” FROM”,TO,nTOn,STEP,” STEP”,DRAW,” DRAW”,3.1415926,NULL,2.7182 &NULL,0.0,NULL,0.0,sin,0.0,cos,0.0,tan,0.0,log,0.0,exp,0.0,sqit,0.0,NULL,0.0,NULL,0.0,NULL,0.0,NULL,0.0,NULL,0.0,NULL,0.0,NULL,0.0,NULL,0.0,NULL ;19

14、4J詞法分析器例語句ROT IS PI/6的記號流<ROTnROT<ISnISn<CONST_IDnPIn<DIVf!/If<CONST IDn6n0.00.03.1415930.06.0NULL>NULL>NULL>NULL>NULL>#4J詞法分析器SEMICO L.BRACKET R_BRACKET COMMA PLUSMINUSMULDIV POWER CONSTJDID肯正規(guī)式的DFAletter = alb|.|zlAIB|.|Z digit = 0|1|.|9 digits = digit digit*COMMENT =

15、-/WHITE_SPACE 二(t 丨 n )+)9+*/*digits I digits.digits letter (letter I digit)214J詞法分析器肯正規(guī)式的DFACOMMENT 二一丨 /5十勿七-一3注釋1注釋2肯正規(guī)式的DFAWHITESPACE 二(t 丨 n )+234J詞法分析器#4J詞法分析器空白#4J詞法分析器肯正規(guī)式的DFACOMMENT 二一丨 /只:勿七s七s £MINUS如蟲二出PDIV如七血仝2屯254J詞法分析器肯正規(guī)式的DFAPOWER*MUL#4J詞法分析器址舛I T一肯正規(guī)式的DFACOMMA 二,274J詞法分析器#4J詞法分

16、析器SEMICOs十毗亠#4J詞法分析器#4J詞法分析器,十3七R_BRACKET 二)PLUS二 +L_BRACKET 二(#4J詞法分析器294J詞法分析器肯正規(guī)式的DFAletter=alb|.|zlAIB|.|Zdigit=0|1|.|9ID二letter (letter I digit )*#4.1詞法分析器令正規(guī)式的DFAdigit digits= 0|l|.|9=digit digit*CONST_ID = digits I digits.digits284.1詞法分析器測試實例與測試結(jié)果詞法分析器的測試比較簡單,可以分為三個部分:1. 全部合法的輸入2. 各種組合的非法輸入3.

17、 由記號組成的句子如:FOR T FROM 0 TO 2*PI STEP PI/50 DRAW (cos(T),sin(T);4.1詞法分析器詞法分析上機要點肯 分析研究函數(shù)繪圖語言,深刻理解語句的語法和語義;深 刻理解記號的語法和語義;肯 分析上機題目與要求,思考詞法分析器的設(shè)計;肯參考記號設(shè)計與DFA的實現(xiàn)方案,設(shè)計并實現(xiàn)詞法分析器, 并自己設(shè)計測試?yán)?,進(jìn)行詳細(xì)測試;穹 寫出詞法分析器部分的上機報告。3142語法分析器語法分析器的任務(wù):分析語言的結(jié)構(gòu)1. 為句子構(gòu)造語法樹;2. 檢查輸入序列中的錯誤。主要工作1. 設(shè)計函數(shù)繪圖語言的文法,使其適合遞歸下降分析;2. 設(shè)計語法樹的節(jié)點,用于

18、存放表達(dá)式的語法樹;3. 設(shè)計遞歸下降子程序,分析句子并構(gòu)造表達(dá)式的語法樹;4.設(shè)計測試程序和測試用例,檢驗分析器是否正確。3342語法分析器肯函數(shù)繪圖語言的文法i.文法Program > s| Program Statement SEMICOStatement f OriginStatment | ScaleStatmentI RotStatment I ForStatmentOriginStatment ORIGIN ISL_BRACKET Expression COMMA Expression R_BRACKETScaleStatment > SCALE ISL_BRACKE

19、T Expression COMMA Expression R_BRACKETRotStatment > ROT IS Expressionorigin is (200,300); rot is pi/6;scale is (2,1);“設(shè)置原點的偏移量-設(shè)置旋轉(zhuǎn)角度設(shè)置橫. 艸標(biāo)比例42語法分析器for T from 0 to 200 step 1 draw (t, 0);32for T from 0 to 180 step 1 draw (0, t);for T from 0 to 150 step 1 draw (t, t); f(t)=tForStatment > FOR

20、TFROM ExpressionTO ExpressionSTEP ExpressionDRAW L_BRACKET Expression COMMA Expression R_BRACKET Expression f Expression PLUS ExpressionI Expression MINUS ExpressionI Expression MUL ExpressionI Expression DIV ExpressionI PLUS ExpressionI MINUS ExpressionI Expression POWER ExpressionI CONSTJDI TI FUN

21、C L_BRACKET Expression R_BRACKETI L_BRACKET Expression R_BRACKET“332改寫文法為無二義文法表達(dá)式中的運算結(jié)合性非終結(jié)符PLUS、MINUS(二元)左結(jié)合ExpressionMUL、DIV左結(jié)合TermPLUS、MINUS(一元)右結(jié)合FactorPOWER右結(jié)合Component(原子表達(dá)式)無AtomExpression > Expression PLUS ExpressionI Expression MINUS Expression 引入Term提高算符的優(yōu)先級,保留左遞歸使得算符左結(jié)合:Expression f Ex

22、pression PLUS TennI Expression MINUS Term I TermTenn對應(yīng)運算MUL和DIV,于是有:Term > Term MUL Term Tenn DIV Term42語法分析器ExpressionTermFactorComponentAtomPLUS、MINUS MUL、DIVPLUS、MINUS POWER(原子表達(dá)式)無二義的表達(dá)式文法Expression t Expression PLUS TennI Expression MINUS TermI TermTerm > Tenn MUL FactorI Term DIV FactorI

23、 FactorFactor > PLUS Factor | MINUS Factor | Component Component t Atom POWER Component | Atom Atom CONSTIDI TI FUNC L_BRACKET Expression R_BRACKETI L_BRACKET Expression R_BRACKET35虛programH 舟艸罷W®&Program I Program Siaicmenf SEMICO 一 e Program ! e program- program" Siaiemenf SEMICO

24、programmeProgram 1 Siaiemeni SEMICO Program 一 e wExpressionTermsws Expression Term Expression- Expressions PLUS Term Expression- MINUS Term Expression- 一e Term J Factor Term-TernT -> MUL Facior TernT 一 DIV Factor TernT 一 eFacorcomponetMms*ffin>9wiM®42語法分析器4改寫左結(jié)合的產(chǎn)生式為EBNF形式(避免子程序調(diào)用) 遞歸子程序僅

25、要求產(chǎn)生式?jīng)]有左遞歸。Program > Statement SEMICO Program svoid Program() if (token 二二 NONTOKEN) return;Statement(); MathchToken(SEMICO); Program();改寫為EBNF形式,以減少不必要的子程序調(diào)用。Program Statement SEMICO void Program() while (token !二 NONTOKEN) Statement(); MathchToken(SEMICO); 改寫Expression產(chǎn)生式:Expression >Term Ex

26、pression*Expression* > PLUS Term Expression*| MINUS Term Expression1 |sExpression't(PLITS|MINITS)Term Expression11 £Expression1 ->(PLUS|MINUS)Tenn Expression -> Term (PLUS|MINUS)Term Expression的遞歸子程序:void Expression() Term();while (token二二PLUS II token二二MINUS) MathchToken(token); T

27、erm();3942語法分析器最終表達(dá)式的產(chǎn)生式ExpressionTermFactorComponentTerm ( PLUS | MINUS) Term > Factor ( MUL DIV ) Factor > PLUS Factor MINUS Factor ComponentAtom POWER Component AtomAtom f CONSTD | TFUNC L_BRACKET Expression R_BRACKETI L_BRACKET Expression R_BRACKET#42語法分析器-表達(dá)式的語法樹i. 語法樹的節(jié)點表達(dá)式語法樹的節(jié)點可以設(shè)計為以下三

28、類: 葉節(jié)點:常數(shù)、參數(shù)T等。 兩個孩子的內(nèi)部節(jié)點:二元運算如Plus、Mui等。一元加:+5轉(zhuǎn)化為5;一元減:-5轉(zhuǎn)化為0-5。一個孩子的內(nèi)部節(jié)點:函數(shù)調(diào)用,如sin(t)等。4142語法分析器2節(jié)點的數(shù)據(jù)結(jié)構(gòu)typedef double (* FuncPtr)(double); struct ExprNode enum Token_Type OpCode; unionstruct ExprNode *Left,*Right; CaseOperator;struct ExprNode * Child;FuncPtr MathFuncPtr; CaseFunc;double CaseConst

29、;double * CaseParmPtr; Content;;42語法分析器/記號種類/二元運算函數(shù)調(diào)用常數(shù),綁定右值 參數(shù)T,綁定左值4242語法分析器4242語法分析器表達(dá)式-16+5 * *3/cos(T)的語法樹4242語法分析器42語法分析器3建立語法樹的程序框架#include <stdarg.h> double Parameter;參數(shù)struct ExprNode * MakeExprNode(enum Token_Type opcode, .) struct ExprNode ExprPtr 二 new (struct ExprNode);va_list Arg

30、Ptr;ExprPtr->OpCode 二 opcode;va_start(ArgPtr, opcode);switch(opcode) case CONSTJD:/常數(shù)節(jié)點ExprPtr->Content.CaseConst 二(double)va_arg(ArgPtr,double);break;case T:/參數(shù)節(jié)點ExprPtr->Content.CaseParmPtr 二 &Parameter; break;4242語法分析器case FUNC:函數(shù)調(diào)用節(jié)點ExprPtr->Content.CaseFunc.MathFuncPtr二(FuncPtr)

31、va_arg(ArgPtr, FuncPtr);ExprPtr->Content.CaseFunc.Child二(struct ExprNode Jc)va_arg(ArgPtr9struct ExprNode *); break;default: /二元運算節(jié)點ExprPtr->Content.CaseOperator.Left二(struct ExprNode *)va_arg(ArgPtr9struct ExprNode *);ExprPtr->Content.CaseOperator.Right二(struct ExprNode *)va_arg(ArgPtr,str

32、uct ExprNode *); break; / end of switchva_end(ArgPtr);44return ExprPtr汀 / end of MakeExprNode42語法分析器-遞歸下降子程序42語法分析器42語法分析器輔助子程序42語法分析器void FetchToken ();void MatchToken (enum Token_Type AToken); void SyntaxError (int case_of);FetchToken 源程序:static void FetchToken() token 二 GetToken();if (token.type

33、二二 ERRTOKEN) SyntaxError(l);其中token是存放記號的全程量;GetToken()是詞法分析器接口;SyntaxError(case_of)是出錯處理。42語法分析器2主要產(chǎn)生式的遞歸子程序 void Parser(char * SrcFilePtr); void Program();void Statement();void OriginStatement(); void RotStatement();void ScaleStatement(); void ForStatement();struct ExprNode * Expression(); struct

34、ExprNode * Term(); struct ExprNode * Factor();struct ExprNode * Component(); struct ExprNode * Atom();4642語法分析器Parser的遞歸子程序void Parser(char * SrcFilePtr)if(!InitScanner(SrcFilePtr)/ 初始化詞法分析器 printf(nOpen Source File Error ! nn);return;/獲取第一個記號 進(jìn)行遞歸下降分析關(guān)閉詞法分析器FetchToken();Program(); CloseScanner(); /

35、 end of ParserF orS tatement的遞歸子程序ForStatment > FOR T FROM Expression TO Expression STEP Expression DRAW L_BRACKET Expression COMMA Expression R_BRACKET static void ForStatement (void)struct ExprNode :I:start_ptr, :|cend_ptr, :|cstep_ptr, :I:x_ptr, :Jcy_ptr;MatchToken (FOR);MatchToken (FROM);Matc

36、hToken (TO);MatchToken (STEP);MatchToken (DRAW);MatchToken (L_BRACKET);MatchToken (COMMA);MatchToken(T); start_ptr 二 Expression(); end_ptr 二 Expression(); step_ptr 二 Expression();x_ptr 二 Expression(); y_ptr 二 Expression();MatchToken (R_BRACKET);4942語法分析器Expression的遞歸子程序Expression f Term ( PLUS | MIN

37、US) Term static struct ExprNode * Expression() struct ExprNode *right;Token_Type token_tmp;left = Term();while (token.type二二PLUS II token.type二二MINUS)token_tmp 二 token.type;MatchT oken(token_tmp);right 二 Term();left = MakeExprNode(token_tmp, left,right);return left;其他產(chǎn)生式的遞歸子程序采用類似方法得到。14942語法分析器#42語

38、法分析器測試主程序#include <stdio.h> extern void Parser(char * SrcFilePtr);void main(int argc, char *argv) ifargc<2) printf(ccInput Source!nn ); return; Parser(ntest.txtn);2測試輔助子程序void PrintSyntaxTree(struct ExprNode *root, int indent);從wot開始,對語法樹進(jìn)行深度優(yōu)先的先序遍歷,并且根據(jù)縮進(jìn) 值indent將當(dāng)前被遍歷的節(jié)點打印在適當(dāng)?shù)奈恢蒙稀?16+5*3/

39、cos(T)的語法樹:0.00000016.0000005.0000003.000000402da43測試測試語句: 子程序入口與出口加入“enter”和“exit” 終結(jié)符匹配后加入"mathctoken *” 表達(dá)式(Expression)構(gòu)造后,打印語法樹 測試內(nèi)容: 重要語言結(jié)構(gòu):各類語句、各種算術(shù)表達(dá)式典型的語法錯誤:語句錯誤、算術(shù)表達(dá)式錯誤等5143語法制導(dǎo)翻譯43語法制導(dǎo)翻譯-函數(shù)f(t)=t的圖形43語法制導(dǎo)翻譯-設(shè)置橫坐標(biāo)和縱坐標(biāo)的比例origin is (200, 300); rot is pi/6;scale is (2, 1);-設(shè)置原點的偏移量 -設(shè)置旋轉(zhuǎn)角

40、度43語法制導(dǎo)翻譯for T from 0to200step1draw(t, 0);橫坐標(biāo)的軌跡for T from 0to180step1draw(0, -t);-縱坐標(biāo)的軌跡for T from 0to150step1draw(t, -t); f(t)=t的軌跡詞法分析器識別輸入序列,并為語法分析器提供記號。 語法分析器根據(jù)記號流識別句子,并為表達(dá)式構(gòu)造語法樹。 語義分析器根據(jù)語言結(jié)構(gòu),處理函數(shù)繪圖語言程序的語義??侠L圖語言的語義1. 表達(dá)式值的計算:深度優(yōu)先后序遍歷語法樹2. 圖形的繪制:畫出每個坐標(biāo)點繪圖所需的語義處理:1. 從origin> rot和scale中得到坐標(biāo)變換所需

41、的信息;2. fojdraw語句根據(jù)t的每一個值進(jìn)行如下處理:聚計算被繪制點的橫、縱坐標(biāo)值;嶄根據(jù)坐標(biāo)變換信息進(jìn)行坐標(biāo)變換,得到實際坐標(biāo);聚根據(jù)點的實際坐標(biāo)畫出該點。54語法制導(dǎo)翻譯的基本步驟:1. 為文法符號設(shè)計屬性;2. 設(shè)計語義規(guī)則中所需的輔助函數(shù);3. 為產(chǎn)生式設(shè)計語義規(guī)則。比例設(shè)置語句的文法:ScaleStatment SCALE ISL_BRACKET Expression COMMA Expression R_BRACKET 簡寫:SSCALE IS (El,E2)作用是提供橫、縱坐標(biāo)的比例因子,需要:1設(shè)計屬性:x和y,分別保存比例因子;2設(shè)計輔助函數(shù):get_value(np

42、tr),它返回表達(dá)式樹的值;3設(shè)計語義規(guī)則:S.x:=get_value(E 1.nptr);S.y:=get_value(E2. nptr);43語法制導(dǎo)翻譯肯函數(shù)的設(shè)計1. 全程變量(類似于設(shè)計屬性)double Parameter=O;/為參數(shù)T分配的變量double Origin_x=0.0, Origin_y=0.0;/ 用于記錄平移距離 double Rot_ang=0.0;/用于記錄旋轉(zhuǎn)角度double Scale_x二 1, Scale_y=l;/ 用于記錄比例因子例:以點(350, 220)為圓心繪制兩個同心園origin is (350, 220);/ Origin_x=3

43、50, Origin_y=220scale is (50, 50);/ Scale_x=50, Scale_y二50for t from 0 to 2*pi step pi/100 draw(cos(t), sin(t);scale is (100, 100);/ Scale_x=100, Scale_y=100for t from 0 to 2*pi step pi/200 draw(cos(t), sin(t);5743語法制導(dǎo)翻譯2. 輔助語義函數(shù)a) 計算表達(dá)式的值:深度優(yōu)先后序遍歷語法樹double GetExprValue(struct ExprNode * root);b) 計算

44、點的坐標(biāo)值:首先獲取坐標(biāo)值,然后進(jìn)行坐標(biāo)變換static void CalcCoord( struct ExprNode * Hor_Exp, struct ExprNode * Ver_Exp, double &Hor_x, double &Ver_y);C)繪制一個點(與環(huán)境有關(guān)):void DrawPixel(unsigned long x, unsigned long y);d)循環(huán)繪制所有的點:void DrawLoop( double Start, double End, double Step, struct ExprNode * HorPtr, struct E

45、xprNode * VeriPtT);#3. 輔助語義函數(shù)設(shè)計舉例a)表達(dá)式值的計算:double GetExprValue(struct ExprNode * root) if (root = NULL) return 0.0;switch (root -> OpCode) case PLUS : return GetExprValue(root->Content.CaseOperator.Left) +GetExprValue(root->Content.CaseOperator.Right);case MINUS : . /其它二元運算類似處理case POWER :r

46、eturn pow( GetExprValue(root->Content.CaseOperator.Left),GetExprValue(root->Content.CaseOperator.Right);case FUNC : return (* root->Content.CaseFunc.MathFuncPtr)(GetExprValue(root->Content.CaseFunc.Child);case CONST_ID : return root->Content.CaseConst;case T :return (root->Conten匸C

47、aseParmPtr);default:return 0.0 ;5943語法制導(dǎo)翻譯b)計算點的坐標(biāo)值:static void CalcCoord (struct ExprNode * Hor_Exp, struct ExprNode * Ver_Exp, double &Hor_x, double &Ver_y ) double HorCord, VerCord, Hortmp;HorCord=GetExprV alue(Hor_Exp);原始坐標(biāo)V erCord=GetExprV alue(V er_Exp);HorCord *二 Scale_x; VerCord *二 S

48、cale_y; / 比例變換 Hor_tmp=HorCord *cos(Rot_angle)+VerCord *sin(Rot_angle); VerCord=VerCord *cos(Rot_angle)-HorCord *sin(Rot_angle); HorCord = Hor_tmp;/ 旋轉(zhuǎn)變換HorCord + 二 Origin_x; VerCord + 二 Origin_y;/ 平移變換Hor_x 二 HorCord; Ver_y 二 VerCord;返 回坐標(biāo)43語法制導(dǎo)翻譯C)點軌跡的循環(huán)繪制:void DrawLoop( double Start,double End,do

49、uble Step, struct ExprNode * HorPtr, struct ExprNode * VerPtr) extern double Parameter;/ 參數(shù)T 的存儲空間double x, y;for(Parameter=Start; Parameter<=End; Parameter+=Step) CalcCoord(HorPtr, VerPtr, x, y); / 計算實際坐標(biāo) DrawPixel(unsigned long)x, (unsigned long)y); / 繪制點肯遞歸子程序中語義規(guī)則的嵌入語義規(guī)則可以嵌入在遞歸子程序的任何位置。根據(jù)語法制導(dǎo)

50、 翻譯的基本思想,如果希望從某部分語言結(jié)構(gòu)中獲取語義, 則相應(yīng)的語義規(guī)則可以緊跟在該結(jié)構(gòu)的語法分析之后。a) OriginStatementb) ForStatementa) OriginStatementstatic void OriginStatement (void) double x, y;struct ExprNode *tmp;MatchToken(ORIGIN);MatchToken(IS);MatchToken(L_BRACKET);tmp 二 Expression();X二GetExprValue(tmp); /獲取橫坐標(biāo)的平移值MatchToken(COMMA);tmp 二

51、 Expression();y二GetExprValue(tmp); /獲取縱坐標(biāo)的平移值 MatchToken(R_BRACKET);SetOrigin(x, y);/置坐標(biāo)平移全程量61b) ForStatementstatic void ForStatement (void) double Start, End, Step;struct ExprNode *start_ptr, *end_ptr, *step_ptr, *x_pt*y_ptT; MatchToken (FOR); MatchToken(T); MatchToken (FROM); start_ptr=Expression(); Start 二 GetExprValue(st

溫馨提示

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

評論

0/150

提交評論