diff options
author | Robert Griesemer <gri@golang.org> | 2008-07-09 10:45:04 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2008-07-09 10:45:04 -0700 |
commit | 5032687209bdc0c21168a9a1c89d1daa9340a103 (patch) | |
tree | 9b68c1e0330456c1cf04c89459fa0b2d5da4f749 /usr/gri/src/parser.go | |
parent | c7640baf67fd6885368ec17dc51d75650222cce2 (diff) | |
download | golang-5032687209bdc0c21168a9a1c89d1daa9340a103.tar.gz |
- more fixes to parser
SVN=126511
Diffstat (limited to 'usr/gri/src/parser.go')
-rw-r--r-- | usr/gri/src/parser.go | 69 |
1 files changed, 53 insertions, 16 deletions
diff --git a/usr/gri/src/parser.go b/usr/gri/src/parser.go index 82aca39c2..5238be5e4 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(); } |