From: Robert Griesemer Date: Wed, 9 Jul 2008 17:45:04 +0000 (-0700) Subject: - more fixes to parser X-Git-Tag: weekly.2009-11-06~3536 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=1e9adf82289d15dd53141f345f43b1611d36f763;p=gostls13.git - more fixes to parser SVN=126511 --- diff --git a/usr/gri/src/parser.go b/usr/gri/src/parser.go index 82aca39c2a..5238be5e49 100644 --- a/usr/gri/src/parser.go +++ b/usr/gri/src/parser.go @@ -161,16 +161,39 @@ func (P *Parser) ParseChannelType() { } +func (P *Parser) ParseParameters(); +func (P *Parser) TryResult() bool; + + +func (P *Parser) ParseMethodDecl() { + P.Trace("MethodDecl"); + P.ParseIdent(); + P.ParseParameters(); + P.TryResult(); + P.Optional(Scanner.SEMICOLON); + P.Ecart(); +} + + func (P *Parser) ParseInterfaceType() { P.Trace("InterfaceType"); - panic "InterfaceType"; + P.Expect(Scanner.INTERFACE); + P.Expect(Scanner.LBRACE); + for P.tok != Scanner.RBRACE { + P.ParseMethodDecl(); + } + P.Next(); P.Ecart(); } +func (P *Parser) ParseAnonymousSignature(); + + func (P *Parser) ParseFunctionType() { P.Trace("FunctionType"); - panic "FunctionType"; + P.Expect(Scanner.FUNC); + P.ParseAnonymousSignature(); P.Ecart(); } @@ -410,15 +433,39 @@ func (P *Parser) ParseParameters() { } -func (P *Parser) ParseResult() { - P.Trace("Result"); +func (P *Parser) TryResult() bool { + P.Trace("Result (try)"); + res := false; if P.tok == Scanner.LPAREN { // TODO: here we allow empty returns - should proably fix this P.ParseParameters(); + res = true; } else { - P.ParseType(); + res = P.TryType(); } P.Ecart(); + return res; +} + + +// Anonymous signatures +// +// (params) +// (params) type +// (params) (results) +// (recv) . (params) +// (recv) . (params) type +// (recv) . (params) (results) + +func (P *Parser) ParseAnonymousSignature() { + P.Trace("AnonymousSignature"); + P.ParseParameters(); + if P.tok == Scanner.PERIOD { + P.Next(); + P.ParseParameters(); + } + P.TryResult(); + P.Ecart(); } @@ -436,19 +483,9 @@ func (P *Parser) ParseNamedSignature() { if P.tok == Scanner.LPAREN { P.ParseParameters(); } - P.ParseIdent(); // function name - P.ParseParameters(); - - // TODO factor this code - switch P.tok { - case Scanner.IDENT, Scanner.LBRACK, Scanner.CHAN, Scanner.INTERFACE, - Scanner.FUNC, Scanner.MAP, Scanner.STRUCT, Scanner.MUL, Scanner.LPAREN: - P.ParseResult(); - default: - break; - } + P.TryResult(); P.Ecart(); }