編譯原理課程設(shè)計(jì)報(bào)告_第1頁(yè)
編譯原理課程設(shè)計(jì)報(bào)告_第2頁(yè)
編譯原理課程設(shè)計(jì)報(bào)告_第3頁(yè)
編譯原理課程設(shè)計(jì)報(bào)告_第4頁(yè)
編譯原理課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩19頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、編譯原理課程設(shè)計(jì)報(bào)告 實(shí)驗(yàn)1:用Lex設(shè)計(jì)詞法分析器1實(shí)驗(yàn)?zāi)康模簩W(xué)會(huì)用lex設(shè)計(jì)一個(gè)詞法分析器。實(shí)驗(yàn)內(nèi)容:使用lex為下述文法語(yǔ)言寫(xiě)一個(gè)詞法分析器。實(shí)驗(yàn)要求:輸入為用該語(yǔ)言所寫(xiě)的源程序文件;輸出為記號(hào)序列,每個(gè)記號(hào)顯示為二元組(記號(hào)名,記號(hào)屬性值)的形式。輸出可以在屏幕上,也可以輸出到文件中。不要求建立符號(hào)表。在cygwin下用flex和gcc工具將實(shí)驗(yàn)調(diào)試通過(guò),并能通過(guò)例子parser0中testcases目錄下的test1.p測(cè)試?yán)臏y(cè)試。實(shí)驗(yàn)參考:exam1.l和exam2.l。語(yǔ)言文法:<程序>à PROGRAM <標(biāo)識(shí)符> ; <分程序>

2、<分程序>à <變量說(shuō)明> BEGIN <語(yǔ)句表> END.<變量說(shuō)明> à VAR <變量說(shuō)明表><變量說(shuō)明表>à<變量表>: <類型> | <變量表>: <類型> <變量說(shuō)明表><類型>à INTEGER | REAL<變量表>à <變量> | <變量>, <變量表><語(yǔ)句表>à <語(yǔ)句> | <語(yǔ)句> &

3、lt;語(yǔ)句表><語(yǔ)句>à <賦值語(yǔ)句> | <條件語(yǔ)句> | <WHILE語(yǔ)句> | <復(fù)合語(yǔ)句><賦值語(yǔ)句>à<變量> := <算術(shù)表達(dá)式><條件語(yǔ)句>à IF <關(guān)系表達(dá)式> THEN <語(yǔ)句> ELSE <語(yǔ)句><WHILE語(yǔ)句>à WHILE <關(guān)系表達(dá)式> DO <語(yǔ)句><復(fù)合語(yǔ)句> à BEGIN <語(yǔ)句表> END<算

4、術(shù)表達(dá)式> à <項(xiàng)> | <算術(shù)表達(dá)式> + <項(xiàng)> | <算術(shù)表達(dá)式> - <項(xiàng)><項(xiàng)> à <因式> | <項(xiàng)> * <因式> | <項(xiàng)> / <因式><因式>à <變量> | <常數(shù)> | (<算術(shù)表達(dá)式>)<關(guān)系表達(dá)式>à <算術(shù)表達(dá)式> <關(guān)系符> <算術(shù)表達(dá)式><變量>à <標(biāo)識(shí)符&

5、gt;<標(biāo)識(shí)符>à <標(biāo)識(shí)符><字母> | <標(biāo)識(shí)符><數(shù)字> | <字母><常數(shù)>à <整數(shù)> | <浮點(diǎn)數(shù)><整數(shù)>à <數(shù)字> | <數(shù)字> <整數(shù)><浮點(diǎn)數(shù)>à .<整數(shù)> | <整數(shù)>.<整數(shù)><關(guān)系符>à < | <= | = | > | >=| <><字母>à

6、A | B | | X | Y | Z | a | b | | x | y | z<數(shù)字>à0|1|2|9程序代碼:%#include <stdio.h> #define LT1#defineLE2#define GT3#defineGE4#defineEQ5#define NE6#define PROGRAM 7#define END13#define VAR9#define IF10#define THEN 11#define ELSE 12#define WHILE18#defineDO19#define ID 20#define NUMBER 21#d

7、efine RELOP 22#define NEWLINE 23#define ERRORCHAR 24%delim t nwsdelim+letter A-Za-zdigit 0-9id_|letter(letter|digit)*numberdigit+(.digit+)?(E+-?digit+)?int1 digit|digitint1*/%s COMMENT%<INITIAL>"/*"BEGIN COMMENT;ECHO;<COMMENT>"*/"BEGIN INITIAL;ECHO;<COMMENT>.|nE

