📄 readnfg.cc
字号:
case 32:#line 104 "game/readnfg.yy"{ cont = 1; ; break;}case 38:#line 113 "game/readnfg.yy"{ outcome = N->NewOutcome(); outcome->SetName(last_name); pl = 1; ; break;}case 42:#line 121 "game/readnfg.yy"{ if (pl > N->NumPlayers()) YYERROR; N->SetPayoff(outcome, pl++, last_number); ; break;}case 47:#line 131 "game/readnfg.yy"{ if (cont > ncont) YYERROR; if (last_number != gNumber(0)) { N->SetOutcome(cont++, N->Outcomes()[last_number]); } else { N->SetOutcome(cont++, 0); } ; break;}} /* the action file gets copied in in place of this dollarsign */#line 542 "/usr/lib/bison.simple" yyvsp -= yylen; yyssp -= yylen;#ifdef YYLSP_NEEDED yylsp -= yylen;#endif#if YYDEBUG != 0 if (yydebug) { short *ssp1 = yyss - 1; fprintf (stderr, "state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); }#endif *++yyvsp = yyval;#ifdef YYLSP_NEEDED yylsp++; if (yylen == 0) { yylsp->first_line = yylloc.first_line; yylsp->first_column = yylloc.first_column; yylsp->last_line = (yylsp-1)->last_line; yylsp->last_column = (yylsp-1)->last_column; yylsp->text = 0; } else { yylsp->last_line = (yylsp+yylen-1)->last_line; yylsp->last_column = (yylsp+yylen-1)->last_column; }#endif /* Now "shift" the result of the reduction. Determine what state that goes to, based on the state we popped back to and the rule number reduced by. */ yyn = yyr1[yyn]; yystate = yypgoto[yyn - YYNTBASE] + *yyssp; if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else yystate = yydefgoto[yyn - YYNTBASE]; goto yynewstate;yyerrlab: /* here on detecting error */ if (! yyerrstatus) /* If not already recovering from an error, report this error. */ { ++yynerrs;#ifdef YYERROR_VERBOSE yyn = yypact[yystate]; if (yyn > YYFLAG && yyn < YYLAST) { int size = 0; char *msg; int x, count; count = 0; /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) size += strlen(yytname[x]) + 15, count++; msg = (char *) malloc(size + 15); if (msg != 0) { strcpy(msg, "parse error"); if (count < 5) { count = 0; for (x = (yyn < 0 ? -yyn : 0); x < (sizeof(yytname) / sizeof(char *)); x++) if (yycheck[x + yyn] == x) { strcat(msg, count == 0 ? ", expecting `" : " or `"); strcat(msg, yytname[x]); strcat(msg, "'"); count++; } } yyerror(msg); free(msg); } else yyerror ("parse error; also virtual memory exceeded"); } else#endif /* YYERROR_VERBOSE */ yyerror("parse error"); } goto yyerrlab1;yyerrlab1: /* here on error raised explicitly by an action */ if (yyerrstatus == 3) { /* if just tried and failed to reuse lookahead token after an error, discard it. */ /* return failure if at end of input */ if (yychar == YYEOF) YYABORT;#if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);#endif yychar = YYEMPTY; } /* Else will try to reuse lookahead token after shifting the error token. */ yyerrstatus = 3; /* Each real token shifted decrements this */ goto yyerrhandle;yyerrdefault: /* current state does not do anything special for the error token. */#if 0 /* This is wrong; only states that explicitly want error tokens should shift them. */ yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ if (yyn) goto yydefault;#endifyyerrpop: /* pop the current state because it cannot handle the error token */ if (yyssp == yyss) YYABORT; yyvsp--; yystate = *--yyssp;#ifdef YYLSP_NEEDED yylsp--;#endif#if YYDEBUG != 0 if (yydebug) { short *ssp1 = yyss - 1; fprintf (stderr, "Error: state stack now"); while (ssp1 != yyssp) fprintf (stderr, " %d", *++ssp1); fprintf (stderr, "\n"); }#endifyyerrhandle: yyn = yypact[yystate]; if (yyn == YYFLAG) goto yyerrdefault; yyn += YYTERROR; if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) goto yyerrdefault; yyn = yytable[yyn]; if (yyn < 0) { if (yyn == YYFLAG) goto yyerrpop; yyn = -yyn; goto yyreduce; } else if (yyn == 0) goto yyerrpop; if (yyn == YYFINAL) YYACCEPT;#if YYDEBUG != 0 if (yydebug) fprintf(stderr, "Shifting error token, ");#endif *++yyvsp = yylval;#ifdef YYLSP_NEEDED *++yylsp = yylloc;#endif yystate = yyn; goto yynewstate; yyacceptlab: /* YYACCEPT comes here. */ if (yyfree_stacks) { free (yyss); free (yyvs);#ifdef YYLSP_NEEDED free (yyls);#endif } return 0; yyabortlab: /* YYABORT comes here. */ if (yyfree_stacks) { free (yyss); free (yyvs);#ifdef YYLSP_NEEDED free (yyls);#endif } return 1;}#line 140 "game/readnfg.yy"void nfg_yyerror(char *) { }int nfg_yylex(void){ char c, d; while (1) { do { *infile >> c; } while (isspace(c)); if (c == '/') { *infile >> d; if (d == '/') { do { *infile >> d; } while (d != '\n'); } else if (d == '*') { int done = 0; while (!done) { do { *infile >> d; } while (d != '*'); *infile >> d; if (d == '/') done = 1; } } else { infile->unget(d); return SLASH; } } else break; } if (isalpha(c)) { last_name = c; *infile >> c; while (isalpha(c)) { last_name += c; *infile >> c; } infile->unget(c); return VARNAME; } if (c == '"') { infile->unget(c); *infile >> last_name; return NAME; } else if (isdigit(c) || c == '-') { infile->unget(c); *infile >> last_number; return NUMBER; } switch (c) { case '-': *infile >> c; if (isdigit(c)) { infile->unget(c); *infile >> last_number; last_number = -last_number; return NUMBER; } else { infile->unget(c); return '-'; } case '{': return LBRACE; case '}': return RBRACE; default: return c; }}bool CreateNfg(const gList<gText> &players, const gList<gNumber> &dims, const gList<gText> &strats){ if (players.Length() != dims.Length()) return false; gArray<int> dim(dims.Length()); ncont = 1; int i; for (i = 1; i <= dim.Length(); i++) { dim[i] = (int) dims[i]; ncont *= dim[i]; if (dim[i] <= 0) return false; } N = new Nfg(dim); int strat = 1; for (i = 1; i <= dim.Length(); i++) { N->Players()[i]->SetName(players[i]); if (strats.Length() > 0) for (int j = 1; j <= dim[i]; j++) N->Strategies(i)[j]->SetName(strats[strat++]); } return true;}void SetPayoff(int cont, int pl, const gNumber &value){ if (pl == 1) N->SetOutcome(cont, N->NewOutcome()); N->SetPayoff(N->GetOutcome(cont), pl, value);}static int ParseNfgFile(void){ infile->seekp(0); static char *prologue = { "NFG 1 " }; char c; for (unsigned int i = 0; i < strlen(prologue); i++) { infile->get(c); if (c != prologue[i]) return 1; } infile->get(c); switch (c) { case 'D': break; case 'R': break; default: return 1; } int ret = nfg_yyparse(); N->SetIsDirty(false); return ret; }int ReadNfgFile(gInput &p_file, Nfg *&p_nfg){ assert(!p_nfg); infile = &p_file; N = p_nfg; if (ParseNfgFile()) { if (p_nfg) { delete p_nfg; p_nfg = 0; } return 0; } p_nfg = N; return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -