1、int printf(INT);return(BASIC);float printf(FLOAT);break printf(BREAK);return(BREAK);do printf(DO);return(DO);while printf(WHILE);return(WHILE);true printf(TRUE);return(TRUE);index printf(INDEX);return(INDEX);bool printf(BOOL);char printf(CHAR);real printf(real);return(REAL);false printf(FLASE);retur
2、n(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(|);ret
3、urn(OR);%Myyacc.y%#include#include extern int yylex();extern int yyerror();%token NUM%token ID%token IF WHILE DO BREAK REAL TRUE FALSE BASIC ELSE INDEX GE LE NE EQ AND OR%program:block printf(program-blockn);block:decls stmts printf(block-decls stmtsn);decls:|decls decl printf(decls-decls decln);dec
4、l:type ID;printf(decl-type id;n);type:type NUM printf(type-typenumn);|BASIC printf(type-basicn);stmts:|stmts stmt printf(stmts-stmts stmtn);stmt:matched_stmt printf(stmt-matched_stmtn);|open_stmt printf(stmt-open_stmtn);open_stmt:IF(booL)stmt printf(open_stmt-if(bool)stmtn);|IF(booL)matched_stmt ELS
5、E open_stmt printf(open_stmt-if(bool)matched_stmt else open_stmtn);matched_stmt:IF(booL)matched_stmt ELSE matched_stmt printf(matched_stmt-if(bool)matched_stmt else matched_stmtn);|other printf(matched_stmt-othern);other:loc=booL;printf(stmt-loc=bool;|WHILE(booL)stmt printf(stmt-while(bool)stmtn);|D
6、O stmt WHILE(booL);printf(stmt-do stmt while(bool);|BREAK;printf(stmt-break;|block printf(stmt-blockn);loc:loc booL printf(loc-locbooln);|ID printf(loc-idn);booL:booL OR join printf(bool-bool|joinn);|join printf(bool-joinn);join:join AND equality printf(join-join&equalityn);|equality printf(join-equ
7、alityn);equality:equality EQ rel printf(equality-equality=reln);|equality NE rel printf(equality-equality!=reln);|rel printf(equality-reln);rel:expr exprexprexpr=exprn);|expr expr printf(rel-exprexprn);|expr printf(rel-exprn);expr:expr+term printf(expr-expr+termn);|expr-term printf(expr-expr-termn);
8、|term printf(expr-termn);term:term*unary printf(term-term*unaryn);|term/unary printf(term-term/unaryn);|unary printf(term-unaryn);unary:!unary printf(unary-!unaryn);|-unary printf(unary-unaryn);|factor printf(unary-factorn);factor:(booL)printf(factor-(bool)n);|loc printf(factor-locn);|NUM printf(fac
9、tor-numn);|REAL printf(factor-realn);|TRUE printf(factor-truen);|FALSE printf(factor-falsen);%int yyerror(s)char*s;fprintf(stderr,syntactic error:%sn,s);return 0;6、实验结果 7、实验总结 实验中的注意事项:(1)一个由 Yacc 生成的解析器调用 yylex()函数来获得标记。对于由 Lex 生成的 lexer 来说,要和 Yacc 结合使用,每当 Lex 中匹配一个模式时都必须返回一个标记。因此 Lex 中匹配模式时的动作一般格式
10、为:pattern /*do smthg*/return TOKEN_NAME;于是 Yacc 就会获得返回的标记。当 Yacc 编译一个带有 _d 标记的 myyacc.y文件时,会生成一个头文件 myyacc.tab.h,它对每个标记都有#define 的定义。如果 Lex 和 Yacc 一起使用的话,头文件必须在相应的 Lex 文件 mylex.l 中的 C 声明段中包括。(2)在 myyacc.y中要加入对函数 int yylex()和函数 int yyerror()的外部声明。(3)对文件放置的位置也要很小心,不然很容易就造成错误(4)这次的实验使我对语法分析的过程更加了解,更多的掌握了移进规约技术语法分析,对理论知识起到了巩固的作用,加强了编译整个理论体系的认识,也对flex&bison 的操作有了更深一步的了解。Welcome To Download!欢迎您的下载,资料仅供参考!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1