亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? destruct.y

?? YYCC語言編譯器
?? Y
字號:
%{
/************************************************************
destruct.y
This example demonstrates the use of nonterminal
destructors. They are used for preforming cleanup when the
parser enters error recovery and starts popping symbols off
of the stack. Typically it is only necessary to do this if
memory has been allocated on the heap and would overwise be
lost. The example given here is of a node tree which is
first built and then evaluated, before being discarded.

The example builds on the basic calculator example. It
features floating point arithmetic using the addition,
subtraction, multiplication and divide operators, and unary
minus. Expressions can be grouped using parentheses, and
simple error recovery is supported.

Note that this is not the way to write such a simple
calculator program, however it does demonstate what is
possible.
************************************************************/

#include <ctype.h>
#include <stdio.h>
#include <malloc.h>

/* node types */
enum {
	NT_LEAF,		/* leaf node */
	NT_INTERIOR,	/* interior node (has an associated operator */
};

/* interior node operations */
enum {
	OP_ADD,			/* addition */
	OP_SUBTRACT,	/* subtraction */
	OP_TIMES,		/* multiplication */
	OP_DIVIDE,		/* division */
	OP_UMINUS,		/* unary minus */
};

/* node */
typedef struct tagNODE {
	int type;						/* node type (either leaf or interior) */
	union {
		struct {
			double value;			/* leaf value */
		} leaf;
		struct {
			int operation;			/* operation */
			struct tagNODE *left;	/* left node */
			struct tagNODE *right;	/* right node (not needed for unary minus) */
		} interior;
	} u;
} NODE;

static NODE *newleafnode(double value)
{
	NODE *node = malloc(sizeof(NODE));
	node->type = NT_LEAF;
	node->u.leaf.value = value;
	return node;
}

static NODE *newinteriornode(int operation, NODE *left, NODE *right)
{
	NODE *node = malloc(sizeof(NODE));
	node->type = NT_INTERIOR;
	node->u.interior.operation = operation;
	node->u.interior.left = left;
	node->u.interior.right = right;
	return node;
}

static double evaluatetree(NODE *node)
{
	if (node->type == NT_LEAF) {
		return node->u.leaf.value;
	}
	else {
		switch (node->u.interior.operation) {
		case OP_ADD:
			return evaluatetree(node->u.interior.left) + evaluatetree(node->u.interior.right);
		case OP_SUBTRACT:
			return evaluatetree(node->u.interior.left) - evaluatetree(node->u.interior.right);
		case OP_TIMES:
			return evaluatetree(node->u.interior.left) * evaluatetree(node->u.interior.right);
		case OP_DIVIDE:
			return evaluatetree(node->u.interior.left) / evaluatetree(node->u.interior.right);
		default:
			return -evaluatetree(node->u.interior.left);
		}
	}
}

static void deletetree(NODE *node)
{
	if (node != NULL) {
		if (node->type == NT_INTERIOR) {
			deletetree(node->u.interior.left);
			deletetree(node->u.interior.right);
		}
		free(node);
	}
}

%}

%union {
	NODE *node;
	double value;
}

%type <node> lines expr term factor

%token <value> NUMBER

%%
lines	: lines expr '\n'			{ printf("%g\n", evaluatetree($2)); deletetree($2); }
		| lines '\n'
		| /* e */
		| error '\n'				{ yyerror("reenter last line:"); yyerrok(); }
		;

expr	: expr '+' term				{ $$ = newinteriornode(OP_ADD, $1, $3); }
		| expr '-' term				{ $$ = newinteriornode(OP_SUBTRACT, $1, $3); }
		| term
		;

term	: term '*' factor			{ $$ = newinteriornode(OP_TIMES, $1, $3); }
		| term '/' factor			{ $$ = newinteriornode(OP_DIVIDE, $1, $3); }
		| factor
		;

factor	: '(' expr ')'				{ $$ = $2; }
		| '(' expr error			{ $$ = $2; yyerror("missing ')'"); yyerrok(); }
		| '-' factor				{ $$ = newinteriornode(OP_UMINUS, $2, NULL); }
		| NUMBER					{ $$ = newleafnode($1); }
		;

