⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 countery.y

📁 使用LEX/YACC 编写的计算器程序 在VC环境下使用
💻 Y
字号:
%{
#include "StructDefine.h"
#include <string.h>
#include <math.h>
%}

%union
{
	double dval;
	struct symtab *symp;
}

%token <symp> NAME
%token <deval> NUMBER
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS

%type <dval> expression
%%
statement_list:		statement '\n'
		|	statement_list statement '\n' 
		;
statement:		NAME '=' expression { $1->value = $3; }
		|	expression { printf("= %g\n", $1); }
		;

expression: 		expression '+' expression { $$ = $1 + $3; }
		|	expression '-' expression { $$ = $1 - $3; }
		|	expression '*' expression { $$ = $1 * $3; }
		|	expression '/' expression 
			{
				if($3 == 0.0)
					yyerror("divide by zero");
				else
					$$ = $1 / $3;
			}
		|	'-' expression %prec UMINUS { $$ = -$2; }
		|	'(' expression ')' { $$ = $2; }
		|	NUMBER
		|	NAME { $$ = $1->value; }
		| 	NAME '(' expression ')'
			{
				if($1->funcptr)
					$$ = ($1->funcptr)($3);
				else
				{
					printf("%s not a function\n", $1->name);
					$$ = 0.0;
				}
			}
		;
%%

/*function*/
struct symtab *
symlook(s)
char *s;
{
	char *p;
	struct symtab *sp;
	
	for(sp = symtab; sp < &symtab[NSYMS]; sp++)
	{
		if(sp->name && !strcmp(sp->name, s))
			return sp;
		if(!sp->name)
		{
			sp->name = strdup(s);
			return sp;
		}
	}
	yyerror("Too many symbols");
	exit(1);
}

addfunc(name, func)
char *name;
double (*func)();
{
	struct symtab *sp = symlook(name);
	sp->funcptr = func;
}

main()
{
	extern double sqrt(), exp(), log();
	
	addfunc("sqrt", sqrt);
	addfunc("exp", exp);
	addfunc("log", log);
	yyparse();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -