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.