Related articles |
---|
Grammar question feingold@avette.zko.dec.com (1994-09-20) |
Re: Grammar question euambn@eua.ericsson.se (1994-09-22) |
Re: Grammar question clark@zk3.dec.com (Chris Clark USG) (1994-09-26) |
Re: Grammar question umrigar@cs.binghamton.edu (Zerksis D. Umrigar) (1994-09-28) |
grammar question saleem@synopsys.com (1996-03-14) |
Newsgroups: | comp.compilers |
From: | feingold@avette.zko.dec.com (Elan Feingold) |
Keywords: | parse, yacc, question, comment |
Organization: | Digital Equipment Corporation |
Date: | Tue, 20 Sep 1994 21:31:43 GMT |
I am trying to use lex and yacc to parse the following sorts
of "sentences":
"Verb Foo Foo Foo Bar Bar FooBar Foo"
Where the stream of lexemes returned should be:
VERB IDENTIFIER FOO IDENTIFER BAR IDENTIFIER FOOBAR IDENTIFIER
according to the following grammar:
Command -> Expression FOO Identifier BAR Identifier FOOBAR Identifier
Expression -> Identifier | Expression + Expression ... etc ...
Identifier -> IDENTIFER | NUMBER
This is similar to the FORTRAN problem where there are NO RESERVED
WORDS. What makes this harder is that each part of the sentence is
optional, as follows:
Command -> [Expression] [FOO Identifier] [BAR Identifier] [FOOBAR Identifier]
Where each of the parts in [] can be left out. The problem is that
when I type "Verb Foo..." I don't know whether this should be returned
as an IDENTIFIER or a FOO, without looking ahead to see if down the
line to see if there is another "Foo." If I type something like
"Verb Foo+2/Foo Foo Foo" I want the first two Foos and the last
Foo to be returned as IDENTIFIERs and the second Foo as a FOO.
I realize that if the Expression required a keyword in front of it,
such as "EXPR" the problem would be much simpler, and I could use
some sort of variable to keep track of what I had lexed, i.e.
typedef enum _LexerMemory { afterNothing, afterExpr, afterFoo, afterBar....}..
And return the keyword the first time around and IDENTIFIER after that.
However, I am a slave of the existing grammar :(
I would GREATLY appreciate any help!
Thanks in advance,
Elan
--
|| Elan Feingold (Cornell '94)
|| Software Engineer II
|| Digital Equipment Corporation
|| Work: 603.881.1115
[My experience suggests that the only way to do this in yacc is to put a
horrendous amount of lookahead glop into the lexer, frequently combined
with hints from the parser, so that the lexer can feed the parser tokens
it can handle. I managed to parse Fortran 77 in yacc that way. -John]
--
Return to the
comp.compilers page.
Search the
comp.compilers archives again.