实验四编译用Yacc工具构造语法分析器Word文件下载.docx

上传人:b****6 文档编号:20181744 上传时间:2023-01-17 格式:DOCX 页数:12 大小:335.12KB
下载 相关 举报
实验四编译用Yacc工具构造语法分析器Word文件下载.docx_第1页
第1页 / 共12页
实验四编译用Yacc工具构造语法分析器Word文件下载.docx_第2页
第2页 / 共12页
实验四编译用Yacc工具构造语法分析器Word文件下载.docx_第3页
第3页 / 共12页
实验四编译用Yacc工具构造语法分析器Word文件下载.docx_第4页
第4页 / 共12页
实验四编译用Yacc工具构造语法分析器Word文件下载.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

实验四编译用Yacc工具构造语法分析器Word文件下载.docx

《实验四编译用Yacc工具构造语法分析器Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验四编译用Yacc工具构造语法分析器Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。

实验四编译用Yacc工具构造语法分析器Word文件下载.docx

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!

欢迎您的下载,资料仅供参考!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1