📄 parse.c
字号:
* * By the way, we didn't do this at the * beginning of this production because back * then current_state_type was set up for a * trail rule, and add_accept() can create * a new state ... */ add_accept( yyvsp[-1], num_rules | YY_TRAILING_HEAD_MASK ); variable_trail_rule = true; } else trailcnt = rulelen; yyval = link_machines( yyvsp[-1], yyvsp[0] ); }break;case 36:#line 421 "./parse.y"{ synerr( "trailing context used twice" ); }break;case 37:#line 424 "./parse.y"{ headcnt = 0; trailcnt = 1; rulelen = 1; varlength = false; current_state_type = STATE_TRAILING_CONTEXT; if ( trlcontxt ) { synerr( "trailing context used twice" ); yyval = mkstate( SYM_EPSILON ); } else if ( previous_continued_action ) { /* See the comment in the rule for "re2 re" * above. */ warn( "trailing context made variable due to preceding '|' action" ); varlength = true; } if ( lex_compat || varlength ) { /* Again, see the comment in the rule for * "re2 re" above. */ add_accept( yyvsp[-1], num_rules | YY_TRAILING_HEAD_MASK ); variable_trail_rule = true; } trlcontxt = true; eps = mkstate( SYM_EPSILON ); yyval = link_machines( yyvsp[-1], link_machines( eps, mkstate( '\n' ) ) ); }break;case 38:#line 467 "./parse.y"{ yyval = yyvsp[0]; if ( trlcontxt ) { if ( lex_compat || (varlength && headcnt == 0) ) /* Both head and trail are * variable-length. */ variable_trail_rule = true; else trailcnt = rulelen; } }break;case 39:#line 485 "./parse.y"{ varlength = true; yyval = mkor( yyvsp[-2], yyvsp[0] ); }break;case 40:#line 491 "./parse.y"{ yyval = yyvsp[0]; }break;case 41:#line 496 "./parse.y"{ /* This rule is written separately so the * reduction will occur before the trailing * series is parsed. */ if ( trlcontxt ) synerr( "trailing context used twice" ); else trlcontxt = true; if ( varlength ) /* We hope the trailing context is * fixed-length. */ varlength = false; else headcnt = rulelen; rulelen = 0; current_state_type = STATE_TRAILING_CONTEXT; yyval = yyvsp[-1]; }break;case 42:#line 523 "./parse.y"{ /* This is where concatenation of adjacent patterns * gets done. */ yyval = link_machines( yyvsp[-1], yyvsp[0] ); }break;case 43:#line 531 "./parse.y"{ yyval = yyvsp[0]; }break;case 44:#line 535 "./parse.y"{ varlength = true; yyval = mkclos( yyvsp[-1] ); }break;case 45:#line 542 "./parse.y"{ varlength = true; yyval = mkposcl( yyvsp[-1] ); }break;case 46:#line 548 "./parse.y"{ varlength = true; yyval = mkopt( yyvsp[-1] ); }break;case 47:#line 554 "./parse.y"{ varlength = true; if ( yyvsp[-3] > yyvsp[-1] || yyvsp[-3] < 0 ) { synerr( "bad iteration values" ); yyval = yyvsp[-5]; } else { if ( yyvsp[-3] == 0 ) { if ( yyvsp[-1] <= 0 ) { synerr( "bad iteration values" ); yyval = yyvsp[-5]; } else yyval = mkopt( mkrep( yyvsp[-5], 1, yyvsp[-1] ) ); } else yyval = mkrep( yyvsp[-5], yyvsp[-3], yyvsp[-1] ); } }break;case 48:#line 582 "./parse.y"{ varlength = true; if ( yyvsp[-2] <= 0 ) { synerr( "iteration value must be positive" ); yyval = yyvsp[-4]; } else yyval = mkrep( yyvsp[-4], yyvsp[-2], INFINITY ); }break;case 49:#line 596 "./parse.y"{ /* The singleton could be something like "(foo)", * in which case we have no idea what its length * is, so we punt here. */ varlength = true; if ( yyvsp[-1] <= 0 ) { synerr( "iteration value must be positive" ); yyval = yyvsp[-3]; } else yyval = link_machines( yyvsp[-3], copysingl( yyvsp[-3], yyvsp[-1] - 1 ) ); }break;case 50:#line 615 "./parse.y"{ if ( ! madeany ) { /* Create the '.' character class. */ anyccl = cclinit(); ccladd( anyccl, '\n' ); cclnegate( anyccl ); if ( useecs ) mkeccl( ccltbl + cclmap[anyccl], ccllen[anyccl], nextecm, ecgroup, csize, csize ); madeany = true; } ++rulelen; yyval = mkstate( -anyccl ); }break;case 51:#line 637 "./parse.y"{ if ( ! cclsorted ) /* Sort characters for fast searching. We * use a shell sort since this list could * be large. */ cshell( ccltbl + cclmap[yyvsp[0]], ccllen[yyvsp[0]], true ); if ( useecs ) mkeccl( ccltbl + cclmap[yyvsp[0]], ccllen[yyvsp[0]], nextecm, ecgroup, csize, csize ); ++rulelen; yyval = mkstate( -yyvsp[0] ); }break;case 52:#line 655 "./parse.y"{ ++rulelen; yyval = mkstate( -yyvsp[0] ); }break;case 53:#line 662 "./parse.y"{ yyval = yyvsp[-1]; }break;case 54:#line 665 "./parse.y"{ yyval = yyvsp[-1]; }break;case 55:#line 668 "./parse.y"{ ++rulelen; if ( caseins && yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' ) yyvsp[0] = clower( yyvsp[0] ); yyval = mkstate( yyvsp[0] ); }break;case 56:#line 679 "./parse.y"{ yyval = yyvsp[-1]; }break;case 57:#line 682 "./parse.y"{ cclnegate( yyvsp[-1] ); yyval = yyvsp[-1]; }break;case 58:#line 689 "./parse.y"{ if ( caseins ) { if ( yyvsp[-2] >= 'A' && yyvsp[-2] <= 'Z' ) yyvsp[-2] = clower( yyvsp[-2] ); if ( yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' ) yyvsp[0] = clower( yyvsp[0] ); } if ( yyvsp[-2] > yyvsp[0] ) synerr( "negative range in character class" ); else { for ( i = yyvsp[-2]; i <= yyvsp[0]; ++i ) ccladd( yyvsp[-3], i ); /* Keep track if this ccl is staying in * alphabetical order. */ cclsorted = cclsorted && (yyvsp[-2] > lastchar); lastchar = yyvsp[0]; } yyval = yyvsp[-3]; }break;case 59:#line 717 "./parse.y"{ if ( caseins && yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' ) yyvsp[0] = clower( yyvsp[0] ); ccladd( yyvsp[-1], yyvsp[0] ); cclsorted = cclsorted && (yyvsp[0] > lastchar); lastchar = yyvsp[0]; yyval = yyvsp[-1]; }break;case 60:#line 728 "./parse.y"{ /* Too hard to properly maintain cclsorted. */ cclsorted = false; yyval = yyvsp[-1]; }break;case 61:#line 735 "./parse.y"{ cclsorted = true; lastchar = 0; currccl = yyval = cclinit(); }break;case 62:#line 742 "./parse.y"{ CCL_EXPR(isalnum) }break;case 63:#line 743 "./parse.y"{ CCL_EXPR(isalpha) }break;case 64:#line 744 "./parse.y"{ CCL_EXPR(IS_BLANK) }break;case 65:#line 745 "./parse.y"{ CCL_EXPR(iscntrl) }break;case 66:#line 746 "./parse.y"{ CCL_EXPR(isdigit) }break;case 67:#line 747 "./parse.y"{ CCL_EXPR(isgraph) }break;case 68:#line 748 "./parse.y"{ CCL_EXPR(islower) }break;case 69:#line 749 "./parse.y"{ CCL_EXPR(isprint) }break;case 70:#line 750 "./parse.y"{ CCL_EXPR(ispunct) }break;case 71:#line 751 "./parse.y"{ CCL_EXPR(isspace) }break;case 72:#line 752 "./parse.y"{ if ( caseins ) CCL_EXPR(islower) else CCL_EXPR(isupper) }break;case 73:#line 758 "./parse.y"{ CCL_EXPR(isxdigit) }break;case 74:#line 762 "./parse.y"{ if ( caseins && yyvsp[0] >= 'A' && yyvsp[0] <= 'Z' ) yyvsp[0] = clower( yyvsp[0] ); ++rulelen; yyval = link_machines( yyvsp[-1], mkstate( yyvsp[0] ) ); }break;case 75:#line 772 "./parse.y"{ yyval = mkstate( SYM_EPSILON ); }break;#line 1397 "y.tab.c" } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) {#if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state 0 to\ state %d\n", YYPREFIX, YYFINAL);#endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; 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("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, YYFINAL, yychar, yys); }#endif } if (yychar == 0) goto yyaccept; goto yyloop; } if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym];#if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state %d \to state %d\n", YYPREFIX, *yyssp, yystate);#endif if (yyssp >= yyss + yystacksize - 1) { goto yyoverflow; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop;yyoverflow: yyerror("yacc stack overflow");yyabort: return (1);yyaccept: return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -