February 21, 2009 Re: problem with declaration grammar? | ||||
|---|---|---|---|---|
| ||||
Ellery Newcomer Wrote:
> jerry quinn wrote:
> > Ellery Newcomer Wrote:
> >>> Maybe I'm missing something. The grammar shown in http://www.digitalmars.com/d/2.0/declaration.html has the following rules:
> >>>
> >>> BasicType2:
> >>> *
> >>> [ ]
> >>> [ Expression ]
> >>> [ Expression .. Expression ]
> >>> [ Type ]
> >>> delegate Parameters FunctionAttributesopt
> >>> function Parameters FunctionAttributesopt
> >>>
> >>> Declarator:
> >>> BasicType2 Declarator DeclaratorSuffixesopt
> >>> BasicType2 Identifier DeclaratorSuffixesopt
> >>>
> >>> With this definition, I don't see how you can get Declarator->Identifier.
> >>>
> >>> Jerry
> >>>
> >> You are correct. BasicType2 can match nothing. It should also be able to match what it does above multiple times.
> >
> > As I'm looking at this further, there seems to be more issues. In particular, I don't think the grammar can parse:
> >
> > int (*x)(char);
> >
> > as specified. Doing so gives (my best attempt)
> >
> > Decl -> BasicType Declarators ;
> > BasicType -> int
> > Declarators -> DeclaratorInitializer
> > DeclaratorInitializer -> Declarator
> > Declarator -> BasicType2 Identifier DeclaratorSuffixes
> > BasicType2 -> NULL (assuming that the grammar should be revised like this)
> > Identifier -> BAD PARSE
> >
> >
>
> yeah, if you haven't figured out by now, the grammar is a bunch of hooey.
>
> I spent like a month building an ANTLR grammar based on the above, and then realized much of it was garbage.
>
> Then I spent two months going through the source code and rewriting most of the rules. Just got done with it a week or two ago :) That was all version 1, but it looks the same, so if memory serves the above rules should look something like this:
>
> BasicType2_x:
> *
> [ ]
> [ Expression ]
> [ Expression .. Expression ]
> [ Type ]
> delegate Parameters FunctionAttributesopt
> function Paramters FunctionAttributesopt
> BasicType2:
> BasicType2_x
> BasicType2 BasicType2_x
> epsilon
> Declarator:
> BasicType2 Identifier DeclaratorSuffixesopt
> BasicType2 ( Declarator ) DeclaratorSuffixesopt
>
> Apologies for any BNF misuse
Cool. Do you feel like posting the whole thing somewhere?
As an aside comment, it might be better from a grammar perspective to make usage of BasicType2 optional, rather than have the epsilon in the BasicType2 rule itself. Then every rule would consume at least 1 token, and _opt is the only expansion shortcut needed.
In the form show, you can simplify the BasicType2 rule to
BasicType2:
BasicType2 BasicType2_x
epsilon
| ||||
February 21, 2009 Re: problem with declaration grammar? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Jerry Quinn | Jerry Quinn wrote: > Ellery Newcomer Wrote: > >> jerry quinn wrote: >>> Ellery Newcomer Wrote: >>>>> Maybe I'm missing something. The grammar shown in http://www.digitalmars.com/d/2.0/declaration.html has the following rules: >>>>> >>>>> BasicType2: >>>>> * >>>>> [ ] >>>>> [ Expression ] >>>>> [ Expression .. Expression ] >>>>> [ Type ] >>>>> delegate Parameters FunctionAttributesopt >>>>> function Parameters FunctionAttributesopt >>>>> >>>>> Declarator: >>>>> BasicType2 Declarator DeclaratorSuffixesopt >>>>> BasicType2 Identifier DeclaratorSuffixesopt >>>>> >>>>> With this definition, I don't see how you can get Declarator->Identifier. >>>>> >>>>> Jerry >>>>> >>>> You are correct. BasicType2 can match nothing. It should also be able to match what it does above multiple times. >>> As I'm looking at this further, there seems to be more issues. In particular, I don't think the grammar can parse: >>> >>> int (*x)(char); >>> >>> as specified. Doing so gives (my best attempt) >>> >>> Decl -> BasicType Declarators ; >>> BasicType -> int >>> Declarators -> DeclaratorInitializer >>> DeclaratorInitializer -> Declarator >>> Declarator -> BasicType2 Identifier DeclaratorSuffixes >>> BasicType2 -> NULL (assuming that the grammar should be revised like this) >>> Identifier -> BAD PARSE >>> >>> >> yeah, if you haven't figured out by now, the grammar is a bunch of hooey. >> >> I spent like a month building an ANTLR grammar based on the above, and then realized much of it was garbage. >> >> Then I spent two months going through the source code and rewriting most of the rules. Just got done with it a week or two ago :) That was all version 1, but it looks the same, so if memory serves the above rules should look something like this: >> >> BasicType2_x: >> * >> [ ] >> [ Expression ] >> [ Expression .. Expression ] >> [ Type ] >> delegate Parameters FunctionAttributesopt >> function Paramters FunctionAttributesopt >> BasicType2: >> BasicType2_x >> BasicType2 BasicType2_x >> epsilon >> Declarator: >> BasicType2 Identifier DeclaratorSuffixesopt >> BasicType2 ( Declarator ) DeclaratorSuffixesopt >> >> Apologies for any BNF misuse > > Cool. Do you feel like posting the whole thing somewhere? knock yourself out http://www.personal.utulsa.edu/~ellery-newcomer/antlrd.g D version 1, ANTLR version 2, note it isn't really complete yet; I haven't gotten around to AST construction. Oh, and don't look at the lexer part. It's ugly as sin. > > As an aside comment, it might be better from a grammar perspective to make usage of BasicType2 optional, rather than have the epsilon in the BasicType2 rule itself. Then every rule would consume at least 1 token, and _opt is the only expansion shortcut needed. > > In the form show, you can simplify the BasicType2 rule to > > BasicType2: > BasicType2 BasicType2_x > epsilon > doh. I knew that. | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply