Related articles |
---|
Lex and Start Conditions eifrig@server.cs.jhu.edu (1991-01-24) |
Re: Lex and Start Conditions bliss@sp64.csrd.uiuc.edu (1991-01-24) |
Re: Lex and Start Conditions peter@objy.com (1991-01-24) |
Newsgroups: | comp.compilers |
From: | eifrig@server.cs.jhu.edu (Jonathan Eifrig) |
Summary: | How can one specify a start state? |
Keywords: | lex, question |
Organization: | Compilers Central |
Date: | 24 Jan 91 03:59:26 GMT |
Here's a Lex usage question concerning start conditions that I encountered:
I want to have my Lex-generated scanner strip out comments. Conceptually,
this is easy to do with start conditions. For example:
%Start NORM COM
%%
<NORM>{natnum}+ {return(ID);}
<NORM>"/*" {BEGIN COM;}
<COM>"*/" {BEGIN NORM;}
<COM>[^] { /* Do nothing */}
The idea is to have a simple little rule that eats a single character up and
discards it while searching for the close-comment symbol; thereby stripping
the comment out. So far, so good.
This works great, except that the automaton has to be started up in the
correct (meta) state (in this case, NORM). What is the best way to do this?
I've found two ways of doing this, neither of which is very pretty.
Option 1: Kick the automaton into the NORM state manually before parsing.
This basically involves having a main() like:
main()
{
...
BEGIN NORM;
yyparse();
}
Unfortunately, this requires importing the BEGIN macro into the main program
file, which is sort of unappealing.
Option 2: Use the undocumented INITIAL start condition. Substitute INITIAL
for NORM above. Unfortuately, INITIAL isn't a "real" start condition, so we
can't just BEGIN INITIAL, but have to use BEGIN 0, which is very cheezy. In
addition, I have no idea how portable it is. Using "undocumented features"
seems like a bad idea to me.
Does anyone have any other suggestions?
Jack Eifrig eifrig@cs.jhu.edu
[You could use exclusive states in flex. -John]
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.