⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.c

📁 Minix比较全的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
				 *				 * 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 + -