📄 bc.c
字号:
"$$7 :","statement : While $$6 '(' expression $$7 ')' statement","statement : '{' statement_list '}'","$$8 :","statement : Print $$8 print_list","print_list : print_element","print_list : print_element ',' print_list","print_element : STRING","print_element : expression","opt_else :","$$9 :","opt_else : Else $$9 statement","$$10 :","function : Define NAME '(' opt_parameter_list ')' '{' NEWLINE opt_auto_define_list $$10 statement_list NEWLINE '}'","opt_parameter_list :","opt_parameter_list : define_list","opt_auto_define_list :","opt_auto_define_list : Auto define_list NEWLINE","opt_auto_define_list : Auto define_list ';'","define_list : NAME","define_list : NAME '[' ']'","define_list : define_list ',' NAME","define_list : define_list ',' NAME '[' ']'","opt_argument_list :","opt_argument_list : argument_list","argument_list : expression","argument_list : NAME '[' ']'","argument_list : argument_list ',' expression","argument_list : argument_list ',' NAME '[' ']'","opt_expression :","opt_expression : expression","return_expression :","return_expression : expression","$$11 :","expression : named_expression ASSIGN_OP $$11 expression","$$12 :","expression : expression AND $$12 expression","$$13 :","expression : expression OR $$13 expression","expression : NOT expression","expression : expression REL_OP expression","expression : expression '+' expression","expression : expression '-' expression","expression : expression MUL_OP expression","expression : expression '^' expression","expression : '-' expression","expression : named_expression","expression : NUMBER","expression : '(' expression ')'","expression : NAME '(' opt_argument_list ')'","expression : INCR_DECR named_expression","expression : named_expression INCR_DECR","expression : Length '(' expression ')'","expression : Sqrt '(' expression ')'","expression : Scale '(' expression ')'","expression : Read '(' ')'","named_expression : NAME","named_expression : NAME '[' expression ']'","named_expression : Ibase","named_expression : Obase","named_expression : Scale","named_expression : Last",};#endif#define yyclearin (yychar=(-1))#define yyerrok (yyerrflag=0)#ifdef YYSTACKSIZE#ifndef YYMAXDEPTH#define YYMAXDEPTH YYSTACKSIZE#endif#else#ifdef YYMAXDEPTH#define YYSTACKSIZE YYMAXDEPTH#else#define YYSTACKSIZE 500#define YYMAXDEPTH 500#endif#endifint yydebug;int yynerrs;int yyerrflag;int yychar;short *yyssp;YYSTYPE *yyvsp;YYSTYPE yyval;YYSTYPE yylval;short yyss[YYSTACKSIZE];YYSTYPE yyvs[YYSTACKSIZE];#define yystacksize YYSTACKSIZE#define YYABORT goto yyabort#define YYACCEPT goto yyaccept#define YYERROR goto yyerrlabintyyparse(){ register int yym, yyn, yystate;#if YYDEBUG register char *yys; extern char *getenv(); if (yys = getenv("YYDEBUG")) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; }#endif yynerrs = 0; yyerrflag = 0; yychar = (-1); yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0;yyloop: if (yyn = yydefred[yystate]) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0;#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("yydebug: state %d, reading %d (%s)\n", yystate, yychar, yys); }#endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) {#if YYDEBUG if (yydebug) printf("yydebug: state %d, shifting to state %d\n", yystate, yytable[yyn]);#endif if (yyssp >= yyss + yystacksize - 1) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery;#ifdef lint goto yynewerror;#endifyynewerror: yyerror("syntax error");#ifdef lint goto yyerrlab;#endifyyerrlab: ++yynerrs;yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) {#if YYDEBUG if (yydebug) printf("yydebug: state %d, error recovery shifting\ to state %d\n", *yyssp, yytable[yyn]);#endif if (yyssp >= yyss + yystacksize - 1) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else {#if YYDEBUG if (yydebug) printf("yydebug: error recovery discarding state %d\n", *yyssp);#endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort;#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("yydebug: state %d, error recovery discards token %d (%s)\n", yystate, yychar, yys); }#endif yychar = (-1); goto yyloop; }yyreduce:#if YYDEBUG if (yydebug) printf("yydebug: state %d, reducing by rule %d (%s)\n", yystate, yyn, yyrule[yyn]);#endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) {case 1:#line 106 "bc.y"{ yyval.i_value = 0; if (interactive) { printf ("%s\n", BC_VERSION); welcome (); } }break;case 3:#line 117 "bc.y"{ run_code (); }break;case 4:#line 119 "bc.y"{ run_code (); }break;case 5:#line 121 "bc.y"{ yyerrok; init_gen (); }break;case 6:#line 127 "bc.y"{ yyval.i_value = 0; }break;case 10:#line 133 "bc.y"{ yyval.i_value = 0; }break;case 17:#line 142 "bc.y"{ yyval.i_value = yyvsp[0].i_value; }break;case 18:#line 145 "bc.y"{ warranty (""); }break;case 19:#line 147 "bc.y"{ limits (); }break;case 20:#line 149 "bc.y"{ if (yyvsp[0].i_value & 2) warn ("comparison in expression"); if (yyvsp[0].i_value & 1) generate ("W"); else generate ("p"); }break;case 21:#line 158 "bc.y"{ yyval.i_value = 0; generate ("w"); generate (yyvsp[0].s_value); free (yyvsp[0].s_value); }break;case 22:#line 165 "bc.y"{ if (break_label == 0) yyerror ("Break outside a for/while"); else { sprintf (genstr, "J%1d:", break_label); generate (genstr); } }break;case 23:#line 175 "bc.y"{ warn ("Continue statement"); if (continue_label == 0) yyerror ("Continue outside a for"); else { sprintf (genstr, "J%1d:", continue_label); generate (genstr); } }break;case 24:#line 186 "bc.y"{ exit (0); }break;case 25:#line 188 "bc.y"{ generate ("h"); }break;case 26:#line 190 "bc.y"{ generate ("0R"); }break;case 27:#line 192 "bc.y"{ generate ("R"); }break;case 28:#line 194 "bc.y"{ yyvsp[0].i_value = break_label; break_label = next_label++; }break;case 29:#line 199 "bc.y"{ if (yyvsp[-1].i_value > 1) warn ("Comparison in first for expression"); yyvsp[-1].i_value = next_label++; if (yyvsp[-1].i_value < 0) sprintf (genstr, "N%1d:", yyvsp[-1].i_value); else sprintf (genstr, "pN%1d:", yyvsp[-1].i_value); generate (genstr); }break;case 30:#line 210 "bc.y"{ if (yyvsp[-1].i_value < 0) generate ("1"); yyvsp[-1].i_value = next_label++; sprintf (genstr, "B%1d:J%1d:", yyvsp[-1].i_value, break_label); generate (genstr); yyval.i_value = continue_label; continue_label = next_label++; sprintf (genstr, "N%1d:", continue_label); generate (genstr); }break;case 31:#line 221 "bc.y"{ if (yyvsp[-1].i_value > 1) warn ("Comparison in third for expression"); if (yyvsp[-1].i_value < 0) sprintf (genstr, "J%1d:N%1d:", yyvsp[-7].i_value, yyvsp[-4].i_value); else sprintf (genstr, "pJ%1d:N%1d:", yyvsp[-7].i_value, yyvsp[-4].i_value); generate (genstr); }break;case 32:#line 231 "bc.y"{ sprintf (genstr, "J%1d:N%1d:", continue_label, break_label); generate (genstr); break_label = yyvsp[-12].i_value; continue_label = yyvsp[-4].i_value; }break;case 33:#line 239 "bc.y"{ yyvsp[-1].i_value = if_label; if_label = next_label++; sprintf (genstr, "Z%1d:", if_label); generate (genstr); }break;case 34:#line 246 "bc.y"{ sprintf (genstr, "N%1d:", if_label); generate (genstr); if_label = yyvsp[-4].i_value; }break;case 35:#line 252 "bc.y"{ yyvsp[0].i_value = next_label++; sprintf (genstr, "N%1d:", yyvsp[0].i_value); generate (genstr); }break;case 36:#line 258 "bc.y"{ yyvsp[0].i_value = break_label; break_label = next_label++; sprintf (genstr, "Z%1d:", break_label); generate (genstr); }break;case 37:#line 265 "bc.y"{ sprintf (genstr, "J%1d:N%1d:", yyvsp[-6].i_value, break_label); generate (genstr); break_label = yyvsp[-3].i_value; }break;case 38:#line 271 "bc.y"{ yyval.i_value = 0; }break;case 39:#line 273 "bc.y"{ warn ("print statement"); }break;case 43:#line 280 "bc.y"{ generate ("O"); generate (yyvsp[0].s_value); free (yyvsp[0].s_value); }break;case 44:#line 286 "bc.y"{ generate ("P"); }break;case 46:#line 290 "bc.y"{ warn ("else clause in if statement"); yyvsp[0].i_value = next_label++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -