📄 syst_grammar.y
字号:
/* file "syst_grammar.y" *//* Copyright (c) 1994 Stanford University All rights reserved. This software is provided under the terms described in the "suif_copyright.h" include file. */%{ #include <suif_copyright.h> #include <suif1.h> #include <suifmath.h> #include <dependence.h> #include "syst_calc.h" %}%union { int val; named_symcoeff_ineq * sc; named_symcoeff_ineq_list * scl; symrec * sym; triplet * trp; triplet_list * trplst;} %token <val> NUM %token <sc> INEQ %token <sym> LVAR IVAR QVAR %token ORDER %token RENAME %token CODE %token IVALID %token RVALID %token PROJECT %token SIMPLIFY %token CONTAINED %token MERGE %token TEST %token HELP %token EXIT %token END %type <val> assnum %type <val> snum %type <val> snum2 %type <sc> exp %type <sc> compose %type <trp> coif1 %type <trp> coifn %type <trplst> ineq1 %type <trplst> ineqlist %type <trp> varlist %type <scl> mergelist %left '{' '}' %left '[' ']' %left '>' '<' LEFTEQ %right '=' %left '-' '+' %left '*' '/' %left '.' %left '~' %right '^' /* Exponentiation */ %left NEG /* Negation--unary minus */ /* Grammar follows */ %% input: /* empty */ | input line ; line: '\n' { if(Files.eok()) { printf(" > "); fflush(stdout); } } | '?' '\n' { print_help(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | HELP '\n' { print_help(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | EXIT '\n' { exit_calc(0); } | '#' assnum '\n' { if(Files.eok()) { printf(" > "); fflush(stdout); } } | '#' exp '\n' { if(Files.eok()) { printf(" > "); fflush(stdout); } } | assnum '\n' { printf("%d\n", $1); if(Files.eok()) { printf(" > "); fflush(stdout); } } | exp '\n' { $1->print_exp(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | CODE '(' exp ')' '\n' { do_print_code($3); if(Files.eok()) { printf(" > "); fflush(stdout); } } | exp '.' CODE '(' ')' '\n' { do_print_code($1); if(Files.eok()) { printf(" > "); fflush(stdout); } } | CODE '(' exp snum snum ')' '\n' { do_print_code($3, $4, $5); if(Files.eok()) { printf(" > "); fflush(stdout); } } | exp '.' CODE '(' snum snum ')' '\n' { do_print_code($1, $5, $6); if(Files.eok()) { printf(" > "); fflush(stdout); } } | CODE '(' exp snum ')' '\n' { do_print_code($3, $4); if(Files.eok()) { printf(" > "); fflush(stdout); } } | MERGE '(' snum ',' snum ',' mergelist ')' { if(setjmp(Env) != 0) ERR("invalid") else { merge_and_print($3, $5, $7); } resetjmp(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | MERGE '(' snum snum ',' mergelist ')' { if(setjmp(Env) != 0) ERR("invalid") else { merge_and_print($3, $4, $6); } resetjmp(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | MERGE '(' snum snum mergelist ')' { if(setjmp(Env) != 0) ERR("invalid") else { merge_and_print($3, $4, $5); } resetjmp(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | MERGE '(' snum ',' mergelist ')' { if(setjmp(Env) != 0) ERR("invalid") else { merge_and_print($3, -1, $5); } resetjmp(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | MERGE '(' snum mergelist ')' { if(setjmp(Env) != 0) ERR("invalid") else { merge_and_print($3, -1, $4); } resetjmp(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | MERGE '(' mergelist ')' { if(setjmp(Env) != 0) ERR("invalid") else { merge_and_print(-1, -1, $3); } resetjmp(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | exp '.' CODE '(' snum ')' '\n' { do_print_code($1, $5); if(Files.eok()) { printf(" > "); fflush(stdout); } } | TEST '(' exp ')' '\n' { do_test($3); if(Files.eok()) { printf(" > "); fflush(stdout); } } | '<' LVAR '\n' { Files.push($2->nm()); if(Files.eok()) { printf(" > "); fflush(stdout); } } | END '\n' { Files.pop(); if(Files.eok()) { printf(" > "); fflush(stdout); } } | error '\n' { yyerrok; Files.endtab(); if(Files.eok()) { printf(" > "); fflush(stdout); } } ; assnum: snum { $$ = $1; } | snum2 { $$ = $1; } | IVAR { $$ = $1->get_int(); } | LVAR '=' snum { $$ = $3; $1->set($3); } | IVAR '=' snum { $$ = $3; $1->set($3); } | LVAR '=' snum2 { $$ = $3; $1->set($3); } | IVAR '=' snum2 { $$ = $3; $1->set($3); }; snum: NUM { $$ = $1; } | QVAR '[' snum ']' '[' snum ']' '[' snum ']' { named_symcoeff_ineq tmp($1->get_sc()); $$ = tmp[$3][$6][$9]; } | snum '+' snum { $$ = $1 + $3; } | snum '-' snum { $$ = $1 - $3; } | snum '*' snum { $$ = $1 * $3; } | snum '/' snum { if(setjmp(Env) != 0) ERR("div by 0?") else $$ = $1 / $3; resetjmp(); } | '(' snum ')' { $$ = $2; } | '^' '(' exp ')' { if(setjmp(Env) != 0) ERR("invalid") else { $$ = ~(*$3); } resetjmp(); } | '(' exp '<' '<' exp ')' { if(setjmp(Env) != 0) ERR("invalid") else { $$ = (*$2) << (*$5); } resetjmp(); } | '(' exp '>' '>' exp ')' { if(setjmp(Env) != 0) ERR("invalid") else { $$ = (*$2) >> (*$5); } resetjmp(); } ; snum2: RVALID '(' exp ')' { if(setjmp(Env) != 0) ERR("invalid") else { $$ = (~(*$3) == FALSE); } resetjmp(); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -