好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

四用语法分析器生成工具实现语法分析器.doc

11页
  • 卖家[上传人]:des****85
  • 文档编号:281471434
  • 上传时间:2022-04-24
  • 文档格式:DOC
  • 文档大小:187KB
  • / 11 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 精选优质文档-----倾情为你奉上魏陈强 168实验4 用语法分析器生成工具实现语法分析器一、实验目的掌握移进-归约技术语法分析技术,利用语法分析器生成工具Yacc/Bison实现语法分析器的构造二、实验内容利用语法分析器生成工具Yacc/Bison编写一个语法分析程序,与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子源语言的文法定义见教材附录 A.1,p394,要求实现完整的语言三、实验要求1.个人完成,提交实验报告2.实验报告中给出采用测试源代码片断,及其对应的最右推导过程(形式可以自行考虑)例如,程序片断四、实验思路本实验在linux环境下编写首先使用lex工具,编写词法分析器,对于识别出的token,比如id类的,则return(ID);单个字符的,比如‘>’,则return(‘>’),其他类似然后生成lex.yy.c文件接着使用yacc工具,编写语法分析器,在*.y文件中调用#include”lex.yy.c”,main(int argc,char **argv)函数中调用yyparse(),并给出yyerror()的处理方式这样,就能将lex和yacc结合起来。

      生成y.tab.c文件后,gcc编译,生成a.out可执行文件执行./a.out < 1.txt,即可对1.txt文档中的程序进行语法分析五、详细代码1) lex.l%option noyywrap%{#include#include#include#include%}delim [ \t\n]ws {delim}+letter [A-Za-z]digit [0-9]%%{ws} { }"if" {printf("IF ");return(IF);}"else" {printf("ELSE ");return(ELSE);}"int" {printf("INT "); return(BASIC);}"float" {printf("FLOAT "); return(BASIC);}"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 "); return(BASIC);}"char" {printf("CHAR "); return(BASIC);}"real" {printf("real");return(REAL);}"false" {printf("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");return(NUM);}"<" {printf("LT ");return('<');}"<=" {printf("LE ");return(LE);}"=" {printf("= ");return('=');}"==" {printf("EQ ");return(EQ);}"!=" {printf("NE ");return(NE);}">" {printf("GT ");return('>');}">=" {printf("GE ");return(GE);}"+" {printf("+ ");return('+');}"-" {printf("- ");return('-');}"[" {printf("[ ");return('[');}"]" {printf("] ");return(']');}"{" {printf("{");return('{');} "}" {printf("}");return('}');}"(" {printf("(");return('(');}")" {printf(")");return(')');}";" {printf(";");return(';');}"," {printf(",");return(',');}"&&" {printf("&&");return(AND);}"||" {printf("||");return(OR);}%%2) yacc.y%{#include#include%}%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-->block\n"); } ;block : '{' decls stmts '}' { printf("block-->{decls stmts}\n"); } ;decls : | decls decl { printf("decls-->decls decl\n"); } ;decl : type ID ';' { printf("decl-->type id;\n"); } ;type : type '[' NUM ']' { printf("type-->type[num]\n"); } | BASIC { printf("type-->basic\n"); } ;stmts : | stmts stmt { printf("stmts-->stmts stmt\n"); } ;stmt : matched_stmt { printf("stmt-->matched_stmt\n");} | open_stmt { printf("stmt-->open_stmt\n");} ;open_stmt: IF '(' booL ')' stmt { printf("open_stmt-->if(bool)stmt\n");} | IF '(' booL ')' matched_stmt ELSE open_stmt { printf("open_stmt-->if(bool) matched_stmt else open_stmt\n");} ;matched_stmt: IF '(' booL ')' matched_stmt ELSE matched_stmt { printf("matched_stmt-->if(bool) matched_stmt else matched_stmt\n");} | other { printf("matched_stmt-->other\n");} ;other: loc '=' booL ';' { printf("stmt-->loc=bool;\n"); } | WHILE '(' booL ')' stmt { printf("stmt-->while(bool)stmt\n"); } | DO stmt WHILE '(' booL ')' ';' { printf("stmt-->do stmt while(bool);\n"); } | BREAK ';' { printf("stmt-->break;\n"); } | block { printf("stmt-->block\n"); } ;loc : loc '[' booL ']' { printf("loc-->loc[bool]\n"); } | ID { printf("loc-->id\n"); } ;booL : booL OR join { printf("bool-->bool||join\n"); } | join { printf("bool-->join\n"); } ;join : join AND equality { printf("join-->join&&equality\n"); } | equality { printf("join-->equality\n"); } ;equality : equality EQ rel { printf("equality-->equality==rel\n"); } | equality NE rel { printf("equality-->equality!=rel\n"); } | rel { printf("equality-->rel\n"); } ;rel : expr '<' expr { printf("rel-->exprexpr<=expr\n"); } | expr GE expr { printf("rel-->expr>=expr\n"); } | expr '>' expr { printf("rel-->expr>expr\n"); } | expr { printf("rel-->expr\n"); } ;expr : expr '+' term { printf("expr-->expr+term\n"); } | expr '-' term { printf("expr-->expr-term\n"); } | term { printf("expr-->term\n"); } ;term : term '*' unary { printf("term-->term*unary\n"); } | term '/' unary { printf("term-->term/unary\n"); } | unary { printf("term-->unary\n"); } ;unary : '!' unary { printf("unary-->!unary\n"); } | '-' unary { printf("unary-->-unary\n"); } | factor { printf(。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.