DragonFly On-Line Manual Pages

Search: Section:  


AFLEX(1)               DragonFly General Commands Manual              AFLEX(1)

NAME

aflex - fast lexical analyzer generator for Ada

SYNOPSIS

aflex [ -bdfipstvEILT -Sskeleton_file ] [ filename ]

DESCRIPTION

aflex is a version of the Unix tool lex , but it is written in Ada and generates scanners in Ada. It is upwardly compatible with the UCI tool alex, but is much faster and generates smaller scanners.

OPTIONS

Command line options are given in a different format than in the old UCI alex. Aflex options are as follows -t Write the scanner output to the standard output rather than to a file. The default name of the scanner file for base.l is base.a Note that this option is not as useful with aflex because in addition to the scanner file there are files for the externally visible dfa functions (base_dfa.a) and the external IO functions (base_io.a) -b Generate backtracking information to aflex.backtrack. This is a list of scanner states which require backtracking and the input characters on which they do so. By adding rules one can remove backtracking states. If all backtracking states are eliminated and -f is used, the generated scanner will run faster (see the -p flag). Only users who wish to squeeze every last cycle out of their scanners need worry about this option. -d makes the generated scanner run in debug mode. Whenever a pattern is recognized the scanner will write to stderr a line of the form: --accepting rule #n Rules are numbered sequentially with the first one being 1. Rule #0 is executed when the scanner backtracks; Rule #(n+1) (where n is the number of rules) indicates the default action; Rule #(n+2) indicates that the input buffer is empty and needs to be refilled and then the scan restarted. Rules beyond (n+2) are end-of-file actions. -f has the same effect as lex's -f flag (do not compress the scanner tables); the mnemonic changes from fast compilation to (take your pick) full table or fast scanner. The actual compilation takes longer, since aflex is I/O bound writing out the big table. The compilation of the Ada file containing the scanner is also likely to take a long time because of the large arrays generated. -i instructs aflex to generate a case-insensitive scanner. The case of letters given in the aflex input patterns will be ignored, and the rules will be matched regardless of case. The matched text given in yytext will have the preserved case (i.e., it will not be folded). -p generates a performance report to stderr. The report consists of comments regarding features of the aflex input file which will cause a loss of performance in the resulting scanner. Note that the use of the ^ operator and the -I flag entail minor performance penalties. -s causes the default rule (that unmatched scanner input is echoed to stdout) to be suppressed. If the scanner encounters input that does not match any of its rules, it aborts with an error. This option is useful for finding holes in a scanner's rule set. -v has the same meaning as for lex (print to stderr a summary of statistics of the generated scanner). Many more statistics are printed, though, and the summary spans several lines. Most of the statistics are meaningless to the casual aflex user, but the first line identifies the version of aflex, which is useful for figuring out where you stand with respect to patches and new releases. -E instructs aflex to generate additional information about each token, including line and column numbers. This is needed for the advanced automatic error option correction in ayacc. -I instructs aflex to generate an interactive scanner. Normally, scanners generated by aflex always look ahead one character before deciding that a rule has been matched. At the cost of some scanning overhead, aflex will generate a scanner which only looks ahead when needed. Such scanners are called interactive because if you want to write a scanner for an interactive system such as a command shell, you will probably want the user's input to be terminated with a newline, and without -I the user will have to type a character in addition to the newline in order to have the newline recognized. This leads to dreadful interactive performance. If all this seems to confusing, here's the general rule: if a human will be typing in input to your scanner, use -I, otherwise don't; if you don't care about how fast your scanners run and don't want to make any assumptions about the input to your scanner, always use -I. Note, -I cannot be used in conjunction with full i.e., the -f flag. -L instructs aflex to not generate #line directives (see below). -T makes aflex run in trace mode. It will generate a lot of messages to stdout concerning the form of the input and the resultant non-deterministic and deterministic finite automatons. This option is mostly for use in maintaining aflex. -Sskeleton_file overrides the default internal skeleton from which aflex constructs its scanners. You'll probably never need this option unless you are doing aflex maintenance or development.

INCOMPATIBILITIES WITH LEX

aflex is fully compatible with lex with the following exceptions: - Source file format: The input specification file for aflex must use the following format. definitions section %% rules section %% user defined section ## user defined section - lex's %r (Ratfor scanners) and %t (translation table) options are not supported. - The do-nothing -n flag is not supported. - When definitions are expanded, aflex encloses them in parentheses. With lex, the following NAME [A-Z][A-Z0-9]* %% foo{NAME}? text_io.put_line( "Found it" ); %% will not match the string "foo" because when the macro is expanded the rule is equivalent to "foo[A-Z][A-Z0-9]*?" and the precedence is such that the '?' is associated with "[A-Z0-9]*". With aflex, the rule will be expanded to "foo([A-z][A-Z0-9]*)?" and so the string "foo" will match. Note that because of this, the ^, $, <s>, and / operators cannot be used in a definition. - Input can be controlled by redefining the YY_INPUT function. YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)". Its action is to place up to max_size characters in the character buffer "buf" and return in the integer variable "result" either the number of characters read or the constant YY_NULL to indicate EOF. The default YY_INPUT reads from Standard_Input. You also can add in things like counting keeping track of the input line number this way; but don't expect your scanner to go very fast. - Yytext is a function returning a vstring. - aflex reads only one input file, while lex's input is made up of the concatenation of its input files. - The following lex constructs are not supported - REJECT - %T -- character set tables - %x -- changes to internal array sizes (see below)

