📄 flexdoc.1
字号:
.B %array..PP.B %arraydefines.B yytextto be an array of.B YYLMAXcharacters, which defaults to a fairly large value. You can changethe size by simply #define'ing.B YYLMAXto a different value in the first section of your.I lexinput. As mentioned above, with.B %pointeryytext grows dynamically to accomodate large tokens. While this means your.B %pointerscanner can accomodate very large tokens (such as matching entire blocksof comments), bear in mind that each time the scanner must resize.B yytextit also must rescan the entire token from the beginning, so matching suchtokens can prove slow..B yytextpresently does.I notdynamically grow if a call to.B unput()results in too much text being pushed back; instead, a run-time error results..SH ACTIONSEach pattern in a rule has a corresponding action, which can be anyarbitrary C statement. The pattern ends at the first non-escapedwhitespace character; the remainder of the line is its action. If theaction is empty, then when the pattern is matched the input tokenis simply discarded. For example, here is the specification for a programwhich deletes all occurrences of "zap me" from its input:.nf %% "zap me".fi(It will copy all other characters in the input to the output sincethey will be matched by the default rule.).PPHere is a program which compresses multiple blanks and tabs down toa single blank, and throws away whitespace found at the end of a line:.nf %% [ \\t]+ putchar( ' ' ); [ \\t]+$ /* ignore this token */.fi.PPIf the action contains a '{', then the action spans till the balancing '}'is found, and the action may cross multiple lines..I lex knows about C strings and comments and won't be fooled by braces foundwithin them, but also allows actions to begin with.B %{and will consider the action to be all the text up to the next.B %}(regardless of ordinary braces inside the action)..PPAn action consisting solely of a vertical bar ('|') means "same asthe action for the next rule." See below for an illustration..PPActions can include arbitrary C code, including.B returnstatements to return a value to whatever routine called.B yylex().Each time.B yylex()is called it continues processing tokens from where it last leftoff until it either reachesthe end of the file or executes a return..PPActions are free to modify.B yytextexcept for lengthening it (addingcharacters to its end--these will overwrite later characters in theinput stream). Modifying the final character of yytext may alterwhether when scanning resumes rules anchored with '^' are active.Specifically, changing the final character of yytext to a newline willactivate such rules on the next scan, and changing it to anything elsewill deactivate the rules. Users should not rely on this behavior beingpresent in future releases. Finally, note that none of this paragraphapplies when using.B %array(see above)..PPActions are free to modify.B yylengexcept they should not do so if the action also includes use of.B yymore()(see below)..PPThere are a number of special directives which can be included withinan action:.IP -.B ECHOcopies yytext to the scanner's output..IP -.B BEGINfollowed by the name of a start condition places the scanner in thecorresponding start condition (see below)..IP -.B REJECTdirects the scanner to proceed on to the "second best" rule which matched theinput (or a prefix of the input). The rule is chosen as describedabove in "How the Input is Matched", and.B yytextand.B yylengset up appropriately.It may either be one which matched as much textas the originally chosen rule but came later in the.I lexinput file, or one which matched less text.For example, the following will both count thewords in the input and call the routine special() whenever "frob" is seen:.nf int word_count = 0; %% frob special(); REJECT; [^ \\t\\n]+ ++word_count;.fiWithout the.B REJECT,any "frob"'s in the input would not be counted as words, since thescanner normally executes only one action per token.Multiple.B REJECT'sare allowed, each one finding the next best choice to the currentlyactive rule. For example, when the following scanner scans the token"abcd", it will write "abcdabcaba" to the output:.nf %% a | ab | abc | abcd ECHO; REJECT; .|\\n /* eat up any unmatched character */.fi(The first three rules share the fourth's action since they usethe special '|' action.).B REJECTis a particularly expensive feature in terms scanner performance;if it is used in.I anyof the scanner's actions it will slow down.I allof the scanner's matching. Furthermore,.B REJECTcannot be used with the.I -Cfor.I -CFoptions (see below)..IPNote also that unlike the other special actions,.B REJECTis a.I branch;code immediately following it in the action will.I notbe executed..IP -.B yymore()tells the scanner that the next time it matches a rule, the correspondingtoken should be.I appendedonto the current value of.B yytextrather than replacing it. For example, given the input "mega-kludge"the following will write "mega-mega-kludge" to the output:.nf %% mega- ECHO; yymore(); kludge ECHO;.fiFirst "mega-" is matched and echoed to the output. Then "kludge"is matched, but the previous "mega-" is still hanging around at thebeginning of.B yytextso the.B ECHOfor the "kludge" rule will actually write "mega-kludge".The presence of.B yymore()in the scanner's action entails a minor performance penalty in thescanner's matching speed..IP -.B yyless(n)returns all but the first.I ncharacters of the current token back to the input stream, where theywill be rescanned when the scanner looks for the next match..B yytextand.B yylengare adjusted appropriately (e.g.,.B yylengwill now be equal to.I n). For example, on the input "foobar" the following will write out"foobarbar":.nf %% foobar ECHO; yyless(3); [a-z]+ ECHO;.fiAn argument of 0 to.B yylesswill cause the entire current input string to be scanned again. Unless you'vechanged how the scanner will subsequently process its input (using.B BEGIN,for example), this will result in an endless loop..PPNote that.B yylessis a macro and can only be used in the lex input file, not fromother source files..IP -.B unput(c)puts the character.I cback onto the input stream. It will be the next character scanned.The following action will take the current token and cause itto be rescanned enclosed in parentheses..nf { int i; unput( ')' ); for ( i = yyleng - 1; i >= 0; --i ) unput( yytext[i] ); unput( '(' ); }.fiNote that since each.B unput()puts the given character back at the.I beginningof the input stream, pushing back strings must be done back-to-front.Also note that you cannot put back.B EOFto attempt to mark the input stream with an end-of-file..IP -.B input()reads the next character from the input stream. For example,the following is one way to eat up C comments:.nf %% "/*" { register int c; for ( ; ; ) { while ( (c = input()) != '*' && c != EOF ) ; /* eat up text of comment */ if ( c == '*' ) { while ( (c = input()) == '*' ) ; if ( c == '/' ) break; /* found the end */ } if ( c == EOF ) { error( "EOF in comment" ); break; } } }.fi(Note that if the scanner is compiled using.B C++,then.B input()is instead referred to as.B yyinput(),in order to avoid a name clash with the.B C++stream by the name of.I input.).IP -.B yyterminate()can be used in lieu of a return statement in an action. It terminatesthe scanner and returns a 0 to the scanner's caller, indicating "all done".By default,.B yyterminate()is also called when an end-of-file is encountered. It is a macro andmay be redefined..SH THE GENERATED SCANNERThe output of.I lexis the file.B lex.yy.c,which contains the scanning routine.B yylex(),a number of tables used by it for matching tokens, and a numberof auxiliary routines and macros. By default,.B yylex()is declared as follows:.nf int yylex() { ... various definitions and the actions in here ... }.fi(If your environment supports function prototypes, then it willbe "int yylex( void )".) This definition may be changed by definingthe "YY_DECL" macro. For example, you could use:.nf #define YY_DECL float lexscan( a, b ) float a, b;.fito give the scanning routine the name.I lexscan,returning a float, and taking two floats as arguments. Note thatif you give arguments to the scanning routine using aK&R-style/non-prototyped function declaration, you must terminatethe definition with a semi-colon (;)..PPWhenever.B yylex()is called, it scans tokens from the global input file.I yyin(which defaults to stdin). It continues until it either reachesan end-of-file (at which point it returns the value 0) orone of its actions executes a.I returnstatement..PPIf the scanner reaches an end-of-file, subsequent calls are undefinedunless either.I yyinis pointed at a new input file (in which case scanning continues fromthat file), or.B yyrestart()is called..B yyrestart()takes one argument, a.B FILE *pointer, and initializes.I yyinfor scanning from that file. Essentially there is no difference betweenjust assigning.I yyinto a new input file or using.B yyrestart()to do so; the latter is available for compatibility with previous versionsof.I lex,and because it can be used to switch input files in the middle of scanning.It can also be used to throw away the current input buffer, by callingit with an argument of.I yyin..PPIf.B yylex()stops scanning due to executing a.I returnstatement in one of the actions, the scanner may then be called again and itwill resume scanning where it left off..PPBy default (and for purposes of efficiency), the scanner usesblock-reads rather than simple.I getc()calls to read characters from.I yyin.The nature of how it gets its input can be controlled by defining the.B YY_INPUTmacro.YY_INPUT's calling sequence is "YY_INPUT(buf,result,max_size)". Itsaction is to place up to.I max_sizecharacters in the character array.I bufand return in the integer variable.I resulteither thenumber of characters read or the constant YY_NULL (0 on Unix systems)to indicate EOF. The default YY_INPUT reads from theglobal file-pointer "yyin"..PPA sample definition of YY_INPUT (in the definitionssection of the input file):.nf %{ #define YY_INPUT(buf,result,max_size) \\ { \\ int c = getchar(); \\ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \\ } %}.fiThis definition will change the input processing to occurone character at a time..PPYou also can add in things like keeping track of theinput line number this way; but don't expect your scanner togo very fast..PPWhen the scanner receives an end-of-file indication from YY_INPUT,it then checks the.B yywrap()function. If.B yywrap()returns false (zero), then it is assumed that thefunction has gone ahead and set up.I yyinto point to another input file, and scanning continues. If it returnstrue (non-zero), then the scanner terminates, returning 0 to itscaller..PPThe default.B yywrap()always returns 1..PPThe scanner writes its.B ECHOoutput to the.I yyoutglobal (default, stdout), which may be redefined by the user simplyby assigning it to some other.B FILEpointer..SH START CONDITIONS.I lexprovides a mechanism for conditionally activating rules. Any rulewhose pattern is prefixed with "<sc>" will only be active whenthe scanner is in the start condition named "sc". For example,.nf <STRING>[^"]* { /* eat up the string body ... */ ... }.fiwill be active only when the scanner is in the "STRING" startcondition, and.nf <INITIAL,STRING,QUOTE>\\. { /* handle an escape ... */ ... }.fiwill be active only when the current start condition iseither "INITIAL", "STRING", or "QUOTE"..PPStart conditionsare declared in the definitions (first) section of the inputusing unindented lines beginning with either.B %sor.B %xfollowed by a list of names.The former declares.I inclusivestart conditions, the latter.I exclusivestart conditions. A start condition is activated using the.B BEGINaction. Until the next.B BEGINaction is executed, rules with the given startcondition will be active andrules with other start conditions will be inactive.If the start condition is.I inclusive,then rules with no start conditions at all will also be active.If it is.I exclusive,then.I onlyrules qualified with the start condition will be active.A set of rules contingent on the same exclusive start condition
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -