18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* nfa - NFA construction routines */ 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*- 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (c) 1990 The Regents of the University of California. 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * All rights reserved. 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This code is derived from software contributed to Berkeley by 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Vern Paxson. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The United States Government has rights in this work pursuant 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * to contract no. DE-AC03-76SF00098 between the United States 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Department of Energy and the University of California. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms with or without 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification are permitted provided that: (1) source distributions retain 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * this entire copyright notice and comment, and (2) distributions including 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * binaries display the following acknowledgement: ``This product includes 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * software developed by the University of California, Berkeley and its 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * contributors'' in the documentation or other materials provided with the 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * distribution and in all advertising materials mentioning features or use 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * of this software. Neither the name of the University nor the names of 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived from 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * this software without specific prior written permission. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* $Header: /home/daffy/u0/vern/flex/RCS/nfa.c,v 2.17 95/03/04 16:11:42 vern Exp $ */ 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "flexdef.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* declare functions that have forward references */ 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint dupmachine PROTO((int)); 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid mkxtion PROTO((int, int)); 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* add_accept - add an accepting state to a machine 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * accepting_number becomes mach's accepting number. 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid add_accept( mach, accepting_number ) 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach, accepting_number; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* Hang the accepting number off an epsilon state. if it is associated 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * with a state that has a non-epsilon out-transition, then the state 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * will accept BEFORE it makes that transition, i.e., one character 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * too soon. 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( transchar[finalst[mach]] == SYM_EPSILON ) 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project accptnum[finalst[mach]] = accepting_number; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int astate = mkstate( SYM_EPSILON ); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project accptnum[astate] = accepting_number; 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (void) link_machines( mach, astate ); 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* copysingl - make a given number of copies of a singleton machine 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * newsng = copysingl( singl, num ); 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * newsng - a new singleton composed of num copies of singl 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * singl - a singleton machine 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * num - the number of copies of singl to be present in newsng 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint copysingl( singl, num ) 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint singl, num; 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int copy, i; 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project copy = mkstate( SYM_EPSILON ); 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( i = 1; i <= num; ++i ) 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project copy = link_machines( copy, dupmachine( singl ) ); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return copy; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* dumpnfa - debugging routine to write out an nfa */ 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid dumpnfa( state1 ) 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint state1; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int sym, tsp1, tsp2, anum, ns; 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf( stderr, 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _( "\n\n********** beginning dump of nfa with start state %d\n" ), 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project state1 ); 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* We probably should loop starting at firstst[state1] and going to 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * lastst[state1], but they're not maintained properly when we "or" 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * all of the rules together. So we use our knowledge that the machine 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * starts at state 1 and ends at lastnfa. 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* for ( ns = firstst[state1]; ns <= lastst[state1]; ++ns ) */ 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( ns = 1; ns <= lastnfa; ++ns ) 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf( stderr, _( "state # %4d\t" ), ns ); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sym = transchar[ns]; 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tsp1 = trans1[ns]; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tsp2 = trans2[ns]; 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project anum = accptnum[ns]; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf( stderr, "%3d: %4d, %4d", sym, tsp1, tsp2 ); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( anum != NIL ) 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf( stderr, " [%d]", anum ); 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf( stderr, "\n" ); 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf( stderr, _( "********** end of dump\n" ) ); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* dupmachine - make a duplicate of a given machine 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * copy = dupmachine( mach ); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * copy - holds duplicate of mach 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * mach - machine to be duplicated 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note that the copy of mach is NOT an exact duplicate; rather, all the 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * transition states values are adjusted so that the copy is self-contained, 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * as the original should have been. 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * also note that the original MUST be contiguous, with its low and high 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * states accessible by the arrays firstst and lastst 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint dupmachine( mach ) 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int i, init, state_offset; 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int state = 0; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int last = lastst[mach]; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( i = firstst[mach]; i <= last; ++i ) 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project state = mkstate( transchar[i] ); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( trans1[i] != NO_TRANSITION ) 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( finalst[state], trans1[i] + state - i ); 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( transchar[i] == SYM_EPSILON && 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans2[i] != NO_TRANSITION ) 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( finalst[state], 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans2[i] + state - i ); 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project accptnum[state] = accptnum[i]; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( state == 0 ) 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project flexfatal( _( "empty machine in dupmachine()" ) ); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project state_offset = state - i + 1; 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project init = mach + state_offset; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project firstst[init] = firstst[mach] + state_offset; 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project finalst[init] = finalst[mach] + state_offset; 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lastst[init] = lastst[mach] + state_offset; 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return init; 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* finish_rule - finish up the processing for a rule 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * An accepting number is added to the given machine. If variable_trail_rule 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * is true then the rule has trailing context and both the head and trail 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are variable size. Otherwise if headcnt or trailcnt is non-zero then 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the machine recognizes a pattern with trailing context and headcnt is 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the number of characters in the matched part of the pattern, or zero 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * if the matched part has variable length. trailcnt is the number of 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * trailing context characters in the pattern, or zero if the trailing 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * context has variable length. 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid finish_rule( mach, variable_trail_rule, headcnt, trailcnt ) 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach, variable_trail_rule, headcnt, trailcnt; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char action_text[MAXLINE]; 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project add_accept( mach, num_rules ); 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* We did this in new_rule(), but it often gets the wrong 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * number because we do it before we start parsing the current rule. 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rule_linenum[num_rules] = linenum; 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* If this is a continued action, then the line-number has already 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * been updated, giving us the wrong number. 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( continued_action ) 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project --rule_linenum[num_rules]; 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sprintf( action_text, "case %d:\n", num_rules ); 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project add_action( action_text ); 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( variable_trail_rule ) 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rule_type[num_rules] = RULE_VARIABLE; 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( performance_report > 0 ) 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf( stderr, 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _( "Variable trailing context rule at line %d\n" ), 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rule_linenum[num_rules] ); 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project variable_trailing_context_rules = true; 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rule_type[num_rules] = RULE_NORMAL; 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( headcnt > 0 || trailcnt > 0 ) 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* Do trailing context magic to not match the trailing 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * characters. 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char *scanner_cp = "yy_c_buf_p = yy_cp"; 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char *scanner_bp = "yy_bp"; 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project add_action( 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "*yy_cp = yy_hold_char; /* undo effects of setting up yytext */\n" ); 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( headcnt > 0 ) 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sprintf( action_text, "%s = %s + %d;\n", 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project scanner_cp, scanner_bp, headcnt ); 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project add_action( action_text ); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project sprintf( action_text, "%s -= %d;\n", 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project scanner_cp, trailcnt ); 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project add_action( action_text ); 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project add_action( 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "YY_DO_BEFORE_ACTION; /* set up yytext again */\n" ); 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* Okay, in the action code at this point yytext and yyleng have 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * their proper final values for this rule, so here's the point 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * to do any user action. But don't do it for continued actions, 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * as that'll result in multiple YY_RULE_SETUP's. 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ! continued_action ) 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project add_action( "YY_RULE_SETUP\n" ); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project line_directive_out( (FILE *) 0, 1 ); 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* link_machines - connect two machines together 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new = link_machines( first, last ); 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new - a machine constructed by connecting first to last 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * first - the machine whose successor is to be last 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * last - the machine whose predecessor is to be first 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note: this routine concatenates the machine first with the machine 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * last to produce a machine new which will pattern-match first first 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * and then last, and will fail if either of the sub-patterns fails. 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * FIRST is set to new by the operation. last is unmolested. 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint link_machines( first, last ) 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint first, last; 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( first == NIL ) 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return last; 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if ( last == NIL ) 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return first; 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( finalst[first], last ); 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project finalst[first] = finalst[last]; 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lastst[first] = MAX( lastst[first], lastst[last] ); 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project firstst[first] = MIN( firstst[first], firstst[last] ); 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return first; 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mark_beginning_as_normal - mark each "beginning" state in a machine 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * as being a "normal" (i.e., not trailing context- 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * associated) states 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * The "beginning" states are the epsilon closure of the first state 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid mark_beginning_as_normal( mach ) 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectregister int mach; 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project switch ( state_type[mach] ) 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case STATE_NORMAL: 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* Oh, we've already visited here. */ 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project case STATE_TRAILING_CONTEXT: 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project state_type[mach] = STATE_NORMAL; 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( transchar[mach] == SYM_EPSILON ) 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( trans1[mach] != NO_TRANSITION ) 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mark_beginning_as_normal( 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans1[mach] ); 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( trans2[mach] != NO_TRANSITION ) 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mark_beginning_as_normal( 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans2[mach] ); 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project default: 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project flexerror( 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _( "bad state type in mark_beginning_as_normal()" ) ); 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkbranch - make a machine that branches to two machines 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * branch = mkbranch( first, second ); 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * branch - a machine which matches either first's pattern or second's 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * first, second - machines whose patterns are to be or'ed (the | operator) 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Note that first and second are NEITHER destroyed by the operation. Also, 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the resulting machine CANNOT be used with any other "mk" operation except 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * more mkbranch's. Compare with mkor() 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkbranch( first, second ) 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint first, second; 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int eps; 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( first == NO_TRANSITION ) 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return second; 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if ( second == NO_TRANSITION ) 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return first; 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eps = mkstate( SYM_EPSILON ); 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( eps, first ); 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( eps, second ); 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return eps; 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkclos - convert a machine into a closure 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new = mkclos( state ); 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new - a new state which matches the closure of "state" 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkclos( state ) 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint state; 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mkopt( mkposcl( state ) ); 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkopt - make a machine optional 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new = mkopt( mach ); 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new - a machine which optionally matches whatever mach matched 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * mach - the machine to make optional 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notes: 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. mach must be the last machine created 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. mach is destroyed by the call 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkopt( mach ) 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach; 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int eps; 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ! SUPER_FREE_EPSILON(finalst[mach]) ) 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eps = mkstate( SYM_EPSILON ); 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mach = link_machines( mach, eps ); 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* Can't skimp on the following if FREE_EPSILON(mach) is true because 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * some state interior to "mach" might point back to the beginning 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * for a closure. 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eps = mkstate( SYM_EPSILON ); 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mach = link_machines( eps, mach ); 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( mach, finalst[mach] ); 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mach; 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkor - make a machine that matches either one of two machines 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new = mkor( first, second ); 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new - a machine which matches either first's pattern or second's 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * first, second - machines whose patterns are to be or'ed (the | operator) 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note that first and second are both destroyed by the operation 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the code is rather convoluted because an attempt is made to minimize 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the number of epsilon states needed 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkor( first, second ) 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint first, second; 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int eps, orend; 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( first == NIL ) 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return second; 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if ( second == NIL ) 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return first; 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* See comment in mkopt() about why we can't use the first 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * state of "first" or "second" if they satisfy "FREE_EPSILON". 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eps = mkstate( SYM_EPSILON ); 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project first = link_machines( eps, first ); 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( first, second ); 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( SUPER_FREE_EPSILON(finalst[first]) && 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project accptnum[finalst[first]] == NIL ) 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project orend = finalst[first]; 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( finalst[second], orend ); 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if ( SUPER_FREE_EPSILON(finalst[second]) && 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project accptnum[finalst[second]] == NIL ) 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project orend = finalst[second]; 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( finalst[first], orend ); 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eps = mkstate( SYM_EPSILON ); 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project first = link_machines( first, eps ); 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project orend = finalst[first]; 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( finalst[second], orend ); 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project finalst[first] = orend; 5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return first; 5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkposcl - convert a machine into a positive closure 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new = mkposcl( state ); 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new - a machine matching the positive closure of "state" 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkposcl( state ) 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint state; 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int eps; 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( SUPER_FREE_EPSILON(finalst[state]) ) 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( finalst[state], state ); 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return state; 5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project eps = mkstate( SYM_EPSILON ); 5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkxtion( eps, state ); 5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return link_machines( state, eps ); 5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkrep - make a replicated machine 5358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 5368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 5378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new = mkrep( mach, lb, ub ); 5388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 5398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * new - a machine that matches whatever "mach" matched from "lb" 5408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * number of times to "ub" number of times 5418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 5428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note 5438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * if "ub" is INFINITY then "new" matches "lb" or more occurrences of "mach" 5448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 5458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkrep( mach, lb, ub ) 5478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mach, lb, ub; 5488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int base_mach, tail, copy, i; 5508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project base_mach = copysingl( mach, lb - 1 ); 5528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ub == INFINITY ) 5548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project copy = dupmachine( mach ); 5568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mach = link_machines( mach, 5578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project link_machines( base_mach, mkclos( copy ) ) ); 5588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 5618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tail = mkstate( SYM_EPSILON ); 5638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for ( i = lb; i < ub; ++i ) 5658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project copy = dupmachine( mach ); 5678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project tail = mkopt( link_machines( copy, tail ) ); 5688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mach = link_machines( mach, link_machines( base_mach, tail ) ); 5718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mach; 5748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 5758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkstate - create a state with a transition on a given symbol 5788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 5798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 5808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 5818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * state = mkstate( sym ); 5828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 5838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * state - a new state matching sym 5848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * sym - the symbol the new state is to have an out-transition on 5858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 5868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * note that this routine makes new states in ascending order through the 5878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * state array (and increments LASTNFA accordingly). The routine DUPMACHINE 5888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * relies on machines being made in ascending order and that they are 5898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTIGUOUS. Change it and you will have to rewrite DUPMACHINE (kludge 5908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * that it admittedly is) 5918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 5928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint mkstate( sym ) 5948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint sym; 5958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ++lastnfa >= current_mns ) 5978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 5988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( (current_mns += MNS_INCREMENT) >= MAXIMUM_MNS ) 5998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lerrif( 6008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _( "input rules are too complicated (>= %d NFA states)" ), 6018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project current_mns ); 6028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ++num_reallocs; 6048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project firstst = reallocate_integer_array( firstst, current_mns ); 6068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lastst = reallocate_integer_array( lastst, current_mns ); 6078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project finalst = reallocate_integer_array( finalst, current_mns ); 6088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project transchar = reallocate_integer_array( transchar, current_mns ); 6098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans1 = reallocate_integer_array( trans1, current_mns ); 6108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans2 = reallocate_integer_array( trans2, current_mns ); 6118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project accptnum = reallocate_integer_array( accptnum, current_mns ); 6128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assoc_rule = 6138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reallocate_integer_array( assoc_rule, current_mns ); 6148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project state_type = 6158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project reallocate_integer_array( state_type, current_mns ); 6168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project firstst[lastnfa] = lastnfa; 6198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project finalst[lastnfa] = lastnfa; 6208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lastst[lastnfa] = lastnfa; 6218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project transchar[lastnfa] = sym; 6228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans1[lastnfa] = NO_TRANSITION; 6238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans2[lastnfa] = NO_TRANSITION; 6248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project accptnum[lastnfa] = NIL; 6258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project assoc_rule[lastnfa] = num_rules; 6268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project state_type[lastnfa] = current_state_type; 6278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* Fix up equivalence classes base on this transition. Note that any 6298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * character which has its own transition gets its own equivalence 6308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * class. Thus only characters which are only in character classes 6318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * have a chance at being in the same equivalence class. E.g. "a|b" 6328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * puts 'a' and 'b' into two different equivalence classes. "[ab]" 6338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * puts them in the same equivalence class (barring other differences 6348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * elsewhere in the input). 6358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 6368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( sym < 0 ) 6388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* We don't have to update the equivalence classes since 6408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * that was already done when the ccl was created for the 6418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * first time. 6428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 6438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if ( sym == SYM_EPSILON ) 6468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ++numeps; 6478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project check_char( sym ); 6518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( useecs ) 6538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project /* Map NUL's to csize. */ 6548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project mkechar( sym ? sym : csize, nextecm, ecgroup ); 6558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return lastnfa; 6588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* mkxtion - make a transition from one state to another 6628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 6638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * synopsis 6648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 6658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * mkxtion( statefrom, stateto ); 6668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 6678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * statefrom - the state from which the transition is to be made 6688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * stateto - the state to which the transition is to be made 6698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 6708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid mkxtion( statefrom, stateto ) 6728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint statefrom, stateto; 6738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( trans1[statefrom] == NO_TRANSITION ) 6758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans1[statefrom] = stateto; 6768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if ( (transchar[statefrom] != SYM_EPSILON) || 6788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (trans2[statefrom] != NO_TRANSITION) ) 6798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project flexfatal( _( "found too many transitions in mkxtion()" ) ); 6808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 6828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { /* second out-transition for an epsilon state */ 6838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ++eps2; 6848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project trans2[statefrom] = stateto; 6858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 6878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* new_rule - initialize for a new rule */ 6898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 6908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid new_rule() 6918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( ++num_rules >= current_max_rules ) 6938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 6948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ++num_reallocs; 6958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project current_max_rules += MAX_RULES_INCREMENT; 6968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rule_type = reallocate_integer_array( rule_type, 6978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project current_max_rules ); 6988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rule_linenum = reallocate_integer_array( rule_linenum, 6998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project current_max_rules ); 7008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rule_useful = reallocate_integer_array( rule_useful, 7018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project current_max_rules ); 7028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 7038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ( num_rules > MAX_RULE ) 7058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lerrif( _( "too many rules (> %d)!" ), MAX_RULE ); 7068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rule_linenum[num_rules] = linenum; 7088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project rule_useful[num_rules] = false; 7098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 710