Related articles |
---|
Help with Grammar Specification brplummer@gmail.com (2008-12-04) |
Re: Help with Grammar Specification brplummer@gmail.com (2008-12-04) |
Re: Help with Grammar Specification bear@sonic.net (Ray Dillinger) (2008-12-05) |
Re: Help with Grammar Specification cfc@shell01.TheWorld.com (Chris F Clark) (2008-12-08) |
From: | brplummer@gmail.com |
Newsgroups: | comp.compilers |
Date: | Thu, 4 Dec 2008 22:46:49 -0800 (PST) |
Organization: | Compilers Central |
References: | 08-12-013 |
Keywords: | LALR, parse |
Posted-Date: | 05 Dec 2008 10:16:36 EST |
On Dec 4, 7:09 pm, brplum...@gmail.com wrote:
>
> What I want is to not require any particular ordering of the parts of
> this production. In other words I'd like to my last example to
> work...while minimizing the number of productions in my grammar.
> [My advice would be to make the parser accept an arbitrary list
> of the things that can occur in an enum, and diagnose multiple
> occurrences yourself. This both makes the grammar simpler, and
> allows you to produce better error messages, "multiple enum
> default not allowed" rather than "syntax error".
>
> This question of syntax where you can allow at most one each of
> an unordered list of possibilities comes up a lot, and this is
> the best solution I've found for LALR parsers.
>
> oneenum : enum '{' enumstuff '}' ;
> enumstuff: /* nothing */
> | enumstuff namespace
> | enumstuff default
> | enumstuff handlerclasses
> | enumstuff values ;
> -John]
Thanks for the reply.
I thought about this some more and asked myself, "where do we see this
kind of language construct in programming?" Answer: The C programming
language. So I looked at a C grammar and found what I was looking
for. Ended up with something very close to what you suggest. Thanks
again for taking the time to read my post and respond!!
Here is what I came up with:
oneenum : enum '{' descriptorlist '}' {
namespaceHasBeenDefined = defaultHasBeenDefined =
valuesHasBeenDefined = false; // reset for next enum...
};
descriptor
: namespace {
if (namespaceHasBeenDefined) {
yyerror("namespace has already been defined.");
}
namespaceHasBeenDefined = true;
}
| default {
if (defaultHasBeenDefined) {
yyerror("default has already been defined.");
}
defaultHasBeenDefined = true;
}
| handlerclass
| values {
if (valuesHasBeenDefined) {
yyerror("values has already been defined.");
}
valuesHasBeenDefined = true;
}
;
descriptorlist
: descriptor
| descriptorlist descriptor
;
Return to the
comp.compilers page.
Search the
comp.compilers archives again.