8、CHO; /* ECHO是一個(gè)宏,相當(dāng)于 fprintf(yyout, "%s", yytext)*/<INITIAL>ws ;<INITIAL>whilereturn (WHILE);<INITIAL>do return (DO);<INITIAL>PROGRAM return (PROGRAM);<INITIAL>end return (END);<INITIAL>VAR return (VAR);<INITIAL>if return (IF);<INITIAL>then r

9、eturn (THEN);<INITIAL>else return (ELSE);<INITIAL>id return (ID);<INITIAL>number return (NUMBER);<INITIAL>"<" return (RELOP);<INITIAL>"<=" return (RELOP);<INITIAL>"=" return (RELOP);<INITIAL>"<>" return (RE

10、LOP);<INITIAL>">" return (RELOP);<INITIAL>">=" return (RELOP);<INITIAL>"+" return (RELOP);<INITIAL>"-" return (RELOP);<INITIAL>"*" return (RELOP);<INITIAL>"/" return (RELOP);<INITIAL>":=&

11、quot; return (RELOP);<INITIAL>"" return (RELOP);<INITIAL>"." return (RELOP);<INITIAL>"," return (RELOP);<INITIAL>.return ERRORCHAR;%int yywrap () return 1;void writeout(int c) switch(c) case ERRORCHAR: fprintf(yyout, "(ERRORCHAR, "%s&qu

12、ot;) ", yytext);break; case RELOP: fprintf(yyout, "(RELOP, "%s") ", yytext);break; case WHILE: fprintf(yyout, "(WHILE, "%s") ", yytext);break; case DO: fprintf(yyout, "(DO, "%s") ", yytext);break; case NUMBER: fprintf(yyout, "(NUM

13、, "%s") ", yytext);break; case ID: fprintf(yyout, "(ID, "%s") ", yytext);break; case NEWLINE: fprintf(yyout, "n");break; case PROGRAM: fprintf(yyout, "(PROGRAM, "%s") ", yytext);break; case END: fprintf(yyout, "(END, "%s"

14、;) ", yytext);break; case VAR: fprintf(yyout, "(VAR, "%s") ", yytext);break; case IF: fprintf(yyout, "(IF, "%s") ", yytext);break; case THEN: fprintf(yyout, "(THEN, "%s") ", yytext);break; case ELSE: fprintf(yyout, "(ELSE, "%

15、s") ", yytext);break; default:break; return;int main (int argc, char * argv)int c,j=0;if (argc>=2) if (yyin = fopen(argv1, "r") = NULL) printf("Can't open file %sn", argv1); return 1; if (argc>=3) yyout=fopen(argv2, "w"); while (c = yylex()writeout(c

16、);j+;if (j%5 = 0) writeout(NEWLINE);if(argc>=2) fclose(yyin); if (argc>=3) fclose(yyout);return 0;測(cè)試文件為T(mén)est1.p:PROGRAM test;VAR i, j, k: INTEGER; f0: REAL;BEGIN i := 1; j := 1; k := 0; f0 := 3.2; WHILE k<=100 DO BEGIN IF j <20 THEN BEGIN j := i; k := k+1; f0 := f0*0.2 END ELSE BEGIN j :=

17、 k; k := k-2; f0 := f0/.2 END ENDEND.運(yùn)行結(jié)果:實(shí)驗(yàn)2:用Lex設(shè)計(jì)詞法分析器2實(shí)驗(yàn)?zāi)康模簩W(xué)會(huì)用lex設(shè)計(jì)一個(gè)詞法分析器,并考慮其與后續(xù)語(yǔ)法分析器的鏈接問(wèn)題。實(shí)驗(yàn)內(nèi)容:修改上次實(shí)驗(yàn)1的詞法分析器,使其滿足下列要求。實(shí)驗(yàn)要求:1. 要求每次調(diào)用詞法分析函數(shù)yylex時(shí),只返回一個(gè)記號(hào)(token);2. 為記號(hào)選擇適當(dāng)?shù)膶傩灾担⑶颐看卧~法分析函數(shù)返回記號(hào)前,都將記號(hào)的屬性值存入全局變量yylval中。(yylval可以自己定義為全局變量);3. 記號(hào)屬性值的選擇:標(biāo)識(shí)符的屬性為標(biāo)識(shí)符的名字字符串(例如,標(biāo)識(shí)符name1的屬性為字符串”name1”),整數(shù)的屬