ENHANCEMENTS

- Exclusive start-conditions can be declared by using %x instead of %s. These start-conditions have the property that when they are active, no other rules are active. Thus a set of rules governed by the same exclusive start condition describe a scanner which is independent of any of the other rules in the aflex input. This feature makes it easy to specify "mini- scanners" which scan portions of the input that are syntactically different from the rest (e.g., comments). End-of-file rules. The special rule "<<EOF>>" indicates actions which are to be taken when an end-of-file is encountered and yywrap() returns non-zero (i.e., indicates no further files to process). The action can either text_io.set_input() to a new file to process, in which case the action should finish with YY_NEW_FILE (this is a branch, so subsequent code in the action won't be executed), or it should finish with a return statement. <<EOF>> rules may not be used with other patterns; they may only be qualified with a list of start conditions. If an unqualified <<EOF>> rule is given, it applies only to the INITIAL start condition, and not to %s start conditions. These rules are useful for catching things like unclosed comments. An example: %x quote %% ... <quote><<EOF>> { error( "unterminated quote" ); } <<EOF>> { set_input( next_file ); YY_NEW_FILE; } - aflex dynamically resizes its internal tables, so directives like "%a 3000" are not needed when specifying large scanners. - aflex generates --#line comments mapping lines in the output to their origin in the input file. - All actions must be enclosed by curly braces. - Comments may be put in the first section of the input by preceding them with '#'. - Ada style comments are supported instead of C style comments. - All template files are internalized. - The input source file must end with a ".l" extension.

FILES

The names of the files containing the generated scanner, IO, and DFA packages are based on the basename of the input file. For example if the input file is called scan.l then the scanner file is called scan.a, the DFA package is in scan_dfa.a, and scan_io.a is the IO package file. All of these file names may be changed by modifying the external_file_manager package (see the porting notes for more information.) aflex.backtrack backtracking information for -b

SEE ALSO

lex(1) M. E. Lesk and E. Schmidt, LEX - Lexical Analyzer Generator. Technical Report Computing Science Technical Report, 39, Bell Telephone Laboratories, Murray Hill, NJ, 1975. Military Standard Ada Programming Language (ANSI/MIL-STD-1815A-1983), American National Standards Institute, January 1983. T. Nguyen and K. Forester, Alex - An Ada Lexical Analysis Generator Arcadia Document UCI-88-17, University of California, Irvine, 1988 D. Taback and D. Tolani, Ayacc User's Manual, Arcadia Document UCI-85-10, University of California, Irvine, 1986

AUTHOR

John Self. Based on the tool flex written and designed by Vern Paxson. It reimplements the functionality of the tool alex designed by Thieu Q. Nguyen. Send requests for aflex information to alex-info@ics.uci.edu Send bug reports for aflex to alex-bugs@ics.uci.edu

DIAGNOSTICS

aflex scanner jammed - a scanner compiled with -s has encountered an input string which wasn't matched by any of its rules. old-style lex command ignored - the aflex input contains a lex command (e.g., "%n 1000") which is being ignored.

BUGS

Some trailing context patterns cannot be properly matched and generate warning messages ("Dangerous trailing context"). These are patterns where the ending of the first part of the rule matches the beginning of the second part, such as "zx*/xy*", where the 'x*' matches the 'x' at the beginning of the trailing context. (Lex doesn't get these patterns right either.) variable trailing context (where both the leading and trailing parts do not have a fixed length) entails a substantial performance loss. For some trailing context rules, parts which are actually fixed-length are not recognized as such, leading to the abovementioned performance loss. In particular, parts using '|' or {n} are always considered variable-length. Nulls are not allowed in aflex inputs or in the inputs to scanners generated by aflex. Their presence generates fatal errors. Pushing back definitions enclosed in ()'s can result in nasty, difficult-to-understand problems like: {DIG} [0-9] -- a digit In which the pushed-back text is "([0-9] -- a digit)". Due to both buffering of input and read-ahead, you cannot intermix calls to text_io routines, such as, for example, text_io.get() with aflex rules and expect it to work. Call input() instead. There are still more features that could be implemented (especially REJECT) Also the speed of the compressed scanners could be improved. The utility needs more complete documentation. Version 1.4 10 March 1994 AFLEX(1)

Search: Section: