digitalmars.D - Question about the syntax of Mixin statement
- Sammy (92/92) Aug 24 2004 I am working on the Grammar of D ( yes, another ).
- Ivan Senji (19/111) Aug 24 2004 Mixin : "mixin" ( "." | ["typeof" "(" Expr ")" "." ] Ident ) [ "!" "(" ...
- Sammy (19/30) Aug 24 2004 If i read it right, this grammar can derives the following sentences:
- Ivan Senji (11/43) Aug 24 2004 Yes you are right :) i changed the first rule to:
- Sammy (12/29) Aug 24 2004 NB -> Nota Bene
I am working on the Grammar of D ( yes, another ). I first began to work with the html version of the grammar published on the DM site. Then i had a look into parse.c to see how it was programmed. As i saw some differences i decided to work only with the parse.c source code. I am almost done with it. But i have some questions. Here is the syntax of mixin from the D spec: TemplateMixin: mixin TemplateIdentifier ; mixin TemplateIdentifier MixinIdentifier ; mixin TemplateIdentifier !( TemplateArgumentList ) ; mixin TemplateIdentifier !( TemplateArgumentList ) MixinIdentifier ; MixinIdentifier: Identifier This syntax, is much simpler than what is expressed in parse.c Here is an EBNF expression that closely match the parseMixin() function: Mixin : "mixin" ( "." | ["typeof" "(" Expr ")" "." ] Ident ) [ "!" "(" Args ")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" From that, you can see that: mixin .!(args) ident; mixin ..ident ident; mixin ..ident; mixin .; are valid statements from the syntaxic point of view. My question is: Is this is Ok ? If not, than, the correct syntax might be: Mixin : "mixin" ( "." Ident | ["typeof" "(" Expr ")" "." ] Ident ) [ "!" "(" Args ")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" giving with the 4 preceding statements: mixin .ident!(args) ident; mixin .ident.ident ident; mixin .ident.ident; mixin .ident; If not, what is the full syntax of Mixin ? ----- Here is the syntax of mixin, translated in pseudo EBNF, from the source code: Mixin : "mixin" ( "." | ["typeof" "(" Expr ")" "." ] Ident ) [ "!" "(" Args ")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" Here is the source of parseMixin: Dsymbol *Parser::parseMixin() { nextToken(); // to skip over "mixin" if (token.value == TOKdot) { id = Id::empty; } else { if (token.value == TOKtypeof) { nextToken(); check(TOKlparen); exp = parseExpression(); check(TOKrparen); check(TOKdot); } if (token.value != TOKidentifier) { error("identifier expected, not %s", token.toChars()); goto Lerr; } } while (1) { nextToken(); if (token.value == TOKnot) { parseTemplateArgumentList() // "(" Args ")" nextToken(); } if (token.value != TOKdot) break; nextToken(); if (token.value != TOKidentifier) { error("identifier expected following '.' instead of '%s'", token.toChars()); break; } } if (token.value == TOKidentifier) { nextToken(); } if (token.value != TOKsemicolon) error("';' expected after mixin"); nextToken(); } --
Aug 24 2004
Mixin : "mixin" ( "." | ["typeof" "(" Expr ")" "." ] Ident ) [ "!" "(" Args ")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" This is what i basically wrote in my gramamr as: <mixin> -> mixin . <MixinPart2> <mixin> -> mixin typeof ( <Expression> ) . idn <MixinPart2> <mixin> -> mixin idn <MixinPart2> <MixinPart2> -> ! <TemplateArgumentList> . idn <MixinPart2> <MixinPart2> -> ! <TemplateArgumentList> <MixinEnd> <MixinPart2> -> . idn <MixinPart2> <MixinPart2> -> <MixinEnd> <MixinEnd> -> idn ; <MixinEnd> -> ; And as far as i can tell, that is the right syntax (and i have tested it quite a lot!) "Sammy" <not there.com> wrote in message news:cgf3b8$n5r$1 digitaldaemon.com...I am working on the Grammar of D ( yes, another ). I first began to work with the html version of the grammar published on the DM site. Then i had a look into parse.c to see how it was programmed. As i saw some differences i decided to work only with the parse.c source code. I am almost done with it. But i have some questions. Here is the syntax of mixin from the D spec: TemplateMixin: mixin TemplateIdentifier ; mixin TemplateIdentifier MixinIdentifier ; mixin TemplateIdentifier !( TemplateArgumentList ) ; mixin TemplateIdentifier !( TemplateArgumentList ) MixinIdentifier ; MixinIdentifier: Identifier This syntax, is much simpler than what is expressed in parse.c Here is an EBNF expression that closely match the parseMixin() function: Mixin : "mixin" ( "." | ["typeof" "(" Expr ")" "." ] Ident ) [ "!" "("Args")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" From that, you can see that: mixin .!(args) ident; mixin ..ident ident; mixin ..ident; mixin .; are valid statements from the syntaxic point of view. My question is: Is this is Ok ? If not, than, the correct syntax might be: Mixin : "mixin" ( "." Ident | ["typeof" "(" Expr ")" "." ] Ident ) [ "!" "(" Args ")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" giving with the 4 preceding statements: mixin .ident!(args) ident; mixin .ident.ident ident; mixin .ident.ident; mixin .ident; If not, what is the full syntax of Mixin ? ----- Here is the syntax of mixin, translated in pseudo EBNF, from the source code: Mixin : "mixin" ( "." | ["typeof" "(" Expr ")" "." ] Ident ) [ "!" "("Args")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" Here is the source of parseMixin: Dsymbol *Parser::parseMixin() { nextToken(); // to skip over "mixin" if (token.value == TOKdot) { id = Id::empty; } else { if (token.value == TOKtypeof) { nextToken(); check(TOKlparen); exp = parseExpression(); check(TOKrparen); check(TOKdot); } if (token.value != TOKidentifier) { error("identifier expected, not %s", token.toChars()); goto Lerr; } } while (1) { nextToken(); if (token.value == TOKnot) { parseTemplateArgumentList() // "(" Args ")" nextToken(); } if (token.value != TOKdot) break; nextToken(); if (token.value != TOKidentifier) { error("identifier expected following '.' instead of '%s'", token.toChars()); break; } } if (token.value == TOKidentifier) { nextToken(); } if (token.value != TOKsemicolon) error("';' expected after mixin"); nextToken(); } --
Aug 24 2004
"Ivan Senji" <ivan.senji public.srce.hr> wrote in message news:cgf6fd$o53$1 digitaldaemon.com...This is what i basically wrote in my gramamr as: (1) <mixin> -> mixin . <MixinPart2> (2) <mixin> -> mixin typeof ( <Expression> ) . idn <MixinPart2> (3) <mixin> -> mixin idn <MixinPart2> (4) <MixinPart2> -> ! <TemplateArgumentList> . idn <MixinPart2> (5) <MixinPart2> -> ! <TemplateArgumentList> <MixinEnd> (6) <MixinPart2> -> . idn <MixinPart2> (7) <MixinPart2> -> <MixinEnd> (8) <MixinEnd> -> idn ; (9) <MixinEnd> -> ;If i read it right, this grammar can derives the following sentences: mixin . . idn ; ( rules 1,6,9 ) mixin . ! <TAL> ; ( rules: 1,5, 9 ) mixin . ; ( rules: 1,7,9 ) Which does not seems Ok. Of course, these will be eliminated somewhere, in the subsequents phases of the parsing, but not by the syntactic one. Now, this rule, does not permit the above. A dot must always be followed by an ident "mixin" ( "." Ident | ["typeof" "(" Expr ")" "." ] Ident ) [ "!"" (" Args ")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" NB: ( ) means 1 of. [ ] means 0 or 1. ( )... means 1 or more. | indicates alternatives.And as far as i can tell, that is the right syntaxMay be. But it needs more explanations.
Aug 24 2004
"Sammy" <not there.com> wrote in message news:cgfcak$qia$1 digitaldaemon.com..."Ivan Senji" <ivan.senji public.srce.hr> wrote in message news:cgf6fd$o53$1 digitaldaemon.com...Yes you are right :) i changed the first rule to: (1) <mixin> -> mixin . idn <MixinPart2> and i think it should be ok now, although your EBNF rule inpires me to try to rewrite it in a simpler way!This is what i basically wrote in my gramamr as: (1) <mixin> -> mixin . <MixinPart2> (2) <mixin> -> mixin typeof ( <Expression> ) . idn <MixinPart2> (3) <mixin> -> mixin idn <MixinPart2> (4) <MixinPart2> -> ! <TemplateArgumentList> . idn <MixinPart2> (5) <MixinPart2> -> ! <TemplateArgumentList> <MixinEnd> (6) <MixinPart2> -> . idn <MixinPart2> (7) <MixinPart2> -> <MixinEnd> (8) <MixinEnd> -> idn ; (9) <MixinEnd> -> ;If i read it right, this grammar can derives the following sentences: mixin . . idn ; ( rules 1,6,9 ) mixin . ! <TAL> ; ( rules: 1,5, 9 ) mixin . ; ( rules: 1,7,9 ) Which does not seems Ok. Of course, these will be eliminated somewhere, in the subsequents phases of the parsing, but not by the syntactic one. Now, this rule, does not permit the above. A dot must always be followed by an ident"mixin" ( "." Ident | ["typeof" "(" Expr ")" "." ] Ident ) [ "!"" (" Args ")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" NB: ( ) means 1 of. [ ] means 0 or 1. ( )... means 1 or more. | indicates alternatives.I figured this out but what does NB mean? And if ()... means 1 or more then your rule cannot generate mixin idn ; // :)And as far as i can tell, that is the right syntaxMay be. But it needs more explanations.
Aug 24 2004
Yes you are right :) i changed the first rule to: (1) <mixin> -> mixin . idn <MixinPart2> and i think it should be ok now, although your EBNF rule inpires me to try to rewrite it in a simpler way!NB -> Nota Bene a Latin phrase (or its abbreviation) used to indicate that special attention should be paid to something http://www.hyperdictionary.com/search.aspx?define=nota+bene"mixin" ( "." Ident | ["typeof" "(" Expr ")" "." ] Ident ) [ "!"" (" Args ")" ] ( "." Ident [ "!" "(" Args ")" ] )... [Ident] ";" NB: ( ) means 1 of. [ ] means 0 or 1. ( )... means 1 or more. | indicates alternatives.I figured this out but what does NB mean?And if ()... means 1 or more then your rule cannot generate mixin idn ; // :)Yes, you are right. Corrected expression: "mixin" ( "." Ident | ["typeof" "(" Expr ")" "." ] Ident ) [ "!"" (" Args ")" ] [ "." Ident [ "!" "(" Args ")" ] ]... [Ident] ";" And then, after simplification: "mixin" [ "." | "typeof" "(" Expr ")" "." ] ( ident [ "!" "(" Args ")" ] ) / "." [ident] ";" Have to check this one again.
Aug 24 2004