[ver] 4 [sty] [files] [charset] 82 CHINESEBIG5 (Windows) [revisions] 0 [prn] Dataproducts LZR888 GDI [port] LPT1: [lang] 1 [desc] ScanGen 2 user manual (new) 809204704 12 805934068 495 12 0 0 0 0 1 [fopts] 0 1 0 0 [lnopts] 2 Body Text 1 [docopts] 5 0 [GramStyle] [ParaNum] 1 [tag] Body Text 3 2 [fnt] Times New Roman 240 0 49152 [algn] 8 2 0 0 1927 [spc] 33 283 2 113 113 2 100 [brk] 4 [line] 8 0 2 0 1 1 1 10 10 2 [spec] 0 7 0 2 1 0 2 0 0 [nfmt] 280 1 2 . , NT$ Body Text 3 0 0 [tag] Body Text 2 3 [fnt] Times New Roman 240 0 49152 [algn] 8 2 0 0 374 [spc] 33 283 2 113 113 2 100 [brk] 4 [line] 8 0 2 0 1 1 1 10 10 2 [spec] 0 6 0 2 1 0 2 0 0 [nfmt] 280 1 2 . , NT$ Body Text 2 0 0 [tag] Body Text 4 [fnt] Times New Roman 240 0 49152 [algn] 8 2 0 0 0 [spc] 33 283 2 113 113 2 100 [brk] 4 [line] 8 0 2 0 1 1 1 10 10 2 [spec] 0 5 0 2 1 0 2 0 0 [nfmt] 280 1 2 . , NT$ Body Text 3 0 0 [tag] SubTitle 2 5 [fnt] Arial 280 0 16385 [algn] 1 2 0 0 0 [spc] 33 334 2 0 0 2 100 [brk] 4 [line] 0 0 1 0 1 1 1 15 15 1 [spec] 0 4 0 1 1 0 2 0 0 [nfmt] 280 1 2 . , $ SubTitle 2 0 0 [tag] SubTitle 6 [fnt] 華康中楷體 320 0 32768 [algn] 1 2 0 0 0 [spc] 40 413 2 226 113 2 100 [brk] 4 [line] 0 0 1 0 1 1 1 15 15 1 [spec] 0 3 0 1 1 0 2 0 0 [nfmt] 280 1 2 . , $ SubTitle 0 0 [tag] Title 7 [fnt] Times New Roman 360 0 49152 [algn] 1 2 0 0 0 [spc] 33 419 2 0 170 2 115 [brk] 4 [line] 10 0 1 0 1 1 1 15 15 1 [spec] 0 2 0 1 1 0 2 0 0 [nfmt] 280 1 2 . , $ Title 0 0 [tag] Section 8 [fnt] Times New Roman 400 0 49152 [algn] 1 1 0 0 0 [spc] 33 430 2 113 113 2 100 [brk] 16 [line] 6 0 1 0 1 1 9 15 90 1 [spec] 0 1 0 1 1 0 0 0 0 [nfmt] 272 1 2 . , $ Section 0 0 [tag] figure 9 [fnt] Times New Roman 240 0 49152 [algn] 513 2 283 0 0 [spc] 33 283 2 0 0 2 100 [brk] 4 [line] 8 0 1 0 1 1 1 15 15 1 [spec] 0 0 0 1 1 0 0 0 0 [nfmt] 280 1 2 . , $ figure 1 1 540 0 [tag] Page Right 11 [fnt] 細明體 280 0 32768 [algn] 2 2 0 0 0 [spc] 1 413 2 0 0 2 115 [brk] 4 [line] 0 0 1 0 1 1 1 15 15 1 [spec] 0 0 0 1 1 0 0 0 0 [nfmt] 280 1 2 . , $ Page Right 0 0 [tag] Page Left 12 [fnt] 細明體 280 0 32768 [algn] 1 2 0 0 0 [spc] 1 413 2 0 0 2 115 [brk] 4 [line] 0 0 1 0 1 1 1 15 15 1 [spec] 0 0 0 1 1 0 0 0 0 [nfmt] 280 1 2 . , $ Page Left 0 0 [tag] eyebrow 0 [fnt] 華康中楷體 200 0 32768 [algn] 2 2 0 0 0 [spc] 17 238 2 28 0 2 115 [brk] 4 [line] 8 0 2 0 1 1 1 10 10 2 [spec] 0 0 0 2 1 0 0 0 0 [nfmt] 280 1 2 . , NT$ eyebrow 0 0 [tag] 表格文字 0 [fnt] 細明體 240 0 32768 [algn] 8 2 0 0 0 [spc] 40 413 2 0 0 2 115 [brk] 4 [line] 8 0 2 0 1 1 1 10 10 2 [spec] 0 0 0 2 1 0 0 0 0 [nfmt] 280 1 2 . , NT$ 表格文字 0 0 [frm] 9 537460928 2700 1440 9177 5040 1 2 1 1 0 0 0 0 0 0 0 16777215 3 0 1275 6477 1382 [frmname] Frame3 [frmlay] 5040 6477 2 144 144 2 1584 144 0 2 0 0 0 0 1 2844 9033 0 [isd] .X3 .ole 18 2 0 0 6190 62257 100 0 16 0 9623 0 17791 0 83 0 0 0 0 0 0 0 0 0 0 .ole 0 0 0 [lay] Standard 516 [rght] 16834 11907 2 1425 1440 1 1440 1455 0 1 0 1 0 2 1 1425 10452 12 1 720 1 1440 1 2160 1 2880 1 3600 1 4320 1 5040 1 5760 1 6480 1 7200 1 7920 1 8640 [hrght] [lyfrm] 1 11200 0 0 11907 1440 0 1 3 1 0 0 0 0 0 0 0 0 1 [frmlay] 1440 11907 1 1769 0 2 1440 1803 0 1 0 1 1 0 1 1769 10104 1 3 9360 [txt] > [frght] [lyfrm] 1 13248 0 15394 11907 16834 0 1 3 1 0 0 0 0 0 0 0 0 2 [frmlay] 16834 11907 1 1786 0 2 15394 1786 0 1 0 1 1 0 1 1786 10121 2 2 4680 3 9360 [txt] <+B>-<:P10,0,>- > [elay] [l1] 0 [pg] 12 21 0 42 0 0 0 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 53 275 87 512 0 0 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 63 0 0 0 0 0 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 101 0 25 0 0 1 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 133 0 0 0 0 0 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 164 0 12 0 0 1 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 176 88 82 512 0 0 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 193 0 87 512 0 1 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 233 0 86 0 0 0 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 262 0 9 0 0 1 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 311 0 13 0 0 1 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 344 0 0 1025 0 0 0 65535 65535 Standard 65535 0 0 0 0 0 0 0 0 0 65535 0 0 65535 0 0 0 0 0 [edoc] @Section@<+B><:#558,9027>SCANGEN2 Reference Manual @Title@<:#437,9027>0.Introduction <:#2556,9027>Scangen is a program written by Gary Sevitsky inspring 1979 and modified and enhanced by Robert Gray in spring 1980. Later changes were made by Charles Fischer in 1981 and 1982. Scangen accepts descriptions of tokens written as regular expressions and produ ces tables that may be used to drive a lexical analyzer. ScanGen2 is a new enhanced version of Scangen written by Jien-Tsai Chan in Spring 1995. ScanGen2 supports suffix finite automata(SFA) that was introduced by Wuu Yang. ScanGen2 reserved all functions o f Scangen. It has the capability of processing SFA and the cut("!") operator. SFA can be extended to the generalized finite lookahead finite automata(GFFA) with the cut operator. This manual is based on the original Scangen Reference Manual. @Title@<:#437,9027>1.Input Specifications <:#568,9027>The input format will be presented informally by means of annotated examples, starting with example 1. <:#284,9027>Example 1 @figure@<:R1,2,1,572,1,1998,><:#284,9027>OPTIONS @figure@<:R1,2,1,572,1,1998,><:#284,9027> tables,list @figure@<:R1,2,1,572,1,1998,><:#284,9027>CLASS @figure@<:R1,2,1,572,1,1998,><:#284,9027> letter = 'A'..'Z', 'a'..'z'; @figure@<:R1,2,1,572,1,1998,><:#284,9027> digit = '0'..'9'; @figure@<:R1,2,1,572,1,1998,><:#284,9027> blank = ' '; @figure@<:R1,2,1,572,1,3420,><:#284,9027>DEFINITION @figure@<:R1,2,1,572,1,3420,><:#284,9027> TOKEN emptyspace {0} = blank+; @figure@<:R1,2,1,572,1,3420,><:#284,9027> TOKEN identifier {1} = letter.(letter, digit)*; @figure@<:R1,2,1,572,1,3420,><:#284,9027> TOKEN number {2} = digit+; <:R><:#568,9027>The specifications to the scanner generator contain three parts: the list of options selected for this run, the class definitions and the regular expression definitions. <:#1136,9027>The options section is optional. If it appears, it is headed by the reserved word OPTIONS, followed by one or more option names (which are not reserved). The option names may appear in any order, separated by blanks or commas. A complete list of options app ears in section 3. <:#1420,9027>The class definitions specify the character classes that make up the alphabet used by the regular expressions. The character classes are sets of characters, which are defined, as in the example, by using single characters within quotes or by using ranges of characters. To specify the quote character, use ''''. An unprintable character is specified by using its decimal equivalent. For example, the line-feed character can be specified by <:#284,9027> linefeed = 10; <:#284,9027>(or whatever it is in your character set). <:#1136,9027>If a character is not mentioned in the class definitions, it will not create any scanner actions in the output table. In other words, it will be ignored. The generator puts unmentioned characters into the character class "EPSILON". Each character may be ass igned to at most one character class. <:#1704,9027>The regular expression definitions, which specify the tokens, are built using the character classes and the following operations (listed in order of decreasing precedence): positive closure ("+"), Kleene closure ("*"), cut operator("!"), concatenation (".") , and union (","). Precedences can be overridden by use of parentheses. Each token name is followed by a token number. These token numbers will appear in the output table so that the scanner will be able to return a token number upon recognition of a token. <:#284,9027>Example 2 @figure@<:R1,2,1,572,1,2569,><:#284,9027>OPTIONS @figure@<:R1,2,1,572,1,2569,><:#284,9027> List, tables @figure@<:R1,2,1,572,1,2569,><:#284,9027>CLASS @figure@<:R1,2,1,572,1,2569,><:#284,9027> E = 'E', 'e'; @figure@<:R1,2,1,572,1,2569,><:#284,9027> OtherLetter = 'A'..'D','F'..'Z','a'..'d','f'..'z'; @figure@<:R1,2,1,572,1,2569,><:#284,9027> Digit = '0'..'9'; @figure@<:R1,2,1,572,1,2569,><:#284,9027> Blank = ' '; @figure@<:R1,2,1,572,1,2569,><:#284,9027> Dot = '.'; @figure@<:R1,2,1,572,1,2569,><:#284,9027> Plus = '+'; @figure@<:R1,2,1,572,1,2569,><:#284,9027> Minus = '-'; @figure@<:R1,2,1,572,1,2569,><:#284,9027> Quote = ''''; @figure@<:R1,2,1,572,1,2569,><:#284,9027> Linefeed = 10; @figure@<:R1,2,1,572,1,2569,><:#284,9027>DEFINITION @figure@<:R1,2,1,572,1,3705,><:#284,9027> TOKEN EmptySpace {0} = (Blank, Linefeed)+; @figure@<:R1,2,1,572,1,3705,><:#284,9027> Letter = E, OtherLetter; @figure@<:R1,2,1,572,1,3705,><:#284,9027> TOKEN Identifier {1} = Letter.(Letter,Digit)* @figure@<:R1,2,1,572,1,3705,><:#284,9027> EXCEPT @figure@<:R1,2,1,572,1,3705,><:#284,9027> 'BEGIN' {4}, @figure@<:R1,2,1,572,1,3705,><:#284,9027> 'END' {5}; @figure@<:R1,2,1,572,1,3705,><:#284,9027> TOKEN IntConst {2,1} = Digit+; @figure@<:R1,2,1,572,1,3705,><:#284,9027> TOKEN RealConst {2,2} = IntConst.Dot.IntConst. @figure@<:R1,2,1,572,1,3705,><:#284,9027> (EPSILON, E.(EPSILON, Plus, Minus).IntConst); @figure@<:R1,2,1,572,1,3705,><:#284,9027> TOKEN StrConst {2,3} = Quote{TOSS}. @figure@<:R1,2,1,572,1,3705,><:#284,9027> (NOT(Quote, Linefeed),Quote{TOSS}.Quote)*. @figure@<:R1,2,1,572,1,3705,><:#284,9027> Quote{TOSS}; @figure@<:R1,2,1,572,1,3705,><:#284,9027> TOKEN RunOnString {3} = Quote{TOSS}. @figure@<:R1,2,1,572,1,3705,><:#284,9027> (NOT(Quote, Linefeed), Quote{TOSS}.Quote)*. @figure@<:R1,2,1,572,1,3705,><:#284,9027> Linefeed{TOSS}; <:R>This example illustrates more sophisticated ways in which regular expressions may be defined. The second definition, which defines "Letter", does not define a token--it defines an auxiliary regular expression that can be used in later definitions. Tokens ma y also be used in later definitions; for example, "IntConst" is used in the definition of RealConst.<:p<* >> <:#3124,9027>Another feature of the specification language is the exception list, which is used in the definition of "Identifier". The exception list is made up of strings, which are called "reserved words" and are of length 12 or less, followed by token numbers. The ex ception list will not affect the output table; it is stored separately so that the scanner can access it. In the definitions of "IntConst", "RealConst", and "StrConst", there are two token numbers following the token name: the major token number and the min or token number. The major token number can be used to define a token class with the minor token number used to specify the member of that class. If the minor token number is not specified, the generator will supply the default value "0". Token numbers must be non-negative integers and the same token number may be used for different tokens. By convention, tokens that are to be deleted (comments, spaces, etc) are assigned a major token number of "0". <:#568,9027>In the definition of "RealConst", the character class "EPSILON" is used so the output table will recognize numbers without exponents and numbers with signed or unsigned exponents. <:#1136,9027>The "NOT" operator is used in the definitions of "StrConst" and "RunOnString". This operator may only be used to complement a union of character classes. The complement is taken relative to the classes specified in the class definitions. In other words, cha racter class "EPSILON" stays out of complements. <:#1704,9027>The "TOSS" feature appears in the definitions of "StrConst" and "RunOnString". This feature is used to tell the scanner not to append a character to the token string it is building. If a character is not to be appended, put a "{TOSS}" after the name of its character class in the token definition. A "{TOSS}" may only appear after the name of a character class or after "NOT(...)". Careless use of the TOSS feature can lead to a toss/save conflict. For example, a toss/save conflict would occur if "StrConst" were defined by: @figure@<:#284,9027> Quote{TOSS} . (NOT(Quote, Linefeed), Quote.Quote{TOSS})*. Quote{TOSS} <:#1136,9027>This conflict can be seen by comparing scanner actions on the strings 'a' and 'a''b'. In the first case, the scanner is told to toss the quote character following the "a", but in the second case, this character is saved. When a toss/save conflict arises, th e generator will print an error message. <:#1988,9027>The "!"(cut) operator is used to indicate where to cut in the regular expression(means no back tracking) with the SFA option. For example, the definition of the StrConst will produce a path which is unfinite lookahead between two accepting states. Then it will cause the DFA can't translate to SFA. But we can put a cut operator to indicate that it is not nessesary to back track somewhere. When a nonaccepting state becomes a cut state, it is treated as an accepting state. The path of unfinite lookahead will be broken. The following is the definition of StrConst for the SFA. @figure@<:R1,2,1,572,1,3705,><:#284,9027>Quote{TOSS}.((NOT(Quote, Linefeed),Quote{TOSS}.Quote)*)!.Quote{TOSS}; <:R><:#1704,9027>The input specifications may be written free-format with up to 132 characters in a line. Illegal symbols are ignored and a warning message is printed. Identifiers may be any length, but only the first 12 are examined. Case in identifiers is ignored (i.e., A BC and abc are the same identifier). Case is also ignored in the reserved words CLASS, DEFINITION, EPSILON, EXCEPT, NOT, TOKEN, OPTION, and TOSS. When a syntax error is encountered, the generator will print an error message and terminate. <:#284,9027> @SubTitle 2@<:#332,9027>How the Scanner Generator Works <:#1136,9027>The scanner generator uses the algorithms in Chapter 3 of Principles of Compiler Design by Aho and Ullman. A recursive descent parser is used to compile the regular expression definitions into binary trees. Each tree is then transformed into a nondeterminis tic finite automaton (nfa). <:#1420,9027>These nfa's are merged into one nfa. The subset construction is performed on this nfa to obtain an equivalent deterministic finite automaton. Finally, the minimization algorithm is applied to this dfa to obtain a minimal dfa. If you select the SFA option, t he minimal dfa will be checked whether it is a GFFA. If so, it will be translated to SFA. The scanner generator outputs the transition table of this SFA or minimal dfa, depending on the options. <:#284,9027>The scanner generator accepts the following tokens : @figure@<:#284,9027>id = letter.(letter,digit)* ; constant = digit+ ; @figure@<:#284,9027>string = '.(not('),'')*.' ; character = string of length 1 @figure@<:#284,9027>'+', '.', ';', ',', '*', '!' '(', ')', '=', '..', @figure@<:#568,9027>and the reserved words including except, toss, not, class, token, definition, options, and symbols left brace (lb) and right brace (rb). @figure@<:#284,9027> @figure@<:#284,9027>The parser is recursive descent, and accepts the following grammar: @figure@<:#284,9027>(lb is the left brace; rb is the right brace) @figure@<:#284,9027> @figure@<:R1,1,1,2569,><:#284,9027>input_file ::= options_list class class_list ';' @figure@<:R1,1,1,2569,><:#284,9027> definition def_list ';' @figure@<:R1,1,1,2569,><:#284,9027>options_list ::= options option_ids @figure@<:R1,1,1,2569,><:#284,9027> ::= @figure@<:R1,1,1,2569,><:#284,9027>option_ids ::= id options_tail @figure@<:R1,1,1,2569,><:#284,9027>options_tail ::= ',' options_ids @figure@<:R1,1,1,2569,><:#284,9027> ::= options_ids @figure@<:R1,1,1,2569,><:#284,9027> ::= epsilon @figure@<:R1,1,1,2569,><:#284,9027> class_list ::= class_list ';' class_def @figure@<:R1,1,1,2569,><:#284,9027> ::= class_def @figure@<:R1,1,1,2569,><:#284,9027> class_def ::= id '=' element_list @figure@<:R1,1,1,2569,><:#284,9027> element_list ::= element_list ',' element @figure@<:R1,1,1,2569,><:#284,9027> ::= element @figure@<:R1,1,1,2569,><:#284,9027> element ::= element_type @figure@<:R1,1,1,2569,><:#284,9027> ::= element_type '..' element_type @figure@<:R1,1,1,2569,><:#284,9027> element_type ::= character @figure@<:R1,1,1,2569,><:#284,9027> ::= constant @figure@<:R1,1,1,2569,><:#284,9027> def_list ::= aux_reg_expr @figure@<:R1,1,1,2569,><:#284,9027> ::= token_reg_expr @figure@<:R1,1,1,2569,><:#284,9027> aux_reg_expr ::= id '=' reg_expr @figure@<:R1,1,1,2569,><:#284,9027> token_reg_expr ::= token id token_number '=' reg_expr exception_part @figure@<:R1,1,1,2569,><:#284,9027> token_number ::= lb constant rb @figure@<:R1,1,1,2569,><:#284,9027> ::= lb constant ',' constant rb @figure@<:R1,1,1,2569,><:#284,9027> reg_expr ::= reg_expr ',' term @figure@<:R1,1,1,2569,><:#284,9027> ::= term @figure@<:R1,1,1,2569,><:#284,9027> term ::= term '.' factor @figure@<:R1,1,1,2569,><:#284,9027> ::= factor @figure@<:R1,1,1,2569,><:#284,9027> factor ::= primary '*' @figure@<:R1,1,1,2569,><:#284,9027> ::= primary '+' @figure@<:R1,1,1,2569,><:#284,9027> ::= primary '!' @figure@<:R1,1,1,2569,><:#284,9027> ::= primary @figure@<:R1,1,1,2569,><:#284,9027> primary ::= '(' reg_expr ')' @figure@<:R1,1,1,2569,><:#284,9027> ::= id toss_spec @figure@<:R1,1,1,2569,><:#284,9027> ::= not id toss_spec @figure@<:R1,1,1,2569,><:#284,9027> ::= not '(' id_list ')' toss_spec @figure@<:R1,1,1,2569,><:#284,9027> ::= epsilon @figure@<:R1,1,1,2569,><:#284,9027> id_list ::= id_list ',' id @figure@<:R1,1,1,2569,><:#284,9027> ::= id @figure@<:R1,1,1,2569,><:#284,9027> toss_spec ::= lb 'toss' rb @figure@<:R1,1,1,2569,><:#284,9027> ::= @figure@<:R1,1,1,2569,><:#284,9027> exception_part ::= except exception_list @figure@<:R1,1,1,2569,><:#284,9027> ::= @figure@<:R1,1,1,2569,><:#284,9027> exception_list ::= exception_list , exception @figure@<:R1,1,1,2569,><:#284,9027> ::= exception @figure@<:R1,1,1,2569,><:#284,9027> exception ::= string token_number <:R1,1,1,2569,><:#284,9027> @Title@<:R><:#437,9027>2.The Output <:#568,9027>When the "tables" option is used, the external file "dfa.tbl" or "sfa.tbl" will be produced, depending on which option you selected. This file consists of the following six sections: @SubTitle 2@<:#332,9027>Section 1: Parameters for the Scanner <:#284,9027>A list of 5 integers separated by spaces: <:R1,1,1,1998,><:#284,9027>NumStates -- Number of states of the minimal dfa <:R1,1,1,1998,><:#284,9027>StartState -- Initial state of the minimal dfa <:R1,1,1,1998,><:#568,9027>NumClasses -- Number of character classes defined by the user. Does not include "EPSILON". <:R1,1,1,1998,><:#284,9027>NumResWords -- Total number of reserved words defined in "EXCEPT" clauses <:R1,1,1,1998,><:#284,9027>NumLists -- Number of token names which have exception lists @SubTitle 2@<:R><:#332,9027>Section 2: Character Class Mapping <:#1704,9027>A list of N integers separated by spaces that specify the character class that each character has been assigned to. N is determined by the character set that the ScanGen2 is configured for (N=128 for ASCII; N=256 for EBCDIC). The ith element of the list is the class number assigned to the character whose value ("ord") is i. The character class "EPSILON" is numbered 0, so characters not explicitly assigned to any class will be given a class number of 0. <:#284,9027> @SubTitle 2@<:#332,9027>Section 3: Reserved Word to Token Mapping. <:#284,9027>Contains "NumLists" records, each of the form: @figure@<:#284,9027> Major Minor FirstRSW LastRSW <:#1420,9027>where "Major" and "Minor" are the numbers of the the token class that the reserved words "FirstRSW" through "LastRSW" are exceptions from. "FirstRSW" and "LastRSW" are indices into the table of reserved words that is section 4 of this output file. Reserved word numbering starts at 1. The information in this section is important only when more than one token definition has an exception list. @SubTitle 2@<:#332,9027>Section 4: Reserved Word List <:#284,9027>Contains "NumResWords" records, each of the form: @figure@<:#284,9027>Word (columns 1-12) Major Minor <:#568,9027>where "Major" and "Minor" are the token numbers of the reserved word and are separated by spaces. @SubTitle 2@<:#664,9027>Section 5: Transition Table of the Minimal Deterministic Finite Automaton. <:#852,9027>The transition table is written as an array of "NumStates" by "NumClasses" entries. Numbering of states and classes starts at 1. The array is written in row-major order, which means that classes vary more rapidly. <:#1136,9027>The first integer of each entry indicates the type of transition: Error, MoveAppend, MoveNoAppend, HaltAppend, HaltNoAppend, and HaltReuse. Following this integer are from 0 to 2 integers, depending of the transition type, that give more information about t he transition. <:#284,9027>The transitions are of the following forms: @figure@<:R1,2,1,2166,1,4503,><:#284,9027>0 -- Error/Continuation consult the five tables to determine whether @figure@<:R1,2,1,2166,1,4503,><:#284,9027> it is an error or the automaton should jump @figure@<:R1,2,1,2166,1,4503,><:#284,9027> to a continuation state @figure@<:R1,2,1,2166,1,4503,><:#284,9027>1 NextState -- MoveAppend: move to NextState and append @figure@<:R1,2,1,2166,1,4503,><:#284,9027> the current character to the token being @figure@<:R1,2,1,2166,1,4503,><:#284,9027> assembled @figure@<:R1,2,1,2166,1,4503,><:#284,9027>2 NextState -- MoveNoAppend: move to NextState and consume @figure@<:R1,2,1,2166,1,4503,><:#284,9027> the current character, but do not append it @figure@<:R1,2,1,2166,1,4503,><:#284,9027> to the token @figure@<:R1,2,1,2166,1,4503,><:#284,9027>3 Major Minor -- HaltAppend: halt, return token numbers @figure@<:R1,2,1,2166,1,4503,><:#284,9027> Major and Minor, and append the current @figure@<:R1,2,1,2166,1,4503,><:#284,9027> character to the token @figure@<:R1,2,1,2166,1,4503,><:#284,9027>4 Major Minor -- HaltNoAppend: halt, return token numbers @figure@<:R1,2,1,2166,1,4503,><:#284,9027> Major and Minor, and consume the current @figure@<:R1,2,1,2166,1,4503,><:#284,9027> character, but do not append it to the token @figure@<:R1,2,1,2166,1,4503,><:#284,9027>5 Major Minor -- HaltReuse: halt, return token number Major @figure@<:R1,2,1,2166,1,4503,><:#284,9027> and Minor, save current character for reuse @figure@<:R1,2,1,2166,1,4503,><:#284,9027> in the next token, and do not append it to @figure@<:R1,2,1,2166,1,4503,><:#284,9027> the token @SubTitle 2@<:R><:#664,9027>Section 6: Token, Suffix length, Continuation, Action, and Output tables <:#852,9027>These five tables appear in the "SFA.TBL" file, following the transition table. The five tables are combined as an array of "NumStates" by 4 entries. Numbering of states starts at 1. The array is written in the row-major order. <:#284,9027>The are of the following forms: @figure@<:R1,4,1,1710,1,2451,1,3933,1,5016,><:#284,9027><:f240,2Times New Roman,> Token Cont. Action Output @figure@<:R1,4,1,1710,1,2451,1,3933,1,5016,><:f240,2Times New Roman,>----------------+--------+-----------------+---------------------------------------------------------- @figure@<:R1,4,1,1710,1,2451,1,3933,1,5016,><:f240,2Times New Roman,> Major Minor State State Length Amount (Major Minor Length Major Minor L....)<:f> <:R>The Token column has two value. If the state is an accepting state, these value are the major and minor number of the token associated with this state. Otherwise, these value should be zero. The integer in the Cont. column means the continuation state. The value -1 means error. Each entry of the Action column has two values, they are the last accepting state number and the length of toekn. The Output column has one or more values. The first integer means the number of token that will be outputed. The value 0 means nil. Following this integer are Amount triplet of values, which are the major and minor number and the length of the sequential outputed token. @Title@<:#437,9027>3.Miscellaneous @Body Text 2@<:#1704,9027>(1) Without using the SFA option, the scanner generator produces tables that use only one-character lookahead. The tables cannot directly handle the ".." problem of Pascal and Babbage or the ".EQ." problem of FORTRAN. (However, multi-character lookahead pro blems can be handled by saving the sequence of states visited while scanning a token and backing up to the last final state). In case the scanner needs to look ahead more than one character, the user has to specify the SFA option. @Body Text 2@<:#1704,9027>(2) If a state is the final state for more than one token class, the first token class defined in the input file is the one accepted. This can be significant if one token class subsumes another. For example, in the definitions used for Babbage(Example 2), t he definition of "REALCONST" includes integer constants. However, since the definition of "INTCONST" precedes that of "REALCONST", sequences of digits are correctly scanned as integers rather than real constants. @Body Text 2@<:#1136,9027>(3) Depending on the size and complexity of the regular expressions that are to be processed, the value of the constant "MaxSubsets" in the ScanGen2 source can be altered (it's initial setting is 64000). Decreasing MaxSubsets can significantly reduce progra m size; increasing it will allow larger and more complex definitions to be handled. @Body Text 2@(4) This user manual was adapted by Jien-Tsai Chan and edited by Wuu Yang. The original manual was written Bob Gray and edited by Marvin Solomon and Charles Fischer.<:p<* >> @Title@<:#437,9027>4.ScanGen2 Options @Body Text 3@<:R1,1,1,1713,><:#284,9027>'List' -- List input specifications on the standard output file. @Body Text 3@<:R1,1,1,1713,><:#284,9027>'Dfa' -- Print the minimal dfa that the scanner generator constructed. @Body Text 3@<:R1,1,1,1713,><:#284,9027>'Sfa' -- Print suffix dfa that the scanner generator constructed(auto optimize). @Body Text 3@<:R1,1,1,1713,><:#284,9027>'Report' -- Print a report consisting of: @Body Text 3@<:R1,1,1,1713,><:#284,9027> 1) Correspondence of character class names to character class numbers. @Body Text 3@<:R1,1,1,1713,><:#284,9027> 2) Mapping of characters to character class numbers. @Body Text 3@<:R1,1,1,1713,><:#568,9027> 3) List of reserved words and the token class numbers to which they are assigned. @Body Text 3@<:R1,1,1,1713,><:#1136,9027>'Test' -- Test the dfa using a file "testfile" as a sample input to the scanner. The scanner willlist actions upon scanning each symbol and will terminate when end-of-file is reached. It is suggested that testfile be kept short. Also, it is good to have th e output of option 'Dfa' around. @Body Text 3@<:R1,1,1,1713,><:#1136,9027>'Tables' -- Produce file "DFA.TBL" or "SFA.TBL", depending on the options. The file contains the character class mapping, reserved word lists, and the transition table. There are produce continuation, action, and output tables following the above in "SFA.T BL". @Body Text 3@<:R1,1,1,1713,><:#852,9027>'Optimize' -- Optimize tables created by ScanGen2. This option should always be used in producing tables to be used in scanning. It need not be used for debugging runs. @Body Text 3@<:R1,1,1,1713,><:#284,9027>The following options are used for debugging ScanGen2 itself. @Body Text 3@<:R1,1,1,1713,><:#568,9027>debug -- debug trace for subset construction & equivalence classes; also gives number of ndfa states and subset elements used. @Body Text 3@<:R1,1,1,1713,><:#284,9027>epsilon -- debug trace for epsilon closure in subset construction. @Body Text 3@<:R1,1,1,1713,><:#284,9027>idfa -- print intermediate (non-minimal) dfa. @Body Text 3@<:R1,1,1,1713,><:#284,9027>ndfa -- print nondeterministic finite automata. @Body Text 3@<:R1,1,1,1713,>unreachable -- list unreachable states in minimal dfa (use with optimize option).<:p<* >> @Title@<:R1,1,1,1713,><:#437,9027>5.An Example for using SFA option <:R1,1,1,1713,><:#284,9027>The input file: @figure@<:R1,1,1,1713,><:#284,9027>Options @figure@<:R1,1,1,1713,><:#284,9027>tables, optimize, sfa, ndfa, debug @figure@<:R1,1,1,1713,><:#284,9027> @figure@<:R1,1,1,1713,><:#284,9027>Class @figure@<:R1,1,1,1713,><:#284,9027>Digit = '0'..'9'; @figure@<:R1,1,1,1713,><:#284,9027>Period = '.'; @figure@<:R1,1,1,1713,><:#284,9027>Blank = ' '; @figure@<:R1,1,1,1713,><:#284,9027> @figure@<:R1,1,1,1713,><:#284,9027>Definition @figure@<:R1,2,1,1713,1,3140,><:#284,9027>Token IntLit {1} = Digit.(Digit)*; @figure@<:R1,2,1,1713,1,3140,><:#284,9027>Token RealLit {2} = IntLit.Period.IntLit; @figure@<:R1,2,1,1713,1,3140,><:#284,9027>Token DotDot {3} = Period.Period; @figure@<:R1,2,1,1713,1,3140,><:#284,9027>Token Separator {4} = Blank.Blank*; @figure@<:R1,2,1,1713,1,3140,><:#284,9027>Token SingleDot {5} = Period; <:R1,2,1,1713,1,3140,><:#284,9027>The following is the content of SFA.TBL: @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 7 6 3 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 0 0 0 0 0 0 2 0 1 1 1 1 1 1 1 1 1 1 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 0 0 0 0 0 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 1 1 1 7 5 1 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 5 5 0 1 4 5 5 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 5 4 0 5 4 0 1 3 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 5 3 0 5 3 0 5 3 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 1 5 5 2 0 5 2 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 1 1 1 2 1 3 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 1 5 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 1 0 0 6 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 5 0 0 6 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 4 0 0 6 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 3 0 0 6 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 2 0 0 6 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 0 0 0 6 0 0 0 @figure@<:R1,2,1,1713,1,3140,><:#284,9027> 0 0 1 2 5 0 0 <:R1,2,1,1713,1,3140,><:#284,9027>According the transition table, we can make out a draft of the suffix finite automata. <+B><:R1,2,1,1713,1,3140,><:A0> <:R1,2,1,1713,1,3140,><:#1988,9027>State 6 is the inital state. When this automaton scans the input 12..34, it will go through states 6, 1, 1 and 7. On state 7, the automaton encounters the input character Period(.). According to the transition table, it is either an error or a continuation . Since we know one of the states that the automaton just passed is an accepting state, that is, state 1. The automaton should output a token corresponging to state1, which is an IntLit token. The automaton should then jump to continuation<[>state7], which is state 2. The automaton will attempt to scan the input character Period(.) starting from state2. @Title@<:R1,1,1,1713,><:#437,9027>6.ScanGen2 Definitions(SFA) forADA/CS @figure@<:R1,1,1,1713,><:#284,9027>Options tables, sfa @figure@<:R1,1,1,1995,><:#284,9027>Class @figure@<:R1,1,1,1995,><:#284,9027>E = 'E','e'; @figure@<:R1,1,1,1995,><:#284,9027>OtherLetter = 'A'..'D','F'..'Z','a'..'d','f'..'z'; @figure@<:R1,1,1,1995,><:#284,9027>Digit = '0'..'9'; @figure@<:R1,1,1,1995,><:#284,9027>NewLine = 10; @figure@<:R1,1,1,1995,><:#284,9027>Blank = ' '; @figure@<:R1,1,1,1995,><:#284,9027>Amper = '&'; @figure@<:R1,1,1,1995,><:#284,9027>Quote = '"'; @figure@<:R1,1,1,1995,><:#284,9027>Apostrophe = ''''; @figure@<:R1,1,1,1995,><:#284,9027>LeftParen = '('; @figure@<:R1,1,1,1995,><:#284,9027>RightParen = ')'; @figure@<:R1,1,1,1995,><:#284,9027>Asterisk = '*'; @figure@<:R1,1,1,1995,><:#284,9027>PlusChar = '+'; @figure@<:R1,1,1,1995,><:#284,9027>MinusChar = '-'; @figure@<:R1,1,1,1995,><:#284,9027>Period = '.'; @figure@<:R1,1,1,1995,><:#284,9027>Slash = '/'; @figure@<:R1,1,1,1995,><:#284,9027>ColonChar = ':'; @figure@<:R1,1,1,1995,><:#284,9027>Semi = ';'; @figure@<:R1,1,1,1995,><:#284,9027>LessThan = '<<'; @figure@<:R1,1,1,1995,><:#284,9027>GreaterThan = '<;>'; @figure@<:R1,1,1,1995,><:#284,9027>VerticalBar = '|'; @figure@<:R1,1,1,1995,><:#284,9027>Equals = '='; @figure@<:R1,1,1,1995,><:#284,9027>CommaChar = ','; @figure@<:R1,1,1,1995,><:#284,9027>UnderScore = '_'; @figure@<:R1,1,1,1995,><:#284,9027>Tab = 9; @figure@<:R1,1,1,1995,><:#284,9027>Unprintable = 0..8,11..31,127; @figure@<:R1,1,1,1995,><:#284,9027>Illegal = '!','@','#','$','%','^','<[>',']','{','}','?','~','`','\'; @figure@<:R1,1,1,1713,><:#284,9027>Definition @figure@<:R1,1,1,2850,><:#284,9027>Letter = E,OtherLetter @figure@<:R1,1,1,2850,><:#284,9027>Token Ampersand {6} = Amper {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Bar {5} = VerticalBar {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Box {23} = LessThan {toss} . GreaterThan {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Becomes {8} = ColonChar {toss} . Equals {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Choose {24} = Equals {toss} . GreaterThan {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Colon {19} = ColonChar {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Comma {15} = CommaChar {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Dot {16} = Period {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token DotDot {17} = Period {toss} . Period {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Lparen {26} = LeftParen {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Minus {21} = MinusChar {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token MultOp {22} = Asterisk {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token DivOp {25} = Slash {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Plus {20} = PlusChar {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token LT {9} = LessThan {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token LE {11} = Lessthan {toss} . Equals {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token EQ {7} = Equals {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token NotEQ {13} = Slash {toss} . Equals {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token GE {12} = GreaterThan {toss} . Equals {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token GT {10} = GreaterThan {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Rparen {27} = RightParen {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token SemiColon {18} = Semi {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Tic {4} = Apostrophe {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token ToThe {14} = Asterisk {toss} . Asterisk {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token IntLit {2,1} = Digit . (Digit,Underscore{toss})* ; @figure@<:R1,1,1,2850,><:#284,9027>Token RealLit {2,2} = IntLit . (Epsilon,Period.IntLit) . @figure@<:R1,1,1,2850,><:#284,9027> (Epsilon,(E.(Epsilon,Pluschar,MinusChar).IntLit)); @figure@<:R1,1,1,2850,><:#284,9027>Token StringLit {3} = Quote {toss} . ((Not(Quote,Newline,Tab,Unprintable) , @figure@<:R1,1,1,2850,><:#284,9027> Quote {toss} . Quote)*)! . Quote {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token WhiteSpace {0} = (Blank{toss}, Newline{toss}, Tab{toss})+ ; @figure@<:R1,1,1,2850,><:#284,9027>Token Comment {0} = MinusChar {toss} . MinusChar {toss} . @figure@<:R1,1,1,2850,><:#284,9027> ((Not Newline{toss})*)! . Newline {toss}; @figure@<:R1,1,1,2850,><:#284,9027>Token Identifier {1} = Letter . (Letter, Digit, Underscore)* @figure@<:R1,1,1,2850,><:#284,9027> Except @figure@<:R1,1,1,3135,><:#284,9027> 'abs' {28}, @figure@<:R1,1,1,3135,><:#284,9027> 'and' {29}, @figure@<:R1,1,1,3135,><:#284,9027> 'array' {30}, @figure@<:R1,1,1,3135,><:#284,9027> 'begin' {31}, @figure@<:R1,1,1,3135,><:#284,9027> 'body' {32}, @figure@<:R1,1,1,3135,><:#284,9027> 'case' {33}, @figure@<:R1,1,1,3135,><:#284,9027> 'constant' {34}, @figure@<:R1,1,1,3135,><:#284,9027> 'declare' {35}, @figure@<:R1,1,1,3135,><:#284,9027> 'else' {36}, @figure@<:R1,1,1,3135,><:#284,9027> 'elsif' {37}, @figure@<:R1,1,1,3135,><:#284,9027> 'end' {38}, @figure@<:R1,1,1,3135,><:#284,9027> 'exception' {39}, @figure@<:R1,1,1,3135,><:#284,9027> 'exit' {40}, @figure@<:R1,1,1,3135,><:#284,9027> 'for' {41}, @figure@<:R1,1,1,3135,><:#284,9027> 'function' {42}, @figure@<:R1,1,1,3135,><:#284,9027> 'if' {43}, @figure@<:R1,1,1,3135,><:#284,9027> 'in' {44}, @figure@<:R1,1,1,3135,><:#284,9027> 'is' {45}, @figure@<:R1,1,1,3135,><:#284,9027> 'loop' {46}, @figure@<:R1,1,1,3135,><:#284,9027> 'mod' {47}, @figure@<:R1,1,1,3135,><:#284,9027> 'not' {48}, @figure@<:R1,1,1,3135,><:#284,9027> 'null' {49}, @figure@<:R1,1,1,3135,><:#284,9027> 'of' {50}, @figure@<:R1,1,1,3135,><:#284,9027> 'or' {51}, @figure@<:R1,1,1,3135,><:#284,9027> 'others' {52}, @figure@<:R1,1,1,3135,><:#284,9027> 'out' {53}, @figure@<:R1,1,1,3135,><:#284,9027> 'package' {54}, @figure@<:R1,1,1,3135,><:#284,9027> 'pragma' {55}, @figure@<:R1,1,1,3135,><:#284,9027> 'private' {56}, @figure@<:R1,1,1,3135,><:#284,9027> 'procedure' {57}, @figure@<:R1,1,1,3135,><:#284,9027> 'raise' {58}, @figure@<:R1,1,1,3135,><:#284,9027> 'range' {59}, @figure@<:R1,1,1,3135,><:#284,9027> 'record' {60}, @figure@<:R1,1,1,3135,><:#284,9027> 'return' {61}, @figure@<:R1,1,1,3135,><:#284,9027> 'reverse' {62}, @figure@<:R1,1,1,3135,><:#284,9027> 'access' {63}, @figure@<:R1,1,1,3135,><:#284,9027> 'subtype' {64}, @figure@<:R1,1,1,3135,><:#284,9027> 'then' {65}, @figure@<:R1,1,1,3135,><:#284,9027> 'type' {66}, @figure@<:R1,1,1,3135,><:#284,9027> 'use' {67}, @figure@<:R1,1,1,3135,><:#284,9027> 'when' {68}, @figure@<:R1,1,1,3135,><:#284,9027> 'while' {69}, @figure@<:R1,1,1,3135,><:#284,9027> 'all' {70} ; @figure@<:R1,1,1,3135,><:#284,9027> > Visio.Drawing.38俵遄;  Root EntryF鎧CompObj[VisioDocument- FVISIO 3.0 Drawing VISIO ShapesVisio.Drawing.3俵遄; 俵遄; Visio (TM) Drawing -R HX,獮膲澽瓙齗欘膲 擬緧迋陶喉!fffMMM333-q0朄-鋺T 鋺D Arial) -3Times New Roman5T鋺?鼐?粡 鼐Y@-1浯鋺OJ鋺/T 澽 僰h鋺T鼐JbO櫜S鋺0{G嫙?@翭CPjV]uVbUUO OS?翭 T666 NP U    UvPaC G#G#攎#G &Hv#O`$$!. 4!}7fi>p觟'0U"?!鼐鍙&7gjP>文i6;03|2騜0s6&0B!|4?6 27T}G2k=- G2 T 0 觟96L^pueB 2EGi?擦O??ZuX F&霖0#PW?D_{?hVU3G -O?N9:^OpOOO危"YPJ0*E|NI蜆_惛2ベ`?@of.f蕤逶逶週jX! [#f%,//eF3# H0T:g@于跎鬒G莣+G$4疕 ペ0"@ 朋 n` @ 鮥邸p鑆p#@臝#'`艛3@ ;!?"杭#$ %O&杵p'W([)s *泌+g,k-o.泅/%p0{12304567疕89:炒;<=>玟?@AB林PC曨DEF肩GHI#PJ*PKL Yk }﹚ 獵JB @"4┘H1du﹚Pf #砥~0`d e眨烈砥~td 搵@黚縑~茀d U瞟篡縑~d 芨萷鬵洁~ d隧柭氠}洷| d郈柣旆蓔櫼ㄍ d@7筴絿羥舝| d鉒萴葯蜌舝| d%7顅餲[鵅~d鞞荔闊逄﹚D毚 d'9K﹚d d﹚T啦 d)P;﹚怜硬 d}@﹚鉞wd+﹚藒wdToㄍ藒wd /P/﹚硬d]/@o///﹚|硬d/// ?﹚硬EdM?_?琢`鑌鷰l3%0O韐Nk犦毷F F&UTP???? O螉1I幌EOWB赩OoOOO令蕠銻8BOU嵊WB 顢__+_=_E!X_:NS~[!__巢儳惛幌駶e紈~["%o7oIo[omoOU駻i_n#緻洭嫪鏣BE :N~[$Ugy幌埆菳%#5OUO1菳&BE:N`~['/ASe幌5oW(OU)M珞益 OCO甦*撖鰳 ,>η.也膳f\+}摯愎0紊講;穔-充 [ d,9 <匝霎P2ベ衧?04_疲i<5'梩A郈苴12Kp1j1訐;?鴐<03倷騜0Tн鑨浤-瓬 燙殂洄d怏艭~[.%7顅駷鵅覺甕W/欐恬橪 (1(C粴罭鈜臗}紵葳葸萻蛵覅01CUgyg鄈癮5蹴!*<N躄1m g傴蓒}焂%Hcl~2 //'/9/挻5r// ////3//@ ??-?H?NdcAn9j{4?シ?G 憼龒i4?t)?J4!O3OEOWOiOOOO屠妱徖蔀躥 _裱)譐OZ5]_o___北餛殳萣u?_1_C_?oo#oO巘6o卻緻洭嫪o)[omooq 巘7 8Q?c?e領 A萳 ?檹8#5GYtASMz] /畝9M珞益秣笆罟燲@澠璟5oGo禫燙V:翮蕞謀勴}搵汍@(7柜枹洟瞞;欐豜橪 (裞柰g腲葚萴葯蜌c<%7顅骾m祊燽a洒∴喉麟SV==Oa@s1窢,7%03尥#楑%">y岶%炑%秠L/pM?//#/5/怞55v//P?//繽@ "Q&s 665g0'2`C230O_韐Nk @?稛饑聜@敓校屻扚?P It` S fgf綒? t !r\澶癪##謵斜##o︵隸鮵 :荿`詴#uY) & %:e 葦!  " ("!  "" & &"$" WWl嗧UIa+-01310![@PS W'Q"i!瀖"_# "{b"L5葄盬>癚#kDS力費_exP~_hF 犡G }O8;s鞝2/R焥餩O渢(nq@氀2}竷K討,CeU/ 菲p$(/:/L/^/p//*伾0 踔 巂"rp! r %褰 $驠$0<?澩3?E?W?5_豉6r??!o?︵訛?moo/OAOSOeOwOOOaoo箜s__+_NSY_k__{1鰭U_ oo1oCoUogo- 秤o澽3}|0瓨翛隳|逯+?+=O'+攁鋨X*|1 4!"G浣釓!S浣W晊%5淯 n笁琄O畤涘浰7破隧2G眢k 諯浚滇刐y恬梲蝧-紗筸畚真薢S_猀秘浩旛級{顊E獨磨篦濃捫wSe钂欀1}鄖);珅嶴殥x@m窀VL昍杽/&/昑瘐蟴,峔"""" !""!%"" & &"$"ц殗錈g"2"!3齔W5G鏖淖趠 /?1w?O>NS"?#_?Y?O縫PO烙C?24ト_鷳K魑斜 @@♀`牳蟿d酇f闅肊磁/(/:/L/^/隇d灼 "洿"菡猢!蔦猳褦宁熳 莦綮雘/沋?#?5?_常菡a2菡k?}?_?__?Ko]o OO1OCOUOgOyO?io{o篷Q墯蠦 _鏎7_I_m_Yδ3揕螒_o!o3oEo 輻卹o5奈K惱 wo哷鐺傒鰥4F?@pB譽藪%鰻'剿 !貑dz惏,v膽,"| 繵 ""# "苡2倬! L@':>A珠_\疊@囮侞X1#浾2#@炆Y靦曶I詻鎰禸侕w蕭2此*RマT懟x興せ堭K7[賾柺T苛│#左A柎秖e柼sm嬃=蛞狺-甩煙奻裉糨枹 p!$.烗!}M絻耡艂葙葂葒歔 1韔馘鬁黚嬼擽黚艬-l6匝奈幃i{豅]N志彋?@"]虜?@[H獅?@ゑ%(j鯇涔;?%s!=! `u `踀u `u <4/@_! 6弗C474@VK `70>1w1!F0C04#"虀5 U鑽 羾2302207@ъ砉x<犐鼮\.呬?@袟(灂*xY_S遯蜀 V3133罠dzZ)3Ms常2C3@3M靳2彪G3遇z0{埂嫙? &4[bSb9 09 W$^&BX']7kFb[*v?@知{1P沬 c龑 xQ輁yz_蒧}K`!W/憿T2a!弼 ^4 5玟4@86o$o玟r15@4THH //,8%%晱%潧?@R>O>&3B2?D?V?h?z????6S6` 畟r臃2廝瀑莥V吷@E鶦"E@ue1Jm?O SO LgO 孜{~$D廝i製Bj蚊廝u莗逯薂]$_/_A_S_e_w_SP*^?兣炭U 稻柉塺醭oIo[o;o_oqh姠o o吶,.F肪j琢趎V馳/l'茼CUgyx+Z?豻j冓 OH炸2ODOVOJ瘛AB炾A液'蛉尨]U昹7'9Y'|H葛 gO謯 k破S黽艬~疙L&O丼2X志棴銡鰩,>燕瘺賴t鉗@Mj例貜蛹"B@蝙趠楰籙W脯 B 蚊5;p浀牉珅嗊"艀$6筭 礔罬腧S~貓鵿*E@懺X,X判軀婒糅鸃 .鞞餭d幹慨錴z稷@)O蠸鮯L碏9掜殉褯KnmB蚊n##'w)*^p$H GYkS>盺齍@嬉脂錴荴V3畬,>P40滋\B@f喧l6x8 0﹪F %D"?@裛F-"\3忘?@[7驎e驕X鷘灅②臂椻逾較梖J轕侚灱8K7 "痧 !8喳冶 (A$]潻emXzyr兗z@2rn 朵(瑪 pq筈 p wp p % V` Uf1\喻?^櫓@'5@>=x髏PpT7 !(Khu揍D?@4♂貄苛幽j?@冑U+捇桽(桮?l岌C昒嗙缸橍瘲蜌Y藍氚cR﹊s |巉f?x甡儊珗)>pLfnP餕}倍? 艴檴t 麊N褙鮚瀌馣瀾薾i蟟4pu+Digit#jiwg?;03抈騜0雖錍Bq=Gi嫬4''缽儺!`*嚦) 衃樕龢k3嗦癉需?@d靡1窢{(\欨"g訇彧晚蹺氪@w:qY$6顉:L塚絖る/"懫P/t/Vhz+Period@+ ;鑗_ "H$@@~O菗o 佮杺t"4F0Mt鮫hz///)_B/M_./q_/d/7_鉤#_廆////?xo*?燕瘺篙嗝.Ⅶ曾せ媬篹嗊鎯Xb|h洈鰍洟\靃 筲o]o?c腜葖蔇:楸檽<貓濷 @@l~(:餫濼?Xf呃ff;D?rIHP伐瘀朾趉E.d" .@RDV//?,/[?/?`r.蓱O'yFJPtLhn$4?@胗卅?@8`I#?@,萹?@B嚜?@TPY=謂f鴒!!u `u `踀u `u 7T5@9!V[@>T2T@1 U`2P9QrQAP>P}T%.T% H*(耐.0 偠嵥垽甀R臦燊箑@%D"?@p絼笤?@[?@?洴凵0鏖闐z玔@紡蘑鍛t淉暫1 'W辟% 垽括n悐偝埐|m悐▂g熽甫z0{k輈?i6;P#b$踵!W%X$$/4U?7狸@籛EU@U5 *t狸 !輤T ;6r\Q 0 %N6 VT Uf1珮喀?sr嵥w5!槔'28鷳FXj3蕤~3*摛廔鬙樈持帩 痿卿/!/3/E/榣s/////??)?M?9?=?o?荔幸?鱠??BlankO)O2ODOVOhOzOO阼Gz涉G槎臺揄(峇鱍]橤0榡?@圾>~@@蹢 贔)$簷-鏢鬣鬣#鷹S-?QcuO*蚾(R熆鄸崒笏5'(R粺2縱6 氫3 淇 渚3 淬猛3 瓶3(R(RD3(R朔(R碳#(Rの歊#D檳梓n曜媕U僉熆熆邅p朄B浞**<<浞BBNN浞ZZff牷rh寠~炎D朔朔的碳のの寋寋m#d"燊b慡縓Ge賻B$晻G G記%FGG轋"蚣*G籿2SG:_籿蹡k籿鄨$0G醪籿鎧G轋b籿鎣役G巂nG鞮諱GG$豝GDG拯G夒▋G顒摧UzUrjbZURJB:U2*" n,澽鵨[]橤@:k/@氀 ~ 朄@B (兌&'塣>裲 /X 4@ 兌&鋺?R 壼 I鋺Page-1臝Black fill臝_White }uRed Green -臝Cya@璣ellow G綱癐繐ta3a緙(10% x 2r 3 $dar!-J9㊣Uf 4 5 6 7 8 91pxl l磨ned3*t90.."1&%#A&%A Hai巂A shor疘sh1c&Arr\bothv"ial 8鮥t ckere轠b'egin;&end臝#10)#"2)韭'*ヾ&24)耟+top lefGt僾'!C65>*N=B>y0Times,F37+;Bs2脤>F38*竊7R*6&;騽0F[Normal:^D* "m@C穎nn. a&RmEc@ector textG隹B2鉒&BI#清rig毖t將G2$宿 S棱J攐繜E* 7XvKC且鋺KSi貙nvP DyPDoSMaCPPPQPtPQQRQD QLPT RPCPF 麒BOuN瞋 NPxQxQB鄒幏礔鞗霋遯遯A}Pa鄫遯xQyH嫶(g 2.a鮦tsFitto聱Foho^m^ogp/ l牽癢▊鈄o joo8wj}nyRd2vmNp峐檄`Vs3_:362U.*&"UU _3囋U藞鍑縏箬U疐睟稌笯U砣挃忭ふU蹙撼稱嗨U紱桓舍肌UKUUv^F1Q3#Pq妁qUzqjqRq:q5"q qUUrZB*3K0Uづ借UvbN9%Q3 UtdUTD4U UUrdUUG<- x>燦斄[]橤@:k/@鋺臝  !"#$%&'()*+,-./0123456789:;<=>?ABCDEF胃鶇膲 k臝l朄 2氀@B`兌+<s僰瀦 g襴僰( C%A 凘(('84曤 氀R 兌4鋺T鋺@_ 兌鋺0_兌鋺D鋺&B 兌爙鋺!鋺 矐鋺 @澽 鼐 R( 李I鋺$P 墬 WBh盼@瞳軀)哫/'R 蹖&9鋺p /?X翭2F |O?w燕兌Z,<D Iz b俵遄;  METAFILEPICT'謤'娠 ,  e  --8% (<Pey 3GZkyyeP<(ykZG3 '7HYjy0@O\yfjmYqHq7m'f\ O@0--, Arial<-"System- . -!1=4- --8%mYF5'(< P e y'5FYmyeP<(p_ PD'972H/Y/j2y9DP_pyjYH7' ---- . -!24- --8%}(t<oPmeoyt} />JyReXPZ<X(RJ>/  '7HYjy!y+j2Y6H672'+! ---- . -!34- --8%mYF5'  ) =Pa'o5{FYm{oaP=)p_PD92 //.2>9LDXP`_fpgf`XL>. ---- . -!4- --8%ce js  % 4 @ H N P N 3H G@ Z4 k% y  yksZjGe3c   % * , * 0% @ O \ fmqqmf\O@0---- . -!5=- --B$ .>LX`fgf0`@XOL\>f.mq qmf\O@0---- . -!7=- --B$p_PD92//29D!P*_/p1/*!---- . -!6- --,%1.\.817AM]op\K</&8^---N%%    !!"#%&')+,.- --%1---N%%lnprtvwyz|}~- --%---N%%ulvnxpzr|t~vwyz|}~~|zxvu- --%---N%%    !"#$&'(*,.024- --%jc---N%%9 ; =?ACEGILNQSVY[^aca^[Y V S!Q"N#L$I&G'E(C*A,?.=0;294- --%---N%%alcnepgritkvmwoyrzt|v}y~|~~|yvtromkigeca- --,%1..17 A,MI]do|8^---N%%- --2%ucSE:3.r._1N8>C1P'` q!---N%%)m(p&s$v#y!|  !   ~- ! Arial-- . - !Digit `- -- . - !Periodk- -- . - !Periodk%- -- . - !Blank`- -- . - !Digit^- -- . - !Period H- -- . - !Digit- --2%*6EUgy{k]PE=8~7k9Z---N%%IGECA?=<;|:x9u8r8n8k7g7d8`8]9Z8]7`6d5g3j2m0p.s,v*y'{%~" - -- . - !Blank- [Embedded] 3 .ole 42032 21717 0 0 00063751