- more fixes to parser

SVN=126511
diff --git a/usr/gri/src/parser.go b/usr/gri/src/parser.go
index 82aca39..5238be5 100644
--- a/usr/gri/src/parser.go
+++ b/usr/gri/src/parser.go
@@ -161,16 +161,39 @@
 }
 
 
-func (P *Parser) ParseInterfaceType() {
-	P.Trace("InterfaceType");
-	panic "InterfaceType";
+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");
+	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) 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 @@
 	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();
 }