www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Re: problem with declaration grammar?

reply Jerry Quinn <jlquinn optonline.net> writes:
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

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
Feb 20 2009
parent Ellery Newcomer <ellery-newcomer utulsa.edu> writes:
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

match what it does above multiple times.

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

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.
Feb 20 2009