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