config_gram.c
来自「这是一个非常有价值的参考代码」· C语言 代码 · 共 2,133 行 · 第 1/5 页
C
2,133 行
break;}case 115:#line 834 "../config_gram.y"{ current_mem->readsize = yyvsp[0]->value.number; free_token(yyvsp[0]); ; break;}case 116:#line 840 "../config_gram.y"{ current_mem->pollindex = yyvsp[0]->value.number; free_token(yyvsp[0]); ; break;}case 117:#line 846 "../config_gram.y"{ { int opnum; OPCODE * op; opnum = which_opcode(yyvsp[-2]); op = avr_new_opcode(); parse_cmdbits(op); current_mem->op[opnum] = op; free_token(yyvsp[-2]); } ; break;}} /* the action file gets copied in in place of this dollarsign */#line 543 "/usr/share/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 862 "../config_gram.y"#if 0static char * vtypestr(int type){ switch (type) { case V_NUM : return "NUMERIC"; case V_STR : return "STRING"; default: return "<UNKNOWN>"; }}#endifstatic int assign_pin(int pinno, TOKEN * v, int invert){ int value; value = v->value.number; if ((value <= 0) || (value >= 18)) { fprintf(stderr, "%s: error at line %d of %s: pin must be in the " "range 1-17\n", progname, lineno, infile); exit(1); } if (invert) value |= PIN_INVERSE; current_prog->pinno[pinno] = value; return 0;}static int which_opcode(TOKEN * opcode){ switch (opcode->primary) { case K_READ : return AVR_OP_READ; break; case K_WRITE : return AVR_OP_WRITE; break; case K_READ_LO : return AVR_OP_READ_LO; break; case K_READ_HI : return AVR_OP_READ_HI; break; case K_WRITE_LO : return AVR_OP_WRITE_LO; break; case K_WRITE_HI : return AVR_OP_WRITE_HI; break; case K_LOADPAGE_LO : return AVR_OP_LOADPAGE_LO; break; case K_LOADPAGE_HI : return AVR_OP_LOADPAGE_HI; break; case K_WRITEPAGE : return AVR_OP_WRITEPAGE; break; case K_CHIP_ERASE : return AVR_OP_CHIP_ERASE; break; case K_PGM_ENABLE : return AVR_OP_PGM_ENABLE; break; default : fprintf(stderr, "%s: error at %s:%d: invalid opcode\n", progname, infile, lineno); exit(1); break; }}static int parse_cmdbits(OPCODE * op){ TOKEN * t; int bitno; char ch; char * e; char * q; int len; char * s, *brkt; bitno = 32; while (lsize(string_list)) { t = lrmv_n(string_list, 1); s = strtok_r(t->value.string, " ", &brkt); while (s != NULL) { bitno--; if (bitno < 0) { fprintf(stderr, "%s: error at %s:%d: too many opcode bits for instruction\n", progname, infile, lineno); exit(1); } len = strlen(s); if (len == 0) { fprintf(stderr, "%s: error at %s:%d: invalid bit specifier \"\"\n", progname, infile, lineno); exit(1); } ch = s[0]; if (len == 1) { switch (ch) { case '1': op->bit[bitno].type = AVR_CMDBIT_VALUE; op->bit[bitno].value = 1; op->bit[bitno].bitno = bitno % 8; break; case '0': op->bit[bitno].type = AVR_CMDBIT_VALUE; op->bit[bitno].value = 0; op->bit[bitno].bitno = bitno % 8; break; case 'x': op->bit[bitno].type = AVR_CMDBIT_IGNORE; op->bit[bitno].value = 0; op->bit[bitno].bitno = bitno % 8; break; case 'a': op->bit[bitno].type = AVR_CMDBIT_ADDRESS; op->bit[bitno].value = 0; op->bit[bitno].bitno = 8*(bitno/8) + bitno % 8; break; case 'i': op->bit[bitno].type = AVR_CMDBIT_INPUT; op->bit[bitno].value = 0; op->bit[bitno].bitno = bitno % 8; break; case 'o': op->bit[bitno].type = AVR_CMDBIT_OUTPUT; op->bit[bitno].value = 0; op->bit[bitno].bitno = bitno % 8; break; default : fprintf(stderr, "%s: error at %s:%d: invalid bit specifier '%c'\n", progname, infile, lineno, ch); exit(1); break; } } else { if (ch == 'a') { q = &s[1]; op->bit[bitno].bitno = strtol(q, &e, 0); if ((e == q)||(*e != 0)) { fprintf(stderr, "%s: error at %s:%d: can't parse bit number from \"%s\"\n", progname, infile, lineno, q); exit(1); } op->bit[bitno].type = AVR_CMDBIT_ADDRESS; op->bit[bitno].value = 0; } else { fprintf(stderr, "%s: error at %s:%d: invalid bit specifier \"%s\"\n", progname, infile, lineno, s); exit(1); } } s = strtok_r(NULL, " ", &brkt); } free_token(t); } /* while */ return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?