1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#**************************************************************************
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#   Copyright (C) 2002-2005 International Business Machines Corporation   *
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#   and others. All rights reserved.                                      *
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#**************************************************************************
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#  rbbicst   Compile the RBBI rule paser state table data into initialized C data.
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#            Usage:
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#                   cd icu/source/common
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#                   perl rbbicst.pl    < rbbirpt.txt > rbbirpt.h
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#                   perl rbbicst.pl -j < rbbirpt.txt > RBBIRuleParseTable.java
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#             The output file, rbbrpt.h, is included by some of the .cpp rbbi
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#             implementation files.   This perl script is NOT run as part
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#             of a normal ICU build.  It is run by hand when needed, and the
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#             rbbirpt.h generated file is put back into cvs.
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#             See rbbirpt.txt for a description of the input format for this script.
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruif ($ARGV[0] eq "-j") {
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    $javaOutput = 1;
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    shift @ARGV;
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru$num_states = 1;     # Always the state number for the line being compiled.
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru$line_num  = 0;      # The line number in the input file.
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru$states{"pop"} = 255;    # Add the "pop"  to the list of defined state names.
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         # This prevents any state from being labelled with "pop",
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                         #  and resolves references to "pop" in the next state field.
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruline_loop: while (<>) {
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    chomp();
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    $line = $_;
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    @fields = split();
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    $line_num++;
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # Remove # comments, which are any fields beginning with a #, plus all
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #  that follow on the line.
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for ($i=0; $i<@fields; $i++) {
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($fields[$i] =~ /^#/) {
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            @fields = @fields[0 .. $i-1];
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            last;
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # ignore blank lines, and those with no fields left after stripping comments..
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (@fields == 0) {
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        next;
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # State Label:  handling.
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #    Does the first token end with a ":"?  If so, it's the name  of a state.
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #    Put in a hash, together with the current state number,
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #        so that we can later look up the number from the name.
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (@fields[0] =~ /.*:$/) {
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $state_name = @fields[0];
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $state_name =~ s/://;        # strip off the colon from the state name.
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($states{$state_name} != 0) {
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "  rbbicst: at line $line-num duplicate definition of state $state_name\n";
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $states{$state_name} = $num_states;
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $stateNames[$num_states] = $state_name;
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # if the label was the only thing on this line, go on to the next line,
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # otherwise assume that a state definition is on the same line and fall through.
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if (@fields == 1) {
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            next line_loop;
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        shift @fields;                       # shift off label field in preparation
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                             #  for handling the rest of the line.
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # State Transition line.
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #   syntax is this,
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #       character   [n]  target-state  [^push-state]  [function-name]
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #   where
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #      [something]   is an optional something
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #      character     is either a single quoted character e.g. '['
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #                       or a name of a character class, e.g. white_space
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    $state_line_num[$num_states] = $line_num;   # remember line number with each state
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                                                #  so we can make better error messages later.
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # First field, character class or literal character for this transition.
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ($fields[0] =~ /^'.'$/) {
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # We've got a quoted literal character.
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $state_literal_chars[$num_states] = $fields[0];
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $state_literal_chars[$num_states] =~ s/'//g;
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    } else {
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # We've got the name of a character class.
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $state_char_class[$num_states] = $fields[0];
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($fields[0] =~ /[\W]/) {
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "  rbbicsts:  at line $line_num, bad character literal or character class name.\n";
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "     scanning $fields[0]\n";
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            exit(-1);
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    shift @fields;
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # do the 'n' flag
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    $state_flag[$num_states] = $javaOutput? "false" : "FALSE";
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ($fields[0] eq "n") {
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $state_flag[$num_states] = $javaOutput? "true": "TRUE";
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        shift @fields;
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # do the destination state.
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    $state_dest_state[$num_states] = $fields[0];
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ($fields[0] eq "") {
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print "  rbbicsts:  at line $line_num, destination state missing.\n";
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        exit(-1);
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    shift @fields;
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # do the push state, if present.
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ($fields[0] =~ /^\^/) {
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $fields[0] =~ s/^\^//;
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $state_push_state[$num_states] = $fields[0];
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($fields[0] eq "" ) {
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "  rbbicsts:  at line $line_num, expected state after ^ (no spaces).\n";
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            exit(-1);
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        shift @fields;
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # Lastly, do the optional action name.
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ($fields[0] ne "") {
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $state_func_name[$num_states] = $fields[0];
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        shift @fields;
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #  There should be no fields left on the line at this point.
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (@fields > 0) {
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       print "  rbbicsts:  at line $line_num, unexpected extra stuff on input line.\n";
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       print "     scanning $fields[0]\n";
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   }
154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   $num_states++;
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# We've read in the whole file, now go back and output the
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#   C source code for the state transition table.
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# We read all states first, before writing anything,  so that the state numbers
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# for the destination states are all available to be written.
163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Make hashes for the names of the character classes and
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#      for the names of the actions that appeared.
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querufor ($state=1; $state < $num_states; $state++) {
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ($state_char_class[$state] ne "") {
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($charClasses{$state_char_class[$state]} == 0) {
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            $charClasses{$state_char_class[$state]} = 1;
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ($state_func_name[$state] eq "") {
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $state_func_name[$state] = "doNOP";
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ($actions{$state_action_name[$state]} == 0) {
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $actions{$state_func_name[$state]} = 1;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Check that all of the destination states have been defined
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru$states{"exit"} = 0;              # Predefined state name, terminates state machine.
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querufor ($state=1; $state<$num_states; $state++) {
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   if ($states{$state_dest_state[$state]} == 0 && $state_dest_state[$state] ne "exit") {
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       print "Error at line $state_line_num[$state]: target state \"$state_dest_state[$state]\" is not defined.\n";
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       $errors++;
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   }
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   if ($state_push_state[$state] ne "" && $states{$state_push_state[$state]} == 0) {
194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       print "Error at line $state_line_num[$state]: target state \"$state_push_state[$state]\" is not defined.\n";
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       $errors++;
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru   }
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querudie if ($errors>0);
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru# Assign numbers to each of the character classes classes  used.
203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#   Sets are numbered from 128 - 250
204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#   The values 0-127 in the state table are used for matching
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#     individual ASCII characters (the only thing that can appear in the rules.)
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#   The "set" names appearing in the code below (default, etc.)  need special
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#     handling because they do not correspond to a normal set of characters,
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#     but trigger special handling by code in the state machine.
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru$i = 128;
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruforeach $setName (sort keys %charClasses) {
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if ($setName eq "default") {
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $charClasses{$setName} = 255;}
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    elsif ($setName eq "escaped") {
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $charClasses{$setName} = 254;}
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    elsif ($setName eq "escapedP") {
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $charClasses{$setName} = 253;}
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    elsif ($setName eq "eof") {
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $charClasses{$setName} = 252;}
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    else {
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # Normal (single) character class.  Number them.
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $charClasses{$setName} = $i;
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $i++;
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querumy ($sec, $min, $hour, , $day, $mon, $year, $wday, $yday, $isdst) = localtime;
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru$year += 1900;
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruif ($javaOutput) {
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "/*\n";
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " *******************************************************************************\n";
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " * Copyright (C) 2003-$year,\n";
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " * International Business Machines Corporation and others. All Rights Reserved.\n";
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " *******************************************************************************\n";
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " */\n";
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " \n";
239ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "package com.ibm.icu.text;\n";
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " \n";
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "/**\n";
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " * Generated Java File.  Do not edit by hand.\n";
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " * This file contains the state table for the ICU Rule Based Break Iterator\n";
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " * rule parser.\n";
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " * It is generated by the Perl script \"rbbicst.pl\" from\n";
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " * the rule parser state definitions file \"rbbirpt.txt\".\n";
247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " * \@internal \n";
248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " *\n";
249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " */\n";
250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "class RBBIRuleParseTable\n";
252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "{\n";
253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     #
255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # Emit the constants for the actions to be performed.
256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    $n = 1;
258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    foreach $act (sort keys %actions) {
259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print "     static final short $act = $n;\n";
260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        $n++;
261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " \n";
263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # Emit constants for char class names
266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    foreach $setName (sort keys %charClasses) {
268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru       print "     static final short kRuleSet_$setName = $charClasses{$setName};\n";
269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "\n\n";
271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "   static class RBBIRuleTableElement { \n";
274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      short      fAction; \n";
275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      short      fCharClass; \n";
276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      short      fNextState; \n";
277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      short      fPushState; \n";
278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      boolean    fNextChar;  \n";
279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      String     fStateName; \n";
280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      RBBIRuleTableElement(short a, int cc, int ns, int ps, boolean nc, String sn) {  \n";
281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      fAction = a; \n";
282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      fCharClass = (short)cc; \n";
283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      fNextState = (short)ns; \n";
284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      fPushState = (short)ps; \n";
285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      fNextChar  = nc; \n";
286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      fStateName = sn; \n";
287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "   } \n";
288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "   }; \n";
289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "  \n";
290ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
291ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
292ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "    static RBBIRuleTableElement[] gRuleParseStateTable = { \n ";
293ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "      new RBBIRuleTableElement(doNOP, 0, 0,0,  true,   null )     //  0 \n";  #output the unused state 0.
294ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for ($state=1; $state < $num_states; $state++) {
295ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print "     , new RBBIRuleTableElement($state_func_name[$state],";
296ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($state_literal_chars[$state] ne "") {
297ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            $c = $state_literal_chars[$state];
298ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print("'$c', ");
299ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }else {
300ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print " $charClasses{$state_char_class[$state]},";
301ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
302ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print " $states{$state_dest_state[$state]},";
303ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
304ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # The push-state field is optional.  If omitted, fill field with a zero, which flags
305ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        #   the state machine that there is no push state.
306ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($state_push_state[$state] eq "") {
307ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "0, ";
308ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
309ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print " $states{$state_push_state[$state]},";
310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
311ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print " $state_flag[$state], ";
312ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
313ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # if this is the first row of the table for this state, put out the state name.
314ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($stateNames[$state] ne "") {
315ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "  \"$stateNames[$state]\") ";
316ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
317ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "  null ) ";
318ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
319ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
320ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # Put out a comment showing the number (index) of this state row,
321ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print "    //  $state ";
322ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print "\n";
323ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " };\n";
325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "}; \n";
327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruelse
330ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
331ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #  C++ Output ...
333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//---------------------------------------------------------------------------------\n";
337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//\n";
338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "// Generated Header File.  Do not edit by hand.\n";
339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//    This file contains the state table for the ICU Rule Based Break Iterator\n";
340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//    rule parser.\n";
341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//    It is generated by the Perl script \"rbbicst.pl\" from\n";
342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//    the rule parser state definitions file \"rbbirpt.txt\".\n";
343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//\n";
344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//   Copyright (C) 2002-$year International Business Machines Corporation \n";
345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//   and others. All rights reserved.  \n";
346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//\n";
347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//---------------------------------------------------------------------------------\n";
348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "#ifndef RBBIRPT_H\n";
349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "#define RBBIRPT_H\n";
350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "\n";
351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "U_NAMESPACE_BEGIN\n";
352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # Emit the constants for indicies of Unicode Sets
355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #   Define one constant for each of the character classes encountered.
356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #   At the same time, store the index corresponding to the set name back into hash.
357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//\n";
359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "// Character classes for RBBI rule scanning.\n";
360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//\n";
361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    foreach $setName (sort keys %charClasses) {
362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($charClasses{$setName} < 250) {
363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           # Normal character class.
364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           print "    static const uint8_t kRuleSet_$setName = $charClasses{$setName};\n";
365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "\n\n";
368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # Emit the enum for the actions to be performed.
371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "enum RBBI_RuleParseAction {\n";
373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    foreach $act (sort keys %actions) {
374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print "    $act,\n";
375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "    rbbiLastAction};\n\n";
377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # Emit the struct definition for transtion table elements.
380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//-------------------------------------------------------------------------------\n";
382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//\n";
383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//  RBBIRuleTableEl    represents the structure of a row in the transition table\n";
384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//                     for the rule parser state machine.\n";
385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "//-------------------------------------------------------------------------------\n";
386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "struct RBBIRuleTableEl {\n";
387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "    RBBI_RuleParseAction          fAction;\n";
388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "    uint8_t                       fCharClass;       // 0-127:    an individual ASCII character\n";
389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "                                                    // 128-255:  character class index\n";
390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "    uint8_t                       fNextState;       // 0-250:    normal next-stat numbers\n";
391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "                                                    // 255:      pop next-state from stack.\n";
392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "    uint8_t                       fPushState;\n";
393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "    UBool                         fNextChar;\n";
394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "};\n\n";
395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # emit the state transition table
398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "static const struct RBBIRuleTableEl gRuleParseStateTable[] = {\n";
400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "    {doNOP, 0, 0, 0, TRUE}\n";    # State 0 is a dummy.  Real states start with index = 1.
401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for ($state=1; $state < $num_states; $state++) {
402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print "    , {$state_func_name[$state],";
403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($state_literal_chars[$state] ne "") {
404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            $c = $state_literal_chars[$state];
405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            printf(" %d /* $c */,", ord($c));   #  use numeric value, so EBCDIC machines are ok.
406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }else {
407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print " $charClasses{$state_char_class[$state]},";
408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print " $states{$state_dest_state[$state]},";
410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # The push-state field is optional.  If omitted, fill field with a zero, which flags
412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        #   the state machine that there is no push state.
413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($state_push_state[$state] eq "") {
414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "0, ";
415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print " $states{$state_push_state[$state]},";
417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print " $state_flag[$state]} ";
419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        # Put out a C++ comment showing the number (index) of this state row,
421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        #   and, if this is the first row of the table for this state, the state name.
422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print "    //  $state ";
423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($stateNames[$state] ne "") {
424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "     $stateNames[$state]";
425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        print "\n";
427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    };
428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print " };\n";
429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    # emit a mapping array from state numbers to state names.
433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #    This array is used for producing debugging output from the rule parser.
435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    #
436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "#ifdef RBBI_DEBUG\n";
437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "static const char * const RBBIRuleStateNames[] = {";
438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for ($state=0; $state<$num_states; $state++) {
439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if ($stateNames[$state] ne "") {
440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "     \"$stateNames[$state]\",\n";
441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        } else {
442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            print "    0,\n";
443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "    0};\n";
446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "#endif\n\n";
447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "U_NAMESPACE_END\n";
449ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    print "#endif\n";
450ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
451ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
452ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
453ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
454