前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用 lex + yacc 生成多种运算中缀表达式对应的计算器(代码实现)

使用 lex + yacc 生成多种运算中缀表达式对应的计算器(代码实现)

作者头像
云微
发布2023-02-11 10:09:56
5010
发布2023-02-11 10:09:56
举报

我的GIS/CS学习笔记:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes <一个浙江大学本科生的计算机、地理信息科学知识库 >


要求

生成如下文法表示的表达式对应的计算器

代码语言:javascript
复制
         exp->exp + exp | exp – exp
        | exp * exp |exp / exp
        |exp ^ exp | - exp
        |(exp) |NUM

对于输入的中缀表达式,要给出结果。如 3 +(4 * 5)结果应为 23。要求能连续处理若干个数学表达式,直到输入结束或文件结束。

lex

代码语言:javascript
复制
%{
#include <stdio.h>
#include "y.tab.h"
%}

%option noyywrap

%%

[0-9]+ {
    yylval = atoi(yytext);
    return NUMBER;
}

[^ \t\n] {
    return yytext[0];
}

\n {
    return yytext[0];
}

. {}

%%

yacc

代码语言:javascript
复制
%{
#include <stdio.h>
#include <ctype.h>
#include <math.h>

%}

%code requires {

#define YYLTYPE int
#define YYSTYPE int
}

%token NUMBER

%%

command : exp1 {

}
; 
exp1: exp1 '\n' exp {
    printf("%d\n", $3);
}
| exp { 
        printf("%d\n", $1);
};

exp : exp '+' term {
    $$ = $1 + $3;
}
    | exp '-' term {
        $$ = $1 - $3;
}
    | term { $$ = $1; }
    ;

term : term '*' factor {
    $$ = $1 * $3;
}
     | term '/' factor {
    $$ = $1 / $3;
}
     | factor { $$ = $1; }
;

factor : '-' numfactor {
    $$ = - $2;
} 
| numfactor '^' numfactor {
    $$ = pow($1 , $3);
}
    | numfactor { $$ = $1; }
;

numfactor : NUMBER { $$ = $1; }
       | '(' exp ')' { $$ = $2; }
       ;

%%

int main() {
    yyparse();
}


int yyerror(char *s) {
    fprintf(stderr, "%s\n", s);
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 要求
  • lex
  • yacc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档