Mercurial > projects > dang
diff parser/Parser.d @ 28:69464d465284 new_gen
Now supporting structs - both read and write. Still a few errors though, so watch out.
author | Anders Johnsen <skabet@gmail.com> |
---|---|
date | Sun, 20 Apr 2008 11:20:28 +0200 |
parents | e331e4e816e4 |
children | 41d23f2762c3 |
line wrap: on
line diff
--- a/parser/Parser.d Sun Apr 20 01:08:50 2008 +0200 +++ b/parser/Parser.d Sun Apr 20 11:20:28 2008 +0200 @@ -25,15 +25,15 @@ while(lexer.peek.type != Tok.EOF) { - declarations ~= parseDecl; + declarations ~= parseRootDecl; } return declarations; } - Decl parseDecl() + Decl parseRootDecl() { - Token t = lexer.next; + Token t = lexer.peek; switch(t.type) { @@ -46,21 +46,24 @@ Tok.Identifier: Identifier type = new Identifier(t); - Token iden = lexer.next; + Token iden = lexer.peek(1); switch(iden.type) { case Tok.Identifier: Identifier identifier = new Identifier(iden); - Token p = lexer.peek(); + Token p = lexer.peek(2); switch(p.type) { case Tok.OpenParentheses: + lexer.next; lexer.next; return parseFunc(type, identifier); case Tok.Seperator: + lexer.next; lexer.next; require(Tok.Seperator); return new VarDecl(type, identifier, null); case Tok.Assign: + lexer.next; lexer.next; lexer.next(); auto exp = parseExpression(); require(Tok.Seperator); @@ -76,6 +79,7 @@ } break; case Tok.Struct: + lexer.next; Token iden = lexer.next; switch(iden.type) { @@ -94,6 +98,61 @@ } } + Decl parseDecl() + { + Token t = lexer.peek; + + switch(t.type) + { + case Tok.Byte, Tok.Ubyte, + Tok.Short, Tok.Ushort, + Tok.Int, Tok.Uint, + Tok.Long, Tok.Ulong, + Tok.Float, Tok.Double, + Tok.Bool, + Tok.Identifier: + Identifier type = new Identifier(t); + + Token iden = lexer.peek(1); + + switch(iden.type) + { + case Tok.Identifier: + Identifier identifier = new Identifier(iden); + Token p = lexer.peek(2); + switch(p.type) + { + case Tok.OpenParentheses: + lexer.next; lexer.next; + return parseFunc(type, identifier); + case Tok.Seperator: + lexer.next; lexer.next; + require(Tok.Seperator); + return new VarDecl(type, identifier, null); + case Tok.Assign: + lexer.next; lexer.next; + lexer.next(); + auto exp = parseExpression(); + require(Tok.Seperator); + return new VarDecl(type, identifier, exp); + default: + char[] c = t.getType; + error("Unexpexted token "~c~" at line "~Integer.toString(__LINE__)); + } + break; + default: + char[] c = t.getType; + error("Unexpexted token "~c~" at line "~Integer.toString(__LINE__)); + } + break; + case Tok.EOF: + return null; + default: + char[] c = t.getType; + error("Unexpexted token "~c~" at line "~Integer.toString(__LINE__)); + } + } + VarDecl[] parseStruct() { VarDecl[] varDecls; @@ -148,6 +207,17 @@ Token n = lexer.peek(1); switch(n.type) { + case Tok.Dot: + Exp iden = parseExpIdentifier(new Identifier(lexer.next)); + switch(lexer.peek.type) + { + case Tok.Assign: + lexer.next; + auto stmt = new ExpStmt(new AssignExp(iden , parseExpression())); + require(Tok.Seperator); + return stmt; + break; + } case Tok.Assign: lexer.next; lexer.next; @@ -249,6 +319,25 @@ // -- Expression parsing -- // private: + Exp parseExpIdentifier(Exp target) + { + switch(lexer.peek.type) + { + case Tok.Dot: + switch(lexer.peek(1).type) + { + case Tok.Identifier: + lexer.next; + return parseExpIdentifier( + new MemberLookup(target, new Identifier(lexer.next))); + default: + throw new Error("Expected identifier after '.'", lexer.peek(1).location); + } + default: + return target; + } + } + Exp parseExpression(int p = 0) { auto exp = P(); @@ -279,6 +368,7 @@ } else if (next.type == Tok.Identifier) { + Exp iden = parseExpIdentifier(new Identifier(next)); switch(lexer.peek.type) { case Tok.OpenParentheses: @@ -294,10 +384,10 @@ } lexer.next(); - return new CallExp(new Identifier(next), args); + return new CallExp(iden, args); default: - return new Identifier(next); + return iden; } } else if (next.type == Tok.Integer)