18、性為整數(shù)值,浮點(diǎn)數(shù)的屬性為浮點(diǎn)數(shù)值。其他記號(hào)屬性值可自己選擇。關(guān)鍵字可以省略屬性。4. 注意:由于屬性值需要存入yylval中,并且記號(hào)屬性值的類型比較多(可能為字符串、整數(shù)、浮點(diǎn)數(shù)等),因此yylval必須能同時(shí)存放各種類型的值(提示:將yylval設(shè)置為union類型)。5. 在cygwin下用flex和gcc工具將實(shí)驗(yàn)調(diào)試通過(guò),并能通過(guò)例子parser0中testcases目錄下的test1.p測(cè)試?yán)臏y(cè)試。實(shí)驗(yàn)3:熟悉Yacc的使用實(shí)驗(yàn)?zāi)康模菏煜ふZ(yǔ)法分析器生成工具Yacc的使用,并學(xué)會(huì)在cygwin下使用bison工具編譯Yacc文法說(shuō)明文件。學(xué)習(xí)如何使用lex和yacc合作進(jìn)行語(yǔ)法分

19、析。實(shí)驗(yàn)內(nèi)容:根據(jù)給出的calculator例子(calculator0,calculator1,calculator2,calculator3)完成下面題目:用lex和yacc寫(xiě)一個(gè)計(jì)算布爾表達(dá)式真值的計(jì)算器。實(shí)驗(yàn)要求:輸入為一個(gè)布爾表達(dá)式,以換行結(jié)束。輸出為這個(gè)布爾表達(dá)式的真值(true或false)。必須用二義文法實(shí)現(xiàn)。布爾表達(dá)式二義文法為:S > S or S | S and S | not S | (S) | true | false,其中優(yōu)先級(jí)or < and < not,or 和 and 左結(jié)合,not 右結(jié)合。用非二義文法實(shí)現(xiàn)作為選作內(nèi)容,非二義文法請(qǐng)參照表達(dá)

20、式非二義文法自己寫(xiě)出來(lái)。在cygwin下用flex,bison和gcc工具將實(shí)驗(yàn)調(diào)試通過(guò),并寫(xiě)出測(cè)試?yán)郎y(cè)試正確性。實(shí)驗(yàn)參考:calculator0-3這四個(gè)例子。程序代碼:Cal.y文件:%int yylex(); #define YYSTYPE double /* 將Yacc棧定義為double類型 printf("nThe value of the expression is %lf.n", $1);*/%token NUM LPAREN RPAREN ENTER %left OR%left AND%right NOT%left PLUS MINUS%left TIME

21、S DIVIDE%right UMINUS% /* 這樣寫(xiě)prog可以讓分析器每次讀入一行進(jìn)行分析,下一行重新分析expr */prog : prog exprp | exprp ;exprp : expr ENTER printf("1 表示 true;0 表示 false %lf.n", $1);shuchu($1); ;expr : expr PLUS expr$ = $1 + $3;| expr MINUS expr $ = $1 - $3;| expr TIMES expr $ = $1 * $3;| expr DIVIDE expr $ = $1 / $3;|

22、LPAREN expr RPAREN $ = $2;| MINUS expr $ = -$2;| NUM $ = $1; | expr OR expr $=panduan($1*$1+$3*$3); | expr AND expr $=panduan($1*$3); | NOT expr $=panduan2($2);%int main()yyparse();return 0;Cal.l文件:%#include "cal.tab.h"#include <stdio.h> int yywrap(void) return 1;#define LT1#defineLE

23、2#define GT3#defineGE4#defineEQ5#define NE6#define PROGRAM7#define END13#define VAR9#define IF10#define THEN 11#define ELSE 12#define WHILE18#defineDO19#define ID 20#define RELOP 22#define NEWLINE 23#define ERRORCHAR 24%ws t+digit 0-9inumdigit+fnum digit*.digit+letterA-Za-zid_|letter(letter|digit)*%

24、inum sscanf(yytext, "%lf", &yylval); return NUM;fnumsscanf(yytext, "%lf", &yylval); return NUM;"+"return PLUS;"*"return TIMES;"-"return MINUS;"/"return DIVIDE;"("return LPAREN;")"return RPAREN;"or" retu

