实验四编译用Yacc工具构造语法分析器Word文件下载.docx
《实验四编译用Yacc工具构造语法分析器Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验四编译用Yacc工具构造语法分析器Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
intprintf(INT);
return(BASIC);
floatprintf(FLOAT);
breakprintf(BREAK);
return(BREAK);
doprintf(DO);
return(DO);
whileprintf(WHILE);
return(WHILE);
trueprintf(TRUE);
return(TRUE);
indexprintf(INDEX);
return(INDEX);
boolprintf(BOOL);
charprintf(CHAR);
realprintf(real);
return(REAL);
falseprintf(FLASE);
return(FALSE);
a-zA-Z_a-zA-Z0-9_*printf(ID);
return(ID);
+-?
0-9+printf(NUM);
return(NUM);
0-9*.0-9+printf(NUM);
printf(LT);
return();
printf(GT);
=printf(GE);
return(GE);
+printf(+);
return(+);
-printf(-);
return(-);
printf();
(printf();
)printf();
printf(;
);
return(;
printf(,);
return(,);
&
printf(&
return(AND);
|printf(|);
return(OR);
%Myyacc.y%#include#includeexternintyylex();
externintyyerror();
%tokenNUM%tokenID%tokenIFWHILEDOBREAKREALTRUEFALSEBASICELSEINDEXGELENEEQANDOR%program:
blockprintf(program-blockn);
block:
declsstmtsprintf(block-declsstmtsn);
decls:
|declsdeclprintf(decls-declsdecln);
decl:
typeID;
printf(decl-typeid;
n);
type:
typeNUMprintf(type-typenumn);
|BASICprintf(type-basicn);
stmts:
|stmtsstmtprintf(stmts-stmtsstmtn);
stmt:
matched_stmtprintf(stmt-matched_stmtn);
|open_stmtprintf(stmt-open_stmtn);
open_stmt:
IF(booL)stmtprintf(open_stmt-if(bool)stmtn);
|IF(booL)matched_stmtELSEopen_stmtprintf(open_stmt-if(bool)matched_stmtelseopen_stmtn);
matched_stmt:
IF(booL)matched_stmtELSEmatched_stmtprintf(matched_stmt-if(bool)matched_stmtelsematched_stmtn);
|otherprintf(matched_stmt-othern);
other:
loc=booL;
printf(stmt-loc=bool;
|WHILE(booL)stmtprintf(stmt-while(bool)stmtn);
|DOstmtWHILE(booL);
printf(stmt-dostmtwhile(bool);
|BREAK;
printf(stmt-break;
|blockprintf(stmt-blockn);
loc:
locbooLprintf(loc-locbooln);
|IDprintf(loc-idn);
booL:
booLORjoinprintf(bool-bool|joinn);
|joinprintf(bool-joinn);
join:
joinANDequalityprintf(join-join&
equalityn);
|equalityprintf(join-equalityn);
equality:
equalityEQrelprintf(equality-equality=reln);
|equalityNErelprintf(equality-equality!
=reln);
|relprintf(equality-reln);
rel:
exprexprexprexpr=exprn);
|exprexprprintf(rel-exprexprn);
|exprprintf(rel-exprn);
expr:
expr+termprintf(expr-expr+termn);
|expr-termprintf(expr-expr-termn);
|termprintf(expr-termn);
term:
term*unaryprintf(term-term*unaryn);
|term/unaryprintf(term-term/unaryn);
|unaryprintf(term-unaryn);
unary:
!
unaryprintf(unary-!
unaryn);
|-unaryprintf(unary-unaryn);
|factorprintf(unary-factorn);
factor:
(booL)printf(factor-(bool)n);
|locprintf(factor-locn);
|NUMprintf(factor-numn);
|REALprintf(factor-realn);
|TRUEprintf(factor-truen);
|FALSEprintf(factor-falsen);
%intyyerror(s)char*s;
fprintf(stderr,syntacticerror:
%sn,s);
return0;
6、实验结果7、实验总结实验中的注意事项:
(1)一个由Yacc生成的解析器调用yylex()函数来获得标记。
对于由Lex生成的lexer来说,要和Yacc结合使用,每当Lex中匹配一个模式时都必须返回一个标记。
因此Lex中匹配模式时的动作一般格式为:
pattern/*dosmthg*/returnTOKEN_NAME;
于是Yacc就会获得返回的标记。
当Yacc编译一个带有_d标记的myyacc.y文件时,会生成一个头文件myyacc.tab.h,它对每个标记都有#define的定义。
如果Lex和Yacc一起使用的话,头文件必须在相应的Lex文件mylex.l中的C声明段中包括。
(2)在myyacc.y中要加入对函数intyylex()和函数intyyerror()的外部声明。
(3)对文件放置的位置也要很小心,不然很容易就造成错误(4)这次的实验使我对语法分析的过程更加了解,更多的掌握了移进规约技术语法分析,对理论知识起到了巩固的作用,加强了编译整个理论体系的认识,也对flex&
bison的操作有了更深一步的了解。
WelcomeToDownload!
欢迎您的下载,资料仅供参考!