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

📄 comm2.y

📁 坦尼保姆
💻 Y
字号:
/* $Header: comm2.y,v 2.11 91/12/17 14:55:07 ceriel Exp $ *//* * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * See the copyright notice in the ACK home directory, in the file "Copyright". *//* @(#)comm2.y	1.7 *//* * delay inclusion of machine dependent stuff (see comm0.h) */#define	_include	#include%{#include	"comm0.h"#include	"comm1.h"static item_t	*last_it, *o_it;%}/* ========== Machine independent Yacc definitions ========== */%union {	word_t	y_word;	valu_t	y_valu;	expr_t	y_expr;	item_t	*y_item;#ifdef ASLD	char	*y_strp;#endif};#ifdef ASLD%token <y_strp> MODULE#endif%token STRING%token <y_item> IDENT%token <y_item> FBSYM%token <y_valu> CODE1%token <y_valu> CODE2%token <y_valu> CODE4%token NUMBER0		/* keep NUMBER* in this order */%token NUMBER1%token NUMBER2%token NUMBER3%token <y_valu> NUMBER%token DOT%token EXTERN%token <y_word> DATA%token <y_word> ASCII%token SECTION%token COMMON%token BASE%token SYMB%token SYMD%token ALIGN%token ASSERT%token SPACE%token <y_word> LINE%token FILe%token <y_word> LIST%token OP_EQ%token OP_NE%token OP_LE%token OP_GE%token OP_LL%token OP_RR%token OP_OO%token OP_AA%left OP_OO%left OP_AA%left '|'%left '^'%left '&'%left OP_EQ OP_NE%left '<' '>' OP_LE OP_GE%left OP_LL OP_RR%left '+' '-'%left '*' '/' '%' %nonassoc '~'%type <y_valu> absexp optabs1 optabs2%type <y_expr> expr%type <y_item> id_fb/* ========== Machine dependent Yacc definitions ========== */#include	"mach2.c"%%/* ========== Machine independent rules ========== */#ifdef LISTING#define	LISTLINE(n)	if (listflag) listline(n); \			else if (listtemp) { listflag = listtemp; listeoln = 1; }#else#define	LISTLINE(n)	/* empty */#endif /* LISTING */#ifdef ASLD#define	RELODONE	/* empty */#else#define	RELODONE	assert(relonami == 0)#endifprogram	:	/* empty */#ifdef ASLD	|	program MODULE /* not in PASS_1 */			{	newmodule($2);}#endif	|	program IDENT ':'			{	newident($2, DOTTYP); newlabel($2);}	|	program NUMBER ':'			{	if ($2 < 0 || $2 > 9) {					serror("bad f/b label");					$2 = 0;				}				newlabel(fb_shift((int)$2));			}	|	program CODE1			{	emit1((int)$2); LISTLINE(0);}	|	program CODE2			{	emit2((int)$2); LISTLINE(0);}	|	program CODE4			{	emit4((long)$2); LISTLINE(0);}	|	program operation ';'	|	program operation '\n'			{	lineno++; LISTLINE(1); RELODONE;}	|	program '#' NUMBER STRING '\n'			{	lineno = $3;				if (modulename) strncpy(modulename, stringbuf, STRINGMAX-1);				LISTLINE(1); RELODONE;			}	|	program error '\n'			{	serror("syntax error"); yyerrok;				lineno++; LISTLINE(1); RELODONE;			}	;#undef LISTLINE#undef RELODONEoperation	:	/* empty */	|	IDENT '=' expr			{#ifdef LISTING				if (listflag & 1)					listcolm += printx(VALWIDTH, $3.val);#endif				newequate($1, $3.typ);				store($1, $3.val);			}#ifdef LISTING	|	LIST			{	if ($1)					listtemp = listmode;				else if ((dflag & 01000) == 0)					listtemp = 0;			}#endif	| 	SECTION IDENT			{	newsect($2);}	|	COMMON IDENT ',' absexp			{	newcomm($2, $4);}	|	BASE absexp			{	if (pass == PASS_1) newbase($2);}	|	ASSERT expr			{	if ($2.val == 0 && pass == PASS_3)					warning("assertion failed");			}	|	SYMB STRING ',' expr	{ o_it = last_it; }		optabs2 optabs2			{	if ((sflag & SYM_SMB) && PASS_SYMB) {#ifndef ASLD					if (						pass == PASS_3						&&						($4.typ & S_TYP) == S_UND					   ) {						serror("expression undefined");						relonami = -1;					}					if (						PASS_SYMB						&&						($4.typ & S_COM)					   ) {						/* No value is known at						   assembler time.						   Generate reference to other						   entry in name table						*/						$4.typ = S_CRS;						$4.val = new_string(o_it->i_name);						relonami = 0;					}#endif					    					newsymb(						*stringbuf ? stringbuf : (char *) 0,						(short)(							($4.typ & (S_EXT|S_TYP))							|							((unsigned short)$6<<8)						),						(short)$7,						$4.val					);				}			}	|	SYMD STRING ','  absexp ',' absexp			{	if ((sflag & SYM_SMB) && PASS_SYMB) {					newsymb(						*stringbuf ? stringbuf : (char *) 0,						(short)(							(DOTTYP & (S_EXT|S_TYP))							|							((unsigned short)$4<<8)						),						(short)$6,						(valu_t)DOTVAL					);				}			}	|	LINE optabs1			{	if ((sflag & SYM_LIN) && PASS_SYMB) {					if ($2)						hllino = (short)$2;					else						hllino++;					newsymb(						(char *)0,						(DOTTYP | S_LIN),						hllino,						(valu_t)DOTVAL					);				}			}	|	FILe STRING			{	if ((sflag & SYM_LIN) && PASS_SYMB) {					hllino = 0;					newsymb(						stringbuf,						(DOTTYP | S_FIL),						0,						(valu_t)DOTVAL					);				}			}	|	EXTERN externlist	|	ALIGN optabs1			{	align($2);}	|	SPACE absexp			{	if (DOTSCT == NULL)					nosect();				DOTVAL += $2;				DOTSCT->s_zero += $2;			}	|	DATA datalist	|	ASCII STRING			{	emitstr($1);}	;externlist	:	IDENT			{	$1->i_type |= S_EXT;}	|	externlist ',' IDENT			{	$3->i_type |= S_EXT;}	;datalist	:	expr			{#ifdef RELOCATION				if (rflag != 0 && PASS_RELO)					newrelo($1.typ, (int)$<y_word>0|MACHREL_BWR);#endif				emitx($1.val, (int)$<y_word>0);			}	|	datalist ',' expr			{#ifdef RELOCATION				if (rflag != 0 && PASS_RELO)					newrelo($3.typ, (int)$<y_word>0|MACHREL_BWR);#endif				emitx($3.val, (int)$<y_word>0);			}	;expr	:	error			{	serror("expr syntax err");				$$.val = 0; $$.typ = S_UND;			}	|	NUMBER			{	$$.val = $1; $$.typ = S_ABS;}	|	id_fb			{	$$.val = load($1); 				last_it = $1;				$$.typ = $1->i_type & ~S_EXT;			}	|	STRING			{	if (stringlen != 1)					serror("too many chars");				$$.val = stringbuf[0];				$$.typ = S_ABS;			}	|	ASC_LPAR expr ASC_RPAR			{	$$ = $2;}	|	expr OP_OO expr			{	$$.val = ($1.val || $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	expr OP_AA expr			{	$$.val = ($1.val && $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	expr '|' expr			{	$$.val = ($1.val | $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	expr '^' expr			{	$$.val = ($1.val ^ $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	expr '&' expr			{	$$.val = ($1.val & $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	expr OP_EQ expr			{	$$.val = ($1.val == $3.val);				$$.typ = combine($1.typ, $3.typ, '>');			}	|	expr OP_NE expr			{	$$.val = ($1.val != $3.val);				$$.typ = combine($1.typ, $3.typ, '>');			}	|	expr '<' expr			{	$$.val = ($1.val < $3.val);				$$.typ = combine($1.typ, $3.typ, '>');			}	|	expr '>' expr			{	$$.val = ($1.val > $3.val);				$$.typ = combine($1.typ, $3.typ, '>');			}	|	expr OP_LE expr			{	$$.val = ($1.val <= $3.val);				$$.typ = combine($1.typ, $3.typ, '>');			}	|	expr OP_GE expr			{	$$.val = ($1.val >= $3.val);				$$.typ = combine($1.typ, $3.typ, '>');			}	|	expr OP_RR expr			{	$$.val = ($1.val >> $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	expr OP_LL expr			{	$$.val = ($1.val << $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	expr '+' expr			{	$$.val = ($1.val + $3.val);				$$.typ = combine($1.typ, $3.typ, '+');			}	|	expr '-' expr			{	$$.val = ($1.val - $3.val);				$$.typ = combine($1.typ, $3.typ, '-');			}	|	expr '*' expr			{	$$.val = ($1.val * $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	expr '/' expr			{	if ($3.val == 0) {					if (pass == PASS_3)						serror("divide by zero");					$$.val = 0;				} else					$$.val = ($1.val / $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	expr '%' expr			{	if ($3.val == 0) {					if (pass == PASS_3)						serror("divide by zero");					$$.val = 0;				} else					$$.val = ($1.val % $3.val);				$$.typ = combine($1.typ, $3.typ, 0);			}	|	'+' expr %prec '*'			{	$$.val = $2.val;				$$.typ = combine(S_ABS, $2.typ, 0);			}	|	'-' expr %prec '*'			{	$$.val = -$2.val;				$$.typ = combine(S_ABS, $2.typ, 0);			}	|	'~' expr			{	$$.val = ~$2.val;				$$.typ = combine(S_ABS, $2.typ, 0);			}	|	DOT			{	$$.val = DOTVAL;				$$.typ = DOTTYP|S_DOT;			}	;id_fb	:	IDENT	|	FBSYM	;absexp	:	expr			{	if (($1.typ & ~S_EXT) != S_ABS)					serror("must be absolute");				$$ = $1.val;			}	;optabs1	:	/* empty */			{	$$ = 0;}	|	absexp			{	$$ = $1;}	;optabs2	:	/* empty */			{	$$ = 0;}	|	',' absexp			{	$$ = $2;}	;/* ========== Machine dependent rules ========== */#include	"mach4.c"%%

⌨️ 快捷键说明

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