February 21, 2009
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
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.