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

📄 calc.y

📁 srand[getpid[]] /* initialize some of the memory */ memset[heightmap, 0, MAPSIZE*MAPSIZE]
💻 Y
字号:
%{
#define YYSTYPE double
#include <stdio.h>
#include <math.h>
#include <ctype.h>
%}

/* 定义部分 */
%token NUM
%left '-' '+'
%left '*' '/'
%right '^'       /* 指数运算   */

/* 规则部分 */

%%
input:		  /* 空串 */
       		| input line
     		;
     
line:		  '\n'
			| exp '\n'  { printf ("\t%.10g\n", $1); }
			;
     
exp:		  NUM                { $$ = $1;         }
			| exp '+' exp        { $$ = $1 + $3;    }
     		| exp '-' exp        { $$ = $1 - $3;    }
       		| exp '*' exp        { $$ = $1 * $3;    }
 			| exp '/' exp        { $$ = $1 / $3;    }
			| exp '^' exp        { $$ = pow ($1, $3); }
			| '(' exp ')'        { $$ = $2;         }
     		;
%% 
/* 用户代码部分同本章例2.1一样,在此省略*/

main ()	/* 主函数 */
	{
     yyparse ();
	}

yyerror (s)  /* 语法分析函数yyparse()出错时调用该函数 */
 	char *s;
	{
   	printf ("%s\n", s);
	}
/* yyparse()在对输入文件进行词法分析时,通过调用词法分析函数yylex()获
   得当前词汇的编码,在此我们提供一个手工编写的词法分析函数,该函数在返回
   词汇的编码的同时,还处理词汇的语义值yylval,该语义值将和词汇码一起
   移进分析栈 */
 
int yylex ()
	{
	int c;
 
	/* 跳过白字符 */
	while ((c = getchar ()) == ' ' || c == '\t')
	;
	/* 处理数字   */
	if (c == '.' || isdigit (c))
		{
		ungetc (c, stdin);
		scanf ("%lf", &yylval); /* 全局变量yylval记录当前词形的
					语义值,它在y.tab.c中定义,其数据类型由定义部分
					所定义的宏YYSTYPE给出,即双精度数double */
		return NUM; /* 返回数字对应的词汇编码NUM,YACC将定义部分的
				"%token NUM"翻译为C的宏定义"#define NUM XXX"
				输出到y.tab.c中,因此,在此可直接使用宏名NUM */
		}
       /* 文件结束时,返回0 */
	if (c == EOF)
         return 0;
       /* 返回字符的ASCII码,对语法规则部以单个字符形式出现的终结符(加' ' )
  		 在定义部分不需要用%token语句声明,它的词汇编码是其ASCII码 */
	return c;
	}

⌨️ 快捷键说明

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