📄 spin.y
字号:
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 + -