使用 flex & bison 生成科学计算器

scanner.l
%{

#include <stdio.h>
#include <stdlib.h>

#define YYSTYPE double
#include "parser.h"

%}

%option noyywrap

digit [0-9]
space [\t\n ]

number {digit}+(\.{digit}*)?|\.{digit}+
abs (?i:abs)
exp (?i:exp)
log (?i:log)
mod (?i:mod)
pow (?i:pow)

%%

{number} {
	yylval = strtod(yytext, NULL);
	return NUMBER;
}

{abs} {
	return ABS;
}

{exp} {
	return EXP;
}

{log} {
	return LOG;
}

{mod} {
	return MOD;
}

{pow} {
	return POW;
}

{space}+

= {
	return 0;
}

. {
	return *yytext;
}

%%

parser.y

%{

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define YYSTYPE double

%}

%token NUMBER
%token ABS
%token EXP
%token LOG
%token MOD
%token POW

%%

result: expression {
	printf("%lf\n", $1);
}

expression: term {
	$$ = $1;
}

expression: expression '+' term {
	$$ = $1 + $3;
}

expression: expression '-' term {
	$$ = $1 - $3;
}

term: factor {
	$$ = $1;
}

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

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

factor: '+' factor {
	$$ = $2;
}

factor: '-' factor {
	$$ = -$2;
}

factor: NUMBER {
	$$ = $1;
}

factor: '(' expression ')' {
	$$ = $2;
}

factor: ABS '(' expression ')' {
	$$ = fabs($3);
}

factor: EXP '(' expression ')' {
	$$ = exp($3);
}

factor: LOG '(' expression ')' {
	$$ = log($3);
}

factor: MOD '(' expression ',' expression ')' {
	$$ = fmod($3, $5);
}

factor: POW '(' expression ',' expression ')' {
	$$ = pow($3, $5);
}

%%

main.c

#include <stdio.h>

int yyparse(void);
void yyerror(const char *msg);

int main(void) {
	return yyparse();
}

void yyerror(const char *msg) {
	fprintf(stderr, "%s\n", msg);
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值