/************************************************************
The nonterminal destructor itself. Whenever any of these
symbols are popped off of the stack during error recovery
then this action will be called. Note that the missing right
parenthesis error ')' will never pop any symbols off of the
stack.

It is not necessary to specify a nonterminal destructor for
"lines". This is because it never actually holds a pointer
to a node itself. However it must be typed so a "node" type
is as good as anything else. You could for arguments sake
define it as being of type "value", or create a new type
altogether.

Because expr, term and factor are of the same type, it is
possible to combine them in the same nonterminal destructor.
If one of them had a different type then it would have to go
in a separate destructor.

For embedded actions (which generate an invisible
nonterminal) do the following:

A: { ... } ~{ ... } B  C
   $1      <skip>   $2 $3
   
Note that embedded action nonterminal destructors are
ignored for the purposes of counting the attribute number.
************************************************************/

~expr | ~term | ~factor : { printf("deleting node\n"); deletetree($$); } ;

%%
int yylex(void)
{
	int c;
	while ((c = getchar()) == ' ');
	if (c == '.' || isdigit(c)) {
		ungetc(c, stdin);
		scanf("%lf", &yylval);
		return NUMBER;
	}
	return c;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲精久久久久久| 欧美精品 日韩| 日本一区二区三区四区| 久久99国产精品麻豆| 久久这里只精品最新地址| 国产一区二区中文字幕| 国产精品天干天干在观线| 91一区二区在线| 亚洲国产一区二区在线播放| 欧美日韩国产片| 另类人妖一区二区av| 久久综合五月天婷婷伊人| 国产一区二区三区电影在线观看| 国产午夜三级一区二区三| 成人小视频免费在线观看| 一区二区在线观看免费视频播放| 在线观看视频一区| 久久91精品久久久久久秒播| 国产女人18毛片水真多成人如厕 | 午夜精品影院在线观看| 91精品国产综合久久精品app| 蜜臀va亚洲va欧美va天堂| 国产精品视频一区二区三区不卡| 在线一区二区三区四区五区| 久久国产欧美日韩精品| 国产精品午夜在线| 欧美日韩国产中文| 国产成人午夜精品影院观看视频| 樱桃视频在线观看一区| 337p粉嫩大胆噜噜噜噜噜91av| 69久久夜色精品国产69蝌蚪网| 狠狠色狠狠色合久久伊人| 亚洲人成精品久久久久| 久久人人爽人人爽| 欧美视频一区二区| 国产成人自拍在线| 午夜欧美2019年伦理| 国产欧美精品一区aⅴ影院| 欧美专区日韩专区| 国产一区二区在线观看视频| 夜夜嗨av一区二区三区网页| 久久久久久久网| 欧美体内she精高潮| 大尺度一区二区| 日本va欧美va瓶| 亚洲综合无码一区二区| 欧美极品美女视频| 日韩欧美区一区二| 欧美色图片你懂的| www.久久久久久久久| 黄色资源网久久资源365| 亚洲成a人v欧美综合天堂下载| 国产精品久久久久久久久免费丝袜 | 欧美精品自拍偷拍| 成人自拍视频在线观看| 国产一区在线不卡| 美国毛片一区二区三区| 丝瓜av网站精品一区二区| 综合色中文字幕| 欧美—级在线免费片| 国产色一区二区| 欧美tk—视频vk| 日韩一区二区免费在线观看| 欧美日韩国产色站一区二区三区| 91官网在线观看| 色哟哟日韩精品| 色先锋资源久久综合| 91理论电影在线观看| 99re这里只有精品视频首页| eeuss鲁片一区二区三区在线看| 国产一区999| 国产成人免费视频| 国产精品538一区二区在线| 精品亚洲免费视频| 久久99精品久久久久久久久久久久 | 国产精品888| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 中文字幕一区二区三区不卡在线| 日本一区免费视频| 国产精品污www在线观看| 欧美国产一区二区在线观看| 国产精品美女久久久久久2018| 亚洲一区二区三区在线播放| 亚洲乱码日产精品bd| 一区二区激情视频| 亚洲国产另类精品专区| 午夜精品福利久久久| 免费成人性网站| 国产在线精品一区二区夜色| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美精品一区二区三区四区| 精品国产乱码久久| 日本一区二区动态图| 国产精品久久久久国产精品日日| 亚洲婷婷综合久久一本伊一区| 亚洲男人电影天堂| 亚洲成人一区二区在线观看| 日韩黄色在线观看| 国内一区二区在线| 成人av资源站| 欧洲中文字幕精品| 日韩欧美一级在线播放| 国产欧美一区二区三区鸳鸯浴 | 亚洲欧美日本在线| 亚洲成a人片在线观看中文| 久久激情五月婷婷| 成人黄色av电影| 色综合天天做天天爱| 欧美精品久久天天躁| 久久久亚洲高清| 亚洲精品日韩专区silk| 老司机午夜精品| 成人福利电影精品一区二区在线观看| 欧美精品一区二区在线观看| 国产精品久久久久久久久免费丝袜| 洋洋av久久久久久久一区| 亚洲成人手机在线| 蜜臀久久久久久久| 国产aⅴ精品一区二区三区色成熟| 成人黄动漫网站免费app| 91官网在线观看| 久久综合九色综合97婷婷 | 日本一区二区三区在线观看| 一区二区三区在线播放| 久久不见久久见免费视频7| 99精品国产91久久久久久| 91精品在线免费观看| 亚洲国产成人午夜在线一区| 日韩中文字幕一区二区三区| 成人免费视频视频在线观看免费| 在线观看日韩一区| 国产欧美日韩精品在线| 天堂va蜜桃一区二区三区| 成人一道本在线| 日韩精品自拍偷拍| 亚洲国产日韩a在线播放| 成人高清av在线| 精品国产sm最大网站免费看| 亚洲影视在线播放| 成人av电影在线播放| 精品国产污网站| 亚洲成人综合视频| 91亚洲大成网污www| 国产三级精品视频| 久久99久久久欧美国产| 欧美日韩精品一区视频| 综合电影一区二区三区| 国产一区亚洲一区| 日韩欧美亚洲另类制服综合在线| 亚洲va国产va欧美va观看| 色哟哟国产精品| 亚洲欧美日韩久久精品| 成人精品视频.| 日本一区二区三区在线不卡| 国产精一区二区三区| 亚洲精品一区二区三区香蕉| 日韩av电影免费观看高清完整版| 欧美三级在线播放| 一区二区三区美女| 在线观看国产精品网站| 一区二区欧美国产| 色丁香久综合在线久综合在线观看| 1000精品久久久久久久久| 粉嫩久久99精品久久久久久夜| 国产欧美一区二区精品性| 国产一区二区精品久久| 久久久久久电影| 国产精品一区二区久久不卡| 久久久噜噜噜久久人人看 | 91麻豆免费视频| 最好看的中文字幕久久| 色综合久久99| 亚洲一区二区成人在线观看| 欧美喷水一区二区| 视频一区视频二区中文字幕| 8x福利精品第一导航| 日本成人在线一区| 精品三级av在线| 国产一级精品在线| 亚洲欧洲色图综合| 色嗨嗨av一区二区三区| 天天射综合影视| 精品人在线二区三区| 国产精品888| 亚洲品质自拍视频网站| 欧美日韩情趣电影| 免费观看成人鲁鲁鲁鲁鲁视频| 精品国产人成亚洲区| 国产成人福利片| 一区二区免费在线| 日韩免费观看2025年上映的电影| 国产剧情一区二区| 亚洲精品欧美在线| 日韩欧美第一区| 成人免费看黄yyy456| 亚洲国产精品久久人人爱蜜臀 | 成人午夜在线视频| 亚洲午夜国产一区99re久久| 精品久久久影院| 91网站最新地址|