25、rn OR;"and" return AND;"not" return NOT;"<"return LT;"<="return LE;">"return GT;">="return GE;"=" return EQ;"!=" return NQ;":=" return FZ;ws;"n"return ENTER;. printf("nLEX:ERROR! c=%s

26、n", yytext);<INITIAL>"/*"BEGIN COMMENT;ECHO;<COMMENT>"*/"BEGIN INITIAL;ECHO;<INITIAL>whilereturn (WHILE);<INITIAL>do return (DO);<INITIAL>PROGRAM return (PROGRAM);<INITIAL>end return (END);<INITIAL>VAR return (VAR);<INITIAL>if

27、return (IF);<INITIAL>then return (THEN);<INITIAL>else return (ELSE);<INITIAL>id return (ID);%int panduan(double a)if(a!=0) a=1;return a;int panduan2(double a)if(a=0) a=1;else if(a!=0) a=0;return a;int shuchu(double a)if(a=0)printf("false");else if (a!=0)printf("true&

28、quot;);return 1;運(yùn)行程序:實(shí)驗(yàn)4:用Yacc設(shè)計(jì)語(yǔ)法分析器1實(shí)驗(yàn)?zāi)康模簩W(xué)習(xí)如何使用Yacc設(shè)計(jì)一個(gè)語(yǔ)法分析器,并與用lex寫(xiě)的詞法分析器鏈接起來(lái)。實(shí)驗(yàn)內(nèi)容:使用yacc為課程設(shè)計(jì)實(shí)驗(yàn)1所給的語(yǔ)言寫(xiě)一個(gè)語(yǔ)法分析器(你可以重新設(shè)計(jì)該語(yǔ)言的文法,但不能改變語(yǔ)言)。其中,詞法分析使用課程設(shè)計(jì)實(shí)驗(yàn)2中已完成的詞法分析器(即,你需要將本實(shí)驗(yàn)的語(yǔ)法分析器和實(shí)驗(yàn)2的詞法分析器鏈接起來(lái))。實(shí)驗(yàn)要求:輸入為實(shí)驗(yàn)1所給語(yǔ)言寫(xiě)的源程序文件;輸出為屏幕顯示語(yǔ)法分析是否成功。在語(yǔ)法分析中不能出現(xiàn)任何的沖突(移進(jìn)-歸約或歸約-歸約沖突),或者雖然有沖突,但是你能夠說(shuō)清楚沖突是如何解決的。在cygwin下用f

29、lex,bison和gcc工具將實(shí)驗(yàn)調(diào)試通過(guò),并且你寫(xiě)的語(yǔ)法分析器至少應(yīng)該能通過(guò)例子parser0中testcases目錄下的test0.p和test1.p兩個(gè)測(cè)試?yán)臏y(cè)試。實(shí)驗(yàn)參考:可以在例子parser0的基礎(chǔ)上進(jìn)行修改;如果你尚不能將實(shí)驗(yàn)2的詞法分析器和本實(shí)驗(yàn)的語(yǔ)法分析器鏈接起來(lái),可以暫時(shí)使用parser0給出的詞法分析器(前提是你的語(yǔ)法分析器中終結(jié)符名的定義與parser0的相同)。程序代碼:Cal.y%int yylex(); #define YYSTYPE double /* 將Yacc棧定義為double類型 printf("nThe value of the expr

30、ession is %lf.n", $1);*/%token NUM LPAREN RPAREN ENTER %left OR%left AND%right NOT%left PLUS MINUS%left TIMES DIVIDE END%right UMINUS BEGIN VAR %nonassoc PROGRAM%union int inum; double fnum; char * id;% /* 這樣寫(xiě)prog可以讓分析器每次讀入一行進(jìn)行分析,下一行重新分析expr prog : prog exprp | exprp ;exprp : expr ENTER printf(

31、"1 表示 true;0 表示 false %lf.n", $1);shuchu($1); ;expr : expr PLUS expr$ = $1 + $3;| expr MINUS expr $ = $1 - $3;| expr TIMES expr $ = $1 * $3;| expr DIVIDE expr $ = $1 / $3;| LPAREN expr RPAREN $ = $2;| MINUS expr $ = -$2;| NUM $ = $1; | expr OR expr $=panduan($1*$1+$3*$3); | expr AND expr $

32、=panduan($1*$3); | NOT expr $=panduan2($2);*/prog : PROGRAM biaoshifu fenpro |fenpro |biaoshifu ;biaoshifu:ID ;fenpro :blsm BEGIN yjb END |blsm printf("BEGIN n "); |yjb printf("END n"); ;blsm: VAR blsmb printf("VAR"); |blsmb ;blsmb:blb MH leixing |blb MH leixing blsmb |

