01.03.2015 Views

Modern compiler design [PDF]

Modern compiler design [PDF]

Modern compiler design [PDF]

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Default Actions<br />

What happens when no regular expression matches the next characters in the input? Lex will execute the<br />

default action, which merely prints the unmatched characters to standard out. The easiest way to understand<br />

how default actions work is to assume that the lines:<br />

. { printf("%s",yytext); }<br />

\n { printf("%s", yytext); }<br />

appear at the end of our lex file, to be used if no other rules match the input. These default rules allow us<br />

to easily write lex code to make slight modifications to an input file. We only need to specify what changes<br />

we want to make, and the rest of the file is left alone. Examples of using lex to transform files can be found<br />

in Figures 2.6 and 2.7.<br />

What if we do not want to use the default rules? All we need to do is make sure that our regular<br />

expressions match all possible strings. If we have our own rules for the regular expressions “,” and “\n”,<br />

then the default rules will never be used.<br />

yywrap<br />

When lex reaches the end of an input file, it calls the function int yywrap(void). If yywrap returns 1, then<br />

yylex exits, returning a 0. If yywrap returns 0, lex will continue to try to match regular expressions to the<br />

input file. We can use yywrap to allow lex to analyze several files one after the other, by changing the file<br />

pointer yyin and returning 0. An example of using yywrap in this way can be found in the changedates.lex<br />

file, in Figure 2.7. If we no not wish to use multiple input files, and we don’t need lex to do any cleanup<br />

work when the end of the file is reached, then we can use the default version of yywrap:<br />

int yyrwap(void) {<br />

return 1;<br />

}<br />

If we do not include a definition of yywrap, lex is supposed to use this default definition. However, on<br />

some implementations of lex, if we do not include the above definition in the C code segment of lex, the<br />

lexical analyzer will not compile correctly.<br />

Including a Main Program in Lex<br />

Any C functions that we place after the final %% in the lex file will be copied directly into the C code that<br />

lex generates. We can use this feature to create a stand alone program in lex, by including a main function<br />

after the final %%. Consider the lex program in Figure 2.6. When we run lex on this file, and then compile<br />

lex.yy.c, we get a complete, stand-alone program that removes the comments from a C source file. How<br />

does this program work? After setting yyin (so that lex reads from a file instead of from standard input),<br />

the main program calls yylex. Since none of the actions include a return statement, yylex will continue<br />

matching expressions and executing their actions until the end of file is reached. Then the function yywrap<br />

will be called, and yylex will end. The main program will then print out some statistics. Note that we could<br />

have put the line<br />

printf("/* Comments removed = %d */", commentsRemoved);<br />

in the body of yywrap instead of in the main program, without changing the output of the program. Also,<br />

since the regular expressions:<br />

. { printf("%s",yytext); }<br />

\n { printf("%s", yytext); }<br />

just implement the default action, we could remove them without affecting the output of our program.<br />

13

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!