[educoder] 用YACC(BISON)生成语法分析和翻译器

第一关

 /* 逆波兰符号计算器 *//* 功能:能够计算出合法的后缀表达式的值,包括加法、减法、乘法、除法、乘方、取反等运算 *//* 说明:在下面的begin和end之间添加代码,加油吧! *//* 提示: */%{#include <ctype.h>#include <stdio.h>#include <math.h>int yylex (void);void yyerror (char const *);
%}%define api.value.type {double}
%token NUM%% /* Grammar rules and actions follow.  */input:%empty
| input line
;line:'\n'
| exp '\n'      { printf ("%.10g\n", $1); }
;exp:NUM           { $$ = $1; }/* begin: add your code */| exp exp '+'   {$$ = $1 + $2;}| exp exp '-'   {$$ = $1 - $2;}| exp exp '*'   {$$ = $1 * $2;}| exp exp '/'   {$$ = $1 / $2;}| exp exp '^'   {$$ = pow($1, $2);}| exp 'n'   {$$ = -$1;}/* end: add your code */
;%%/* The lexical analyzer returns a double floating pointnumber on the stack and the token NUM, or the numeric codeof the character read if not a number.  It skips all blanksand tabs, and returns 0 for end-of-input.  */int yylex (void)
{int c;/* Skip white space.  */while ((c = getchar ()) == ' ' || c == '\t')continue;/* Process numbers.  */if (c == '.' || isdigit (c)){ungetc (c, stdin);scanf ("%lf", &yylval);return NUM;}/* Return end-of-input.  */if (c == EOF)return 0;if (c == '!')return 0;/* Return a single char.  */return c;
}int main (int argc, char** argv)
{return yyparse();
}/* Called by yyparse on error.  */
void yyerror (char const *s)
{fprintf (stderr, "%s\n", s);
};

第二关

/* 后缀转中缀 */
/* 功能:后缀表达式转换成中缀表达式,包括加法、减法、乘法、除法等运算 */
/* 说明:在下面的begin和end之间添加代码,加油吧! */%{#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#ifndef YYSTYPE
#define YYSTYPE char*
#endif
char idStr[50];
char numStr[50];
int yylex() ;
extern int yyparse() ;
FILE* yyin;
void yyerror(const char* s);
%}%token ADD
%token MUL
%token SUB
%token DIV
%token LB
%token RB
%token NUMBER
%token ID
%left ADD MUS
%left MUL DIV
%right UMINUS
%%lines : lines expr {printf("%s\n",$2);}| lines|;/* begin: add your code*/
expr  : expr expr ADD { $$ = (char *)malloc(200*sizeof(char)); strcpy($$,"("); strcat($$,$1); strcat($$,"+"); strcat($$,$2);  strcat($$,")"); }| expr expr SUB { $$ = (char *)malloc(200*sizeof(char)); strcpy($$,"("); strcat($$,$1); strcat($$,"-"); strcat($$,$2); strcat($$,")"); }| expr expr MUL { $$ = (char *)malloc(200*sizeof(char)); strcpy($$,"("); strcat($$,$1); strcat($$,"*"); strcat($$,$2); strcat($$,")"); }| expr expr DIV { $$ = (char *)malloc(200*sizeof(char)); strcpy($$,"("); strcat($$,$1); strcat($$,"/"); strcat($$,$2); strcat($$,")"); }| SUB expr %prec UMINUS { strcpy($$,"-"); strcat($$,$2); }| NUMBER        { $$ = (char *)malloc(200*sizeof(char)); strcpy($$,$1); }| ID            { $$ = (char *)malloc(200*sizeof(char)); strcpy($$,$1); };/* end: add your code */
;%%// programs section
int yylex()
{char t;while(1){t = getchar();if(t==' ' || t =='\t'|| t == '\n'){}else if(t == '+'){return ADD;}else if(t == '*'){return MUL;}else if(t == '-'){return SUB;}else if(t == '/'){return DIV;}else if(t>='0'&&t<='9'){int ti = 0;  while (t>='0'&&t<='9'){numStr[ti]=t;t = getchar();ti++;}numStr[ti] = '\0';yylval = numStr;ungetc(t,stdin);return NUMBER;}else if(('a'<=t&&t<='z')||('A'<=t&&'Z'>=t)||(t=='_')){int ti=0;while(('a'<=t&&t<='z')||('A'<=t&&'Z'>=t)||(t=='_')||(t>='0'&&t<='9')){idStr[ti] = t;ti++;t=getchar(); }idStr[ti] = '\0';yylval = idStr;ungetc(t,stdin);return ID;   }else{return t;}}
}
int main(void)
{yyin = stdin;do {yyparse () ;} while (!feof(yyin)) ;return 0;}
void yyerror(const char* s) {fprintf(stderr,"Parse error : %s\n",s) ;exit(1);
}

[educoder] 用YACC(BISON)生成语法分析和翻译器相关推荐

  1. 编译原理:利用yacc/bison进行语法分析

    YACC(Yet Another Compiler-Compiler)是一个LALR(1)分析器自动生成器,是贝尔实验室在UNIX上首次实现,与LEX有直接的接口.此外GNU(GNU is not U ...

  2. Bison^Flex=语法分析生成中

    上古时代的时候(前一段时间参加了些些小竞赛,状态有点迷糊,五一又浪里个浪,所以-虽迟但到!),我们有讲解过借助Flex实现SysY词法分析.词法分析是编译的第一阶段,仅仅只是将代码进行切块归类,得到的 ...

  3. bison生成c语言文件指令,第13章 用 bison 做语法分析

    13.2 bison 示例 1¶ 上面这段话可能不太容易理解,还是来看一个简单的例子吧.首先安装 bison ,在终端输入: sudo apt-get install bison 安装完成后,新建一个 ...

  4. lex(flex)yacc(bison)

    初始配置 文法分析用Flex(Lex):将数据分隔成一个个的标记token (标示符identifiers,关键字keywords,数字numbers, 中括号brackets, 大括号braces, ...

  5. Windows下安装lex(flex)与yacc(bison)

    上完第一节编译原理,Mr李要求这周自己探索一下lex和yacc这两个工具. 查了一下lex与yacc是两个在Unix下的分别作词法分析和语法分析的工具,都说很强大.而他俩在linux下又有对应的东西叫 ...

  6. 3.02 使用bison在语法分析中构建抽象语法树AST

    如果你已经储备bison的相关基础知识,阅读理解下面的代码会轻松得多.没有bison基础的同学请点击查看bison基本的语法规则及相关介绍. 在文章1.06 使用Flex和Bison手写词法分析器和语 ...

  7. Android系统启动流程4---init进程的工作流程

    概况: 启动init进程 运行init.rc 启动zygote服务 Zygote fork的第一个进程--SystemServer SystemServer启动系统服务 1. linux启动第一个应用 ...

  8. 【Bison学习笔记】1:生成简易的语法分析程序,使Bsion和Flex协同工作

    简述 Bison是在Yacc上改写并添加了大量特性后诞生的语法分析生成器,在编译前端(词法分析->语法分析->语义分析)中处在中间的位置,它可以用来生成特定的语法分析程序. 安装Bison ...

  9. 手把手教程-lex与yacc/flex与bison入门(一)(使用windows环境)

    前言 1.文章诞生的契机 在计算机学习中,我们有时可能会想到自制一门属于自己的编程语言,此时选择lex与yacc来生成词法分析器与语法分析器是非常不错的选择.然而,这两个工具虽然用起来简单,但对于新手 ...

最新文章

  1. 0UL能做C语言常量吗,c语言中的0UL或1UL是什么意思
  2. Oracle技术之实例恢复的顺序
  3. Kubernetes日志分析利器:Elassandra部署使用指南
  4. mysql int(3)与int(11)的区别详解
  5. 加密算法—MD5、RSA、DES
  6. pytorch —— transforms图像增强(一)
  7. Java 多态的实现机制
  8. SQLi LABS Less 10 时间盲注
  9. NB-IOT技术以及物联网安全问题简述
  10. 解决Spring MVC整合Shiro出现无法访问静态资源文件的问题
  11. 职场风云 | 导师的光亮
  12. 软件开发系统分析规格说明
  13. postgresql 客户端启动配置
  14. 文件服务器杀毒软件推荐,服务器上装什么杀毒软件好?
  15. 常见的内存错误java_Java虚拟机常见内存溢出错误汇总,Java中常见的坑看了可以少走点弯路...
  16. java jframe 切换_java – 在JFrame中切换面板
  17. 重要性采样和多重重要性采样在路径追踪中的应用
  18. 要想成为黑客,离不开这十大基础知识
  19. 富士康的二手iPhone生意再度遭遇危机
  20. 计蒜之道2019 复赛 D-星云系统(单调栈)

热门文章

  1. 8、Opencv实现文档扫描
  2. wps开发笔记:wps端开发运行官方提供demo提示“请允许浏览器打开WPS Office”
  3. Android---陀螺仪传感器
  4. [解决问题]ImportError while loading conftest
  5. 苹果呼叫转移设置不了_车学堂登录不了?堂堂教您设置一下——苹果版本
  6. 【IC凉菜01】ASIC概念及与FPGA的区别
  7. Android 穿山甲广告接入教程
  8. hamachi联机_hamachi(蛤蟆吃)怎么联机 蛤蟆吃联机图文教程
  9. 游戏开发心得——书籍篇——《游戏引擎框架》-专业工具
  10. 我写给自己的你们不要看