?? countery.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 + -