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

📄 spin.y

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 Y
📖 第 1 页 / 共 2 页
字号:
				  if ($3 && $1->sym->type != STRUCT)					$1->sym->type = STRUCT;				  Embedded--;				  if (!Embedded && !NamesNotAdded				  &&  !$1->sym->type)				   non_fatal("undeclared variable: %s",						$1->sym->name);				  if ($3) validref($1, $3->lft);				  owner = ZS;				}	;sfld	: /* empty */		{ $$ = ZN; }	| '.' cmpnd %prec DOT	{ $$ = nn(ZN, '.', $2, ZN); }	;stmnt	: Special		{ $$ = $1; }	| Stmnt			{ $$ = $1;				  if (inEventMap)				   fatal("not an event", (char *)0);				}	;Special : varref RCV		{ Expand_Ok++; }	  rargs			{ Expand_Ok--; has_io++;				  $$ = nn($1,  'r', $1, $4);				  trackchanuse($4, ZN, 'R');				}	| varref SND		{ Expand_Ok++; }	  margs			{ Expand_Ok--; has_io++;				  $$ = nn($1, 's', $1, $4);				  $$->val=0; trackchanuse($4, ZN, 'S');				}	| IF options FI 	{ $$ = nn($1, IF, ZN, ZN);        			  $$->sl = $2->sl;				  prune_opts($$);        			}	| DO    		{ pushbreak(); }          options OD    	{ $$ = nn($1, DO, ZN, ZN);        			  $$->sl = $3->sl;				  prune_opts($$);        			}	| BREAK  		{ $$ = nn(ZN, GOTO, ZN, ZN);				  $$->sym = break_dest();				}	| GOTO NAME		{ $$ = nn($2, GOTO, ZN, ZN);				  if ($2->sym->type != 0				  &&  $2->sym->type != LABEL) {				  	non_fatal("bad label-name %s",					$2->sym->name);				  }				  $2->sym->type = LABEL;				}	| NAME ':' stmnt	{ $$ = nn($1, ':',$3, ZN);				  if ($1->sym->type != 0				  &&  $1->sym->type != LABEL) {				  	non_fatal("bad label-name %s",					$1->sym->name);				  }				  $1->sym->type = LABEL;				}	;Stmnt	: varref ASGN expr	{ $$ = nn($1, ASGN, $1, $3);				  trackvar($1, $3);				  nochan_manip($1, $3, 0);				}	| varref INCR		{ $$ = nn(ZN,CONST, ZN, ZN); $$->val = 1;				  $$ = nn(ZN,  '+', $1, $$);				  $$ = nn($1, ASGN, $1, $$);				  trackvar($1, $1);				  if ($1->sym->type == CHAN)				   fatal("arithmetic on chan", (char *)0);				}	| varref DECR		{ $$ = nn(ZN,CONST, ZN, ZN); $$->val = 1;				  $$ = nn(ZN,  '-', $1, $$);				  $$ = nn($1, ASGN, $1, $$);				  trackvar($1, $1);				  if ($1->sym->type == CHAN)				   fatal("arithmetic on chan id's", (char *)0);				}	| PRINT	'(' STRING	{ realread = 0; }	  prargs ')'		{ $$ = nn($3, PRINT, $5, ZN); realread = 1; }	| PRINTM '(' varref ')'	{ $$ = nn(ZN, PRINTM, $3, ZN); }	| PRINTM '(' CONST ')'	{ $$ = nn(ZN, PRINTM, $3, ZN); }	| ASSERT full_expr    	{ $$ = nn(ZN, ASSERT, $2, ZN); AST_track($2, 0); }	| ccode			{ $$ = $1; }	| varref R_RCV		{ Expand_Ok++; }	  rargs			{ Expand_Ok--; has_io++;				  $$ = nn($1,  'r', $1, $4);				  $$->val = has_random = 1;				  trackchanuse($4, ZN, 'R');				}	| varref RCV		{ Expand_Ok++; }	  LT rargs GT		{ Expand_Ok--; has_io++;				  $$ = nn($1, 'r', $1, $5);				  $$->val = 2;	/* fifo poll */				  trackchanuse($5, ZN, 'R');				}	| varref R_RCV		{ Expand_Ok++; }	  LT rargs GT		{ Expand_Ok--; has_io++;	/* rrcv poll */				  $$ = nn($1, 'r', $1, $5);				  $$->val = 3; has_random = 1;				  trackchanuse($5, ZN, 'R');				}	| varref O_SND		{ Expand_Ok++; }	  margs			{ Expand_Ok--; has_io++;				  $$ = nn($1, 's', $1, $4);				  $$->val = has_sorted = 1;				  trackchanuse($4, ZN, 'S');				}	| full_expr		{ $$ = nn(ZN, 'c', $1, ZN); count_runs($$); }	| ELSE  		{ $$ = nn(ZN,ELSE,ZN,ZN);				}	| ATOMIC   '{'   	{ open_seq(0); }          sequence OS '}'   	{ $$ = nn($1, ATOMIC, ZN, ZN);        			  $$->sl = seqlist(close_seq(3), 0);        			  make_atomic($$->sl->this, 0);        			}	| D_STEP '{'		{ open_seq(0); rem_Seq(); }          sequence OS '}'   	{ $$ = nn($1, D_STEP, ZN, ZN);        			  $$->sl = seqlist(close_seq(4), 0);        			  make_atomic($$->sl->this, D_ATOM);				  unrem_Seq();        			}	| '{'			{ open_seq(0); }	  sequence OS '}'	{ $$ = nn(ZN, NON_ATOMIC, ZN, ZN);        			  $$->sl = seqlist(close_seq(5), 0);        			}	| INAME			{ IArgs++; }	  '(' args ')'		{ pickup_inline($1->sym, $4); IArgs--; }	  Stmnt			{ $$ = $7; }	;options : option		{ $$->sl = seqlist($1->sq, 0); }	| option options	{ $$->sl = seqlist($1->sq, $2->sl); }	;option  : SEP   		{ open_seq(0); }          sequence OS		{ $$ = nn(ZN,0,ZN,ZN);				  $$->sq = close_seq(6); }	;OS	: /* empty */	| SEMI			{ /* redundant semi at end of sequence */ }	;MS	: SEMI			{ /* at least one semi-colon */ }	| MS SEMI		{ /* but more are okay too   */ }	;aname	: NAME			{ $$ = $1; }	| PNAME			{ $$ = $1; }	;expr    : '(' expr ')'		{ $$ = $2; }	| expr '+' expr		{ $$ = nn(ZN, '+', $1, $3); }	| expr '-' expr		{ $$ = nn(ZN, '-', $1, $3); }	| expr '*' expr		{ $$ = nn(ZN, '*', $1, $3); }	| expr '/' expr		{ $$ = nn(ZN, '/', $1, $3); }	| expr '%' expr		{ $$ = nn(ZN, '%', $1, $3); }	| expr '&' expr		{ $$ = nn(ZN, '&', $1, $3); }	| expr '^' expr		{ $$ = nn(ZN, '^', $1, $3); }	| expr '|' expr		{ $$ = nn(ZN, '|', $1, $3); }	| expr GT expr		{ $$ = nn(ZN,  GT, $1, $3); }	| expr LT expr		{ $$ = nn(ZN,  LT, $1, $3); }	| expr GE expr		{ $$ = nn(ZN,  GE, $1, $3); }	| expr LE expr		{ $$ = nn(ZN,  LE, $1, $3); }	| expr EQ expr		{ $$ = nn(ZN,  EQ, $1, $3); }	| expr NE expr		{ $$ = nn(ZN,  NE, $1, $3); }	| expr AND expr		{ $$ = nn(ZN, AND, $1, $3); }	| expr OR  expr		{ $$ = nn(ZN,  OR, $1, $3); }	| expr LSHIFT expr	{ $$ = nn(ZN, LSHIFT,$1, $3); }	| expr RSHIFT expr	{ $$ = nn(ZN, RSHIFT,$1, $3); }	| '~' expr		{ $$ = nn(ZN, '~', $2, ZN); }	| '-' expr %prec UMIN	{ $$ = nn(ZN, UMIN, $2, ZN); }	| SND expr %prec NEG	{ $$ = nn(ZN, '!', $2, ZN); }	| '(' expr SEMI expr ':' expr ')' {				  $$ = nn(ZN,  OR, $4, $6);				  $$ = nn(ZN, '?', $2, $$);				}	| RUN aname		{ Expand_Ok++;				  if (!context)				  fatal("used 'run' outside proctype",					(char *) 0);				  if (strcmp(context->name, ":init:") != 0)					runsafe = 0;				}	  '(' args ')'	  Opt_priority		{ Expand_Ok--;				  $$ = nn($2, RUN, $5, ZN);				  $$->val = ($7) ? $7->val : 1;				  trackchanuse($5, $2, 'A'); trackrun($$);				}	| LEN '(' varref ')'	{ $$ = nn($3, LEN, $3, ZN); }	| ENABLED '(' expr ')'	{ $$ = nn(ZN, ENABLED, $3, ZN);				  has_enabled++;				}	| varref RCV		{ Expand_Ok++; }	  '[' rargs ']'		{ Expand_Ok--; has_io++;				  $$ = nn($1, 'R', $1, $5);				}	| varref R_RCV		{ Expand_Ok++; }	  '[' rargs ']'		{ Expand_Ok--; has_io++;				  $$ = nn($1, 'R', $1, $5);				  $$->val = has_random = 1;				}	| varref		{ $$ = $1; trapwonly($1, "varref"); }	| cexpr			{ $$ = $1; }	| CONST 		{ $$ = nn(ZN,CONST,ZN,ZN);				  $$->ismtyp = $1->ismtyp;				  $$->val = $1->val;				}	| TIMEOUT		{ $$ = nn(ZN,TIMEOUT, ZN, ZN); }	| NONPROGRESS		{ $$ = nn(ZN,NONPROGRESS, ZN, ZN);				  has_np++;				}	| PC_VAL '(' expr ')'	{ $$ = nn(ZN, PC_VAL, $3, ZN);				  has_pcvalue++;				}	| PNAME '[' expr ']' '@' NAME	  			{ $$ = rem_lab($1->sym, $3, $6->sym); }	| PNAME '[' expr ']' ':' pfld	  			{ $$ = rem_var($1->sym, $3, $6->sym, $6->lft); }	| PNAME '@' NAME	{ $$ = rem_lab($1->sym, ZN, $3->sym); }	| PNAME ':' pfld	{ $$ = rem_var($1->sym, ZN, $3->sym, $3->lft); }	;Opt_priority:	/* none */	{ $$ = ZN; }	| PRIORITY CONST	{ $$ = $2; }	;full_expr:	expr		{ $$ = $1; }	|	Expr		{ $$ = $1; }	;Opt_enabler:	/* none */	{ $$ = ZN; }	| PROVIDED '(' full_expr ')'	{ if (!proper_enabler($3))				  {	non_fatal("invalid PROVIDED clause",						(char *)0);					$$ = ZN;				  } else					$$ = $3;				 }	| PROVIDED error	{ $$ = ZN;				  non_fatal("usage: provided ( ..expr.. )",					(char *)0);				}	;	/* an Expr cannot be negated - to protect Probe expressions */Expr	: Probe			{ $$ = $1; }	| '(' Expr ')'		{ $$ = $2; }	| Expr AND Expr		{ $$ = nn(ZN, AND, $1, $3); }	| Expr AND expr		{ $$ = nn(ZN, AND, $1, $3); }	| Expr OR  Expr		{ $$ = nn(ZN,  OR, $1, $3); }	| Expr OR  expr		{ $$ = nn(ZN,  OR, $1, $3); }	| expr AND Expr		{ $$ = nn(ZN, AND, $1, $3); }	| expr OR  Expr		{ $$ = nn(ZN,  OR, $1, $3); }	;Probe	: FULL '(' varref ')'	{ $$ = nn($3,  FULL, $3, ZN); }	| NFULL '(' varref ')'	{ $$ = nn($3, NFULL, $3, ZN); }	| EMPTY '(' varref ')'	{ $$ = nn($3, EMPTY, $3, ZN); }	| NEMPTY '(' varref ')'	{ $$ = nn($3,NEMPTY, $3, ZN); }	;basetype: TYPE			{ $$->sym = ZS;				  $$->val = $1->val;				  if ($$->val == UNSIGNED)				  fatal("unsigned cannot be used as mesg type", 0);				}	| UNAME			{ $$->sym = $1->sym;				  $$->val = STRUCT;				}	| error			/* e.g., unsigned ':' const */	;typ_list: basetype		{ $$ = nn($1, $1->val, ZN, ZN); }	| basetype ',' typ_list	{ $$ = nn($1, $1->val, ZN, $3); }	;args    : /* empty */		{ $$ = ZN; }	| arg			{ $$ = $1; }	;prargs  : /* empty */		{ $$ = ZN; }	| ',' arg		{ $$ = $2; }	;margs   : arg			{ $$ = $1; }	| expr '(' arg ')'	{ if ($1->ntyp == ',')					$$ = tail_add($1, $3);				  else				  	$$ = nn(ZN, ',', $1, $3);				}	;arg     : expr			{ if ($1->ntyp == ',')					$$ = $1;				  else				  	$$ = nn(ZN, ',', $1, ZN);				}	| expr ',' arg		{ if ($1->ntyp == ',')					$$ = tail_add($1, $3);				  else				  	$$ = nn(ZN, ',', $1, $3);				}	;rarg	: varref		{ $$ = $1; trackvar($1, $1);				  trapwonly($1, "rarg"); }	| EVAL '(' expr ')'	{ $$ = nn(ZN,EVAL,$3,ZN);				  trapwonly($1, "eval rarg"); }	| CONST 		{ $$ = nn(ZN,CONST,ZN,ZN);				  $$->ismtyp = $1->ismtyp;				  $$->val = $1->val;				}	| '-' CONST %prec UMIN	{ $$ = nn(ZN,CONST,ZN,ZN);				  $$->val = - ($2->val);				}	;rargs	: rarg			{ if ($1->ntyp == ',')					$$ = $1;				  else				  	$$ = nn(ZN, ',', $1, ZN);				}	| rarg ',' rargs	{ if ($1->ntyp == ',')					$$ = tail_add($1, $3);				  else				  	$$ = nn(ZN, ',', $1, $3);				}	| rarg '(' rargs ')'	{ if ($1->ntyp == ',')					$$ = tail_add($1, $3);				  else				  	$$ = nn(ZN, ',', $1, $3);				}	| '(' rargs ')'		{ $$ = $2; }	;nlst	: NAME			{ $$ = nn($1, NAME, ZN, ZN);				  $$ = nn(ZN, ',', $$, ZN); }	| nlst NAME 		{ $$ = nn($2, NAME, ZN, ZN);				  $$ = nn(ZN, ',', $$, $1);				}	| nlst ','		{ $$ = $1; /* commas optional */ }	;%%voidyyerror(char *fmt, ...){	non_fatal(fmt, (char *) 0);}

⌨️ 快捷键说明

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