33、blb |leixing ;leixing:INTEGER printf("INTEGER"); |REAL printf("REAL"); ;blb:bl$ = $1; |bl DH blb ;bl:NUM $ = $1; ;yjb:yj |yj yjb ;yj:fzyj |tjyj |whileyj |fhyj ;fzyj:bl FZ bds $ = $3; |bl |bds ;bds:guanxi $ = $1; |suanshu $ = $1; ;tjyj:IF guanxi THEN yj ELSE yj |guanxi |yj ;whiley

34、j:WHILE guanxi DO yj printf("WHILE"); |guanxiprintf("DO"); |yj ;fhyj:BEGIN yjb ENDprintf("BEGIN"); |yjb printf("END"); ;suanshu:xiang |suanshu PLUS suanshu $ = $1 + $3; |suanshu MINUS xiang$ = $1 - $3; ;xiang:yinshi |xiang*yinshi$ = $1 * $3; |xinag/yinshi$ = $

35、1 / $3; ;yinshi:bl$ = $1; |NUM$ = $1; |LPAREN suanshu RPAREN $ = $2; ;guanxi:suanshu LT suanshu $=bijiao1($1,$3); |suanshu GT suanshu $=bijiao2($1,$3); |suanshu LQ suanshu $=bijiao3($1,$3); |suanshu GQ suanshu $=bijiao4($1,$3); |suanshu EQ suanshu $=bijiao5($1,$3); |suanshu NQ suanshu $=bijiao6($1,$

36、3); ;%int main()yyparse();return 0;Cal.l%#include "cal.tab.h"#include <stdio.h> int yywrap(void) return 1;#define LT1#defineLE2#define GT3#defineGE4#defineEQ5#define NE6#define IF10#define THEN 11#define ELSE 12#define WHILE18#defineDO19#define ID 20#define RELOP 22#define NEWLINE 23

37、#define ERRORCHAR 24%ws t+digit 0-9inumdigit+fnum digit*.digit+letterA-Za-zid_|letter(letter|digit)*%s COMMENT%inum sscanf(yytext, "%lf", &yylval); return INUM;fnumsscanf(yytext, "%lf", &yylval); return FNUM;"+"return PLUS;"*"return TIMES;"-"

38、return MINUS;"/"return DIVIDE;"("return LPAREN;")"return RPAREN;"or" return OR;"and" return AND;"not" return NOT;"<"return LT;"<="return LE;">"return GT;">="return GE;"=" return

39、EQ;"!=" return NQ;":=" return FZ;":" return MH;"," return DH;"" teturn FH;ws;"n"return ENTER;. printf("nLEX:ERROR! c=%sn", yytext);<INITIAL>"/*"BEGIN COMMENT;ECHO;<COMMENT>"*/"BEGIN INITIAL;ECHO;<

40、;INITIAL>whilereturn (WHILE);<INITIAL>do return (DO);<INITIAL>PROGRAM return (PROGRAM);<INITIAL>end return (END);<INITIAL>VAR return (VAR);<INITIAL>if return (IF);<INITIAL>then return (THEN);<INITIAL>else return (ELSE);<INITIAL>id return (ID);%int p

41、anduan(double a)if(a!=0) a=1;return a;int panduan2(double a)if(a=0) a=1;else if(a!=0) a=0;return a;int shuchu(double a)if(a=0)printf("false");else if (a!=0)printf("true");return 1;int bijiao1(double a,double b)if(a<b)return 1;else return -1;int bijiao2(double a,double b)if(a&g

42、t;b)return 1;else return -1;int bijiao3(double a,double b)if(a<=b)return 1;else return -1;int bijiao4(double a,double b)if(a>=b)return 1;else return -1;int bijiao5(double a,double b)if(a=b)return 1;else return -1;int bijiao6(double a,double b)if(a!=b)return 1;else return -1;實(shí)驗(yàn)5:用Yacc設(shè)計(jì)語(yǔ)法分析器2實(shí)驗(yàn)

43、目的:學(xué)習(xí)如何使用Lex和Yacc設(shè)計(jì)一個(gè)語(yǔ)法分析器,并學(xué)習(xí)如何在語(yǔ)法分析的同時(shí)生成分析樹(shù)。實(shí)驗(yàn)內(nèi)容:修改實(shí)驗(yàn)4,給產(chǎn)生式加上動(dòng)作,動(dòng)作為生成一棵語(yǔ)法分析樹(shù)。這棵分析樹(shù)的結(jié)構(gòu)可以使用或參照例子parser1中ast.h文件中定義的分析樹(shù)結(jié)構(gòu)。實(shí)驗(yàn)要求:輸入為實(shí)驗(yàn)1所給語(yǔ)言寫(xiě)的源程序文件;輸出為一棵語(yǔ)法分析樹(shù),這棵語(yǔ)法分析樹(shù)的表示方法可以是這樣兩種:1.將分析樹(shù)的數(shù)據(jù)結(jié)構(gòu)打印出來(lái);2.按分析樹(shù)的結(jié)構(gòu)輸出一個(gè)C語(yǔ)言源程序文件(即輸入是所給語(yǔ)言的源程序文件,輸出為語(yǔ)義相同的C語(yǔ)言源程序文件)。在cygwin下用flex,bison和gcc工具將實(shí)驗(yàn)調(diào)試通過(guò),并且你寫(xiě)的語(yǔ)法分析器至少應(yīng)該能通過(guò)例子pa

44、rser1中testcases目錄下的test0.p和test1.p兩個(gè)測(cè)試?yán)?。?shí)驗(yàn)參考:可以參考例子parser1或在它的基礎(chǔ)上進(jìn)行修改;如果你尚不能將實(shí)驗(yàn)2的詞法分析器和本實(shí)驗(yàn)的語(yǔ)法分析器鏈接起來(lái),可以暫時(shí)使用parser1給出的詞法分析器(前提是你的語(yǔ)法分析器中終結(jié)符名的定義與parser1的相同)。你也可以在自己的語(yǔ)法分析器中直接使用parser1已經(jīng)提供的輸出方式(打印分析樹(shù)的數(shù)據(jù)結(jié)構(gòu)),但前提是你必須使用parser1提供的分析樹(shù)結(jié)構(gòu)(ast.h)。程序代碼:%#include <stdio.h>#include "ast.h" /該文件定義了抽象語(yǔ)

45、法樹(shù)(分析樹(shù))的數(shù)據(jù)結(jié)構(gòu)#include "errormsg.h"#define YYDEBUG 1 /* 允許跟蹤錯(cuò)誤,與%debug功能相同 */int yylex(void); /* function prototype */* 該函數(shù)顯示錯(cuò)誤信息s,顯示時(shí)包含了錯(cuò)誤發(fā)生的位置。*/void yyerror(char *s) EM_error(EM_tokPos, "%s", s);/* 存放抽象語(yǔ)法樹(shù)中 "程序" 數(shù)據(jù)結(jié)構(gòu)的變量 */a_prog program = NULL;% /* 定義屬性值棧的類型,實(shí)驗(yàn)8需要修改此處

46、*/%union int ival;double fval;string sval; a_exp exp; a_bexp bexp; a_stm_list stms; a_prog prog; a_dec_list decl; /* 定義各個(gè)終結(jié)符,以及他們的屬性值的類型,實(shí)驗(yàn)8需要修改此處 */%token <sval> ID /* id */%token <ival> INT /*整型數(shù)*/%token <fval> FLOAT /*浮點(diǎn)數(shù)*/%token INTEGER REAL /*兩種類型名:整型、實(shí)型*/%token COMMA COLON SE

47、MICOLON LPAREN RPAREN PERIOD /* 符號(hào) , : ; ( ) . */ PROGRAM BEGINN END VAR IF WHILE DO /* 關(guān)鍵字:PROGRAM BEGIN END VAR IF WHILE Do */ THEN ELSE /* 關(guān)鍵字:THEN ELSE */ ASSIGN EQ NEQ LT LE GT GE /* 符號(hào) := = <> < <= > >= */ PLUS MINUS TIMES DIVIDE /* 符號(hào) + = * / */%start program /* 定義各個(gè)非終結(jié)符的屬性值

48、類型,實(shí)驗(yàn)8需要修改此處 */%type <prog> program%type <decl> bianliangbiao declist vardec%type <stms> fuhe xunhuan tiaojian fuzhi yuju stmts%type <exp> exp yinshi xiang suanshu %type <bexp> guanxi%program:PROGRAM ID SEMICOLON vardec BEGINN stmts END PERIODprogram = A_Prog(EM_tokPos, $2, $4, $6);vardec : VAR declist $ = $2;declist : bianliangbiao COLON INTEGER SEMICOLON $ = A_DecList(A_Var

溫馨提示

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

評(píng)論

0/150

提交評(píng)論