February 20, 2009
Sergey Gromov Wrote:

> Thu, 19 Feb 2009 01:30:36 -0500, jerry quinn wrote:
> 
> > Christopher Wright Wrote:
> > 
> >> jerry quinn wrote:
> >>> Hi there,
> >>> 
> >>> I'm not sure if I'm missing something, but I'm having trouble seeing that a simple declaration will parse correctly with the D grammar.
> >>> 
> >>> If we take a declaration statment like:
> >>> 
> >>> int x = 3;
> >>> 
> >>> we have (my best guess):
> >>> 
> >>> DeclarationStatement -> Declaration
> >>> Declaration -> Decl
> >>> Decl -> BasicType Declarators ;
> >>> BasicType -> int
> >>> Declarators -> DeclaratorInitializer
> >>> DeclaratorInitializer -> Declarator = Initializer
> >>> Declarator -> BasicType2 Identifier
> >>> BasicType2 -> ????
> >>> 
> >>> I'm thinking that BasicType2 is optional here, rather than required as the grammar shows.  Is that correct?
> >>> 
> >>> Thanks
> >>> Jerry
> >> 
> >> . Declaration -> Decl
> >> . Decl -> BasicType Declarators
> >> . BasicType -> "int"
> >> . Declarators -> DeclaratorInitializer
> >> . DeclaratorInitializer -> Declarator "=" Initializer
> >> We agree up to here.
> >> 
> >> . Declarator -> Identifier
> >> Here, you don't need BasicType2, and if you use it, you recurse, so
> >> using the rule Declarator -> BasicType2 Declarator here is useless.
> > 
> > What you describe sounds like what I'd expect.
> > 
> > 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
> 
> The grammar works the other way around:
> 
> int x = 3 ;
> 
> int -> BasicType(int)
> // this is either Decl or Type, need more tokens, expect Declarators,
> // Declarator, or Declarator2
> -----
> x -> Identifier(x)
> // either DeclaratorInitializer (Declarators), Declarator,
> // IdentifierList (not expecting), StructMemberInitializer (not
> // expecting), or PrimaryExpression (not expecting)
> // therefore expecting '=' or DeclaratorSuffixes
> -----
> = -> = // token
> // Identifier(x) = -> definitely DeclaratorInitializer, expecting
> // Initializer, that is , either void, AssignExpression,
> // ArrayInitializer, or StructInitializer

This is incorrect.  We have

 BasicType(int) Identifier(x) '= '

You're suggesting the Identifier begins DeclaratorInitializer, but it must start with a Declarator.  We don't have one, because Declarator must start with BasicType2.  This is where I think the bug in the grammar is.  If BasicType2 were optional, then the parse would complete as you showed.

> Finita la comedia.

Unfortunately, not yet fini


February 20, 2009
Thu, 19 Feb 2009 20:55:52 -0500, jerry quinn wrote:

> Sergey Gromov Wrote:
> 
>> Thu, 19 Feb 2009 01:30:36 -0500, jerry quinn wrote:
>> 
>>> Christopher Wright Wrote:
>>> 
>>>> jerry quinn wrote:
>>>>> Hi there,
>>>>> 
>>>>> I'm not sure if I'm missing something, but I'm having trouble seeing that a simple declaration will parse correctly with the D grammar.
>>>>> 
>>>>> If we take a declaration statment like:
>>>>> 
>>>>> int x = 3;
>>>>> 
>>>>> we have (my best guess):
>>>>> 
>>>>> DeclarationStatement -> Declaration
>>>>> Declaration -> Decl
>>>>> Decl -> BasicType Declarators ;
>>>>> BasicType -> int
>>>>> Declarators -> DeclaratorInitializer
>>>>> DeclaratorInitializer -> Declarator = Initializer
>>>>> Declarator -> BasicType2 Identifier
>>>>> BasicType2 -> ????
>>>>> 
>>>>> I'm thinking that BasicType2 is optional here, rather than required as the grammar shows.  Is that correct?
>>>>> 
>>>>> Thanks
>>>>> Jerry
>>>> 
>>>> . Declaration -> Decl
>>>> . Decl -> BasicType Declarators
>>>> . BasicType -> "int"
>>>> . Declarators -> DeclaratorInitializer
>>>> . DeclaratorInitializer -> Declarator "=" Initializer
>>>> We agree up to here.
>>>> 
>>>> . Declarator -> Identifier
>>>> Here, you don't need BasicType2, and if you use it, you recurse, so
>>>> using the rule Declarator -> BasicType2 Declarator here is useless.
>>> 
>>> What you describe sounds like what I'd expect.
>>> 
>>> 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
>> 
>> The grammar works the other way around:
>> 
>> int x = 3 ;
>> 
>> int -> BasicType(int)
>> // this is either Decl or Type, need more tokens, expect Declarators,
>> // Declarator, or Declarator2
>> -----
>> x -> Identifier(x)
>> // either DeclaratorInitializer (Declarators), Declarator,
>> // IdentifierList (not expecting), StructMemberInitializer (not
>> // expecting), or PrimaryExpression (not expecting)
>> // therefore expecting '=' or DeclaratorSuffixes
>> -----
>> = -> = // token
>> // Identifier(x) = -> definitely DeclaratorInitializer, expecting
>> // Initializer, that is , either void, AssignExpression,
>> // ArrayInitializer, or StructInitializer
> 
> This is incorrect.  We have
> 
> BasicType(int) Identifier(x) '= '
> 
> You're suggesting the Identifier begins DeclaratorInitializer, but it must start with a Declarator.  We don't have one, because Declarator must start with BasicType2.  This is where I think the bug in the grammar is.  If BasicType2 were optional, then the parse would complete as you showed.

Yes D2 grammar docs turn out to be wrong.  I was using D1 grammar for my parsing exercise.  In D1, Declarator can be just Identifier.  Therefore I was able to reduce the statement correctly.