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

📄 ch3-05.y

📁 lex 与 yacc 源代码
💻 Y
字号:
%{#include "ch3hdr2.h"#include <string.h>#include <math.h>%}%union {	double dval;	struct symtab *symp;}%token <symp> NAME%token <dval> 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;			}		}	;%%/* look up a symbol table entry, add if not present */struct symtab *symlook(s)char *s;{	char *p;	struct symtab *sp;		for(sp = symtab; sp < &symtab[NSYMS]; sp++) {		/* is it already here? */		if(sp->name && !strcmp(sp->name, s))			return sp;				/* is it free */		if(!sp->name) {			sp->name = strdup(s);			return sp;		}		/* otherwise continue to next */	}	yyerror("Too many symbols");	exit(1);	/* cannot continue */} /* symlook */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 + -