Commit 82fbbdfc authored by Robert Griesemer's avatar Robert Griesemer

snapshot

- fixed expression and statement printing
- missing: declarations, comments

R=r
OCL=17207
CL=17207
parent 84523402
...@@ -11,7 +11,22 @@ pretty: pretty.6 ...@@ -11,7 +11,22 @@ pretty: pretty.6
test: pretty test: pretty
pretty -s *.go pretty -s *.go
pretty -s ../gosrc/*.go pretty -s ../gosrc/*.go
pretty -s $(GOROOT)/test/*.go #pretty -s $(GOROOT)/test/*.go # contains incorrect programs
pretty -s $(GOROOT)/test/235.go
pretty -s $(GOROOT)/test/args.go
pretty -s $(GOROOT)/test/bufiolib.go
pretty -s $(GOROOT)/test/char_lit.go
pretty -s $(GOROOT)/test/complit.go
pretty -s $(GOROOT)/test/const.go
pretty -s $(GOROOT)/test/dialgoogle.go
pretty -s $(GOROOT)/test/empty.go
pretty -s $(GOROOT)/test/env.go
pretty -s $(GOROOT)/test/float_lit.go
pretty -s $(GOROOT)/test/fmt_test.go
pretty -s $(GOROOT)/test/for.go
pretty -s $(GOROOT)/test/func.go
pretty -s $(GOROOT)/test/func1.go
pretty -s $(GOROOT)/test/func2.go
pretty -s $(GOROOT)/src/pkg/*.go pretty -s $(GOROOT)/src/pkg/*.go
pretty -s $(GOROOT)/src/lib/*.go pretty -s $(GOROOT)/src/lib/*.go
pretty -s $(GOROOT)/src/lib/*/*.go pretty -s $(GOROOT)/src/lib/*/*.go
......
...@@ -6,9 +6,9 @@ package Node ...@@ -6,9 +6,9 @@ package Node
import Scanner "scanner" import Scanner "scanner"
type Node interface {}
type ( type (
Node interface {};
Type struct; Type struct;
Expr struct; Expr struct;
Stat struct; Stat struct;
...@@ -56,20 +56,6 @@ func (p *List) Add (x Node) { ...@@ -56,20 +56,6 @@ func (p *List) Add (x Node) {
} }
/*
func (p *List) Print() {
print("(");
for i, n := 0, p.len(); i < n; i++ {
if i > 0 {
print(", ");
}
p.at(i).Print();
}
print(")");
}
*/
export func NewList() *List { export func NewList() *List {
p := new(List); p := new(List);
p.a = new([] Node, 10) [0 : 0]; p.a = new([] Node, 10) [0 : 0];
...@@ -110,19 +96,11 @@ export func NewType(pos, tok int) *Type { ...@@ -110,19 +96,11 @@ export func NewType(pos, tok int) *Type {
// Expression pairs are represented as binary expressions with operator ":" // Expression pairs are represented as binary expressions with operator ":"
// Expression lists are represented as binary expressions with operator "," // Expression lists are represented as binary expressions with operator ","
export type Val struct {
i int;
f float;
s string;
t *Type;
}
export type Expr struct { export type Expr struct {
pos, tok int; pos, tok int;
x, y *Expr; // binary (x, y) and unary (y) expressions x, y *Expr; // binary (x, y) and unary (y) expressions
ident string; // identifiers s string; // identifiers and literals
val *Val; // literals t *Type; // declarations and composite literals
} }
...@@ -138,28 +116,6 @@ func (x *Expr) len() int { ...@@ -138,28 +116,6 @@ func (x *Expr) len() int {
} }
/*
func (x *Expr) Print() {
switch {
case x == nil:
print("nil");
case x.val != nil:
print(x.val.s);
default:
if x.x == nil {
print(Scanner.TokenName(x.tok));
} else {
x.x.Print();
print(" ");
print(Scanner.TokenName(x.tok));
print(" ");
}
x.y.Print();
}
}
*/
export func NewExpr(pos, tok int, x, y *Expr) *Expr { export func NewExpr(pos, tok int, x, y *Expr) *Expr {
e := new(Expr); e := new(Expr);
e.pos, e.tok, e.x, e.y = pos, tok, x, y; e.pos, e.tok, e.x, e.y = pos, tok, x, y;
...@@ -167,16 +123,9 @@ export func NewExpr(pos, tok int, x, y *Expr) *Expr { ...@@ -167,16 +123,9 @@ export func NewExpr(pos, tok int, x, y *Expr) *Expr {
} }
export func NewIdent(pos int, ident string) *Expr { export func NewLit(pos, tok int, s string) *Expr {
e := new(Expr);
e.pos, e.tok, e.ident = pos, Scanner.IDENT, ident;
return e;
}
export func NewVal(pos, tok int, val *Val) *Expr {
e := new(Expr); e := new(Expr);
e.pos, e.tok, e.val = pos, tok, val; e.pos, e.tok, e.s = pos, tok, s;
return e; return e;
} }
...@@ -186,9 +135,8 @@ export func NewVal(pos, tok int, val *Val) *Expr { ...@@ -186,9 +135,8 @@ export func NewVal(pos, tok int, val *Val) *Expr {
export type Stat struct { export type Stat struct {
pos, tok int; pos, tok int;
init *Stat; init, post *Stat;
expr *Expr; lhs, expr *Expr;
post *Stat;
block *List; block *List;
decl *Decl; decl *Decl;
} }
...@@ -204,14 +152,6 @@ export func NewStat(pos, tok int) *Stat { ...@@ -204,14 +152,6 @@ export func NewStat(pos, tok int) *Stat {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Declarations // Declarations
export type VarDeclList struct {
}
func (d *VarDeclList) Print() {
}
export type Decl struct { export type Decl struct {
pos, tok int; pos, tok int;
exported bool; exported bool;
......
...@@ -66,7 +66,7 @@ func (P *Parser) Next() { ...@@ -66,7 +66,7 @@ func (P *Parser) Next() {
P.opt_semi = false; P.opt_semi = false;
if P.verbose { if P.verbose {
P.PrintIndent(); P.PrintIndent();
print("[", P.pos, "] ", Scanner.TokenName(P.tok), "\n"); print("[", P.pos, "] ", Scanner.TokenString(P.tok), "\n");
} }
} }
...@@ -89,7 +89,7 @@ func (P *Parser) Error(pos int, msg string) { ...@@ -89,7 +89,7 @@ func (P *Parser) Error(pos int, msg string) {
func (P *Parser) Expect(tok int) { func (P *Parser) Expect(tok int) {
if P.tok != tok { if P.tok != tok {
P.Error(P.pos, "expected '" + Scanner.TokenName(tok) + "', found '" + Scanner.TokenName(P.tok) + "'"); P.Error(P.pos, "expected '" + Scanner.TokenString(tok) + "', found '" + Scanner.TokenString(P.tok) + "'");
} }
P.Next(); // make progress in any case P.Next(); // make progress in any case
} }
...@@ -116,10 +116,10 @@ func (P *Parser) ParseIdent() *Node.Expr { ...@@ -116,10 +116,10 @@ func (P *Parser) ParseIdent() *Node.Expr {
var x *Node.Expr; var x *Node.Expr;
if P.tok == Scanner.IDENT { if P.tok == Scanner.IDENT {
x = Node.NewIdent(P.pos, P.val); x = Node.NewLit(P.pos, Scanner.IDENT, P.val);
if P.verbose { if P.verbose {
P.PrintIndent(); P.PrintIndent();
print("Ident = \"", x.val, "\"\n"); print("Ident = \"", x.s, "\"\n");
} }
P.Next(); P.Next();
} else { } else {
...@@ -238,24 +238,35 @@ func (P *Parser) ParseChannelType() *Node.Type { ...@@ -238,24 +238,35 @@ func (P *Parser) ParseChannelType() *Node.Type {
} }
func (P *Parser) ParseVarDeclList() *Node.VarDeclList { func (P *Parser) ParseVarDeclList() {
P.Trace("VarDeclList"); P.Trace("VarDeclList");
list := new(Node.VarDeclList); list := Node.NewList();
P.ParseType(); list.Add(P.ParseType());
for P.tok == Scanner.COMMA { for P.tok == Scanner.COMMA {
P.Next(); P.Next();
P.ParseType(); list.Add(P.ParseType());
} }
typ := P.TryType(); typ := P.TryType();
if typ == nil { if typ != nil {
// we must have a list of types // all list entries must be identifiers;
// convert the list into an expression list of identifiers
for i, n := 0, list.len(); i < n; i++ {
t := list.at(i).(*Node.Type);
if t.tok == Scanner.IDENT && t.expr.tok == Scanner.IDENT {
x := t.expr;
} else {
P.Error(t.pos, "identifier expected");
}
}
} else {
// all list entries are types
} }
P.Ecart(); P.Ecart();
return list;
} }
...@@ -263,10 +274,10 @@ func (P *Parser) ParseParameterList() *Node.List { ...@@ -263,10 +274,10 @@ func (P *Parser) ParseParameterList() *Node.List {
P.Trace("ParameterList"); P.Trace("ParameterList");
list := Node.NewList(); list := Node.NewList();
list.Add(P.ParseVarDeclList()); P.ParseVarDeclList();
for P.tok == Scanner.COMMA { for P.tok == Scanner.COMMA {
P.Next(); P.Next();
list.Add(P.ParseVarDeclList()); P.ParseVarDeclList();
} }
P.Ecart(); P.Ecart();
...@@ -394,7 +405,7 @@ func (P *Parser) ParseStructType() *Node.Type { ...@@ -394,7 +405,7 @@ func (P *Parser) ParseStructType() *Node.Type {
P.Next(); P.Next();
t.list = Node.NewList(); t.list = Node.NewList();
for P.tok == Scanner.IDENT { for P.tok == Scanner.IDENT {
t.list.Add(P.ParseVarDeclList()); P.ParseVarDeclList();
if P.tok != Scanner.RBRACE { if P.tok != Scanner.RBRACE {
P.Expect(Scanner.SEMICOLON); P.Expect(Scanner.SEMICOLON);
} }
...@@ -529,18 +540,13 @@ func (P *Parser) ParseOperand() *Node.Expr { ...@@ -529,18 +540,13 @@ func (P *Parser) ParseOperand() *Node.Expr {
P.expr_lev--; P.expr_lev--;
P.Expect(Scanner.RPAREN); P.Expect(Scanner.RPAREN);
case Scanner.INT, Scanner.FLOAT: case Scanner.INT, Scanner.FLOAT, Scanner.STRING:
val := new(Node.Val); x = Node.NewLit(P.pos, P.tok, P.val);
val.s = P.val;
x = Node.NewVal(P.pos, P.tok, val);
P.Next(); P.Next();
if x.tok == Scanner.STRING {
case Scanner.STRING: for ; P.tok == Scanner.STRING; P.Next() {
val := new(Node.Val); x.s += P.val;
val.s = P.val; }
x = Node.NewVal(P.pos, Scanner.STRING, val);
for P.Next(); P.tok == Scanner.STRING; P.Next() {
val.s += P.val;
} }
case Scanner.FUNC: case Scanner.FUNC:
...@@ -744,12 +750,12 @@ func (P *Parser) ParseSimpleStat() *Node.Stat { ...@@ -744,12 +750,12 @@ func (P *Parser) ParseSimpleStat() *Node.Stat {
P.Trace("SimpleStat"); P.Trace("SimpleStat");
var s *Node.Stat; var s *Node.Stat;
list := P.ParseExpressionList(); x := P.ParseExpressionList();
switch P.tok { switch P.tok {
case Scanner.COLON: case Scanner.COLON:
// label declaration // label declaration
if list.len() == 1 { if x.len() == 1 {
} else { } else {
P.Error(P.pos, "illegal label declaration"); P.Error(P.pos, "illegal label declaration");
} }
...@@ -763,21 +769,22 @@ func (P *Parser) ParseSimpleStat() *Node.Stat { ...@@ -763,21 +769,22 @@ func (P *Parser) ParseSimpleStat() *Node.Stat {
Scanner.XOR_ASSIGN, Scanner.SHL_ASSIGN, Scanner.SHR_ASSIGN: Scanner.XOR_ASSIGN, Scanner.SHL_ASSIGN, Scanner.SHR_ASSIGN:
s = Node.NewStat(P.pos, P.tok); s = Node.NewStat(P.pos, P.tok);
P.Next(); P.Next();
s.lhs = x;
s.expr = P.ParseExpressionList(); s.expr = P.ParseExpressionList();
default: default:
if P.tok == Scanner.INC || P.tok == Scanner.DEC { if P.tok == Scanner.INC || P.tok == Scanner.DEC {
s = Node.NewStat(P.pos, P.tok); s = Node.NewStat(P.pos, P.tok);
if list.len() == 1 { if x.len() == 1 {
s.expr = list; s.expr = x;
} else { } else {
P.Error(P.pos, "more then one operand"); P.Error(P.pos, "more then one operand");
} }
P.Next(); P.Next();
} else { } else {
s = Node.NewStat(P.pos, 0); // TODO give this a token value s = Node.NewStat(P.pos, 0); // TODO give this a token value
if list.len() == 1 { if x.len() == 1 {
s.expr = list; s.expr = x;
} else { } else {
P.Error(P.pos, "syntax error"); P.Error(P.pos, "syntax error");
} }
...@@ -830,7 +837,7 @@ func (P *Parser) ParseControlFlowStat(tok int) *Node.Stat { ...@@ -830,7 +837,7 @@ func (P *Parser) ParseControlFlowStat(tok int) *Node.Stat {
func (P *Parser) ParseControlClause(keyword int) *Node.Stat { func (P *Parser) ParseControlClause(keyword int) *Node.Stat {
P.Trace("StatHeader"); P.Trace("ControlClause");
s := Node.NewStat(P.pos, keyword); s := Node.NewStat(P.pos, keyword);
P.Expect(keyword); P.Expect(keyword);
...@@ -872,9 +879,9 @@ func (P *Parser) ParseIfStat() *Node.Stat { ...@@ -872,9 +879,9 @@ func (P *Parser) ParseIfStat() *Node.Stat {
if P.tok == Scanner.ELSE { if P.tok == Scanner.ELSE {
P.Next(); P.Next();
if P.tok == Scanner.IF { if P.tok == Scanner.IF {
P.ParseIfStat(); s.post = P.ParseIfStat();
} else { } else {
P.ParseStatement(); s.post = P.ParseStatement();
} }
} }
...@@ -1005,12 +1012,6 @@ func (P *Parser) ParseFallthroughStat() *Node.Stat { ...@@ -1005,12 +1012,6 @@ func (P *Parser) ParseFallthroughStat() *Node.Stat {
} }
func (P *Parser) ParseEmptyStat() {
P.Trace("EmptyStat");
P.Ecart();
}
func (P *Parser) ParseRangeStat() *Node.Stat { func (P *Parser) ParseRangeStat() *Node.Stat {
P.Trace("RangeStat"); P.Trace("RangeStat");
...@@ -1026,6 +1027,12 @@ func (P *Parser) ParseRangeStat() *Node.Stat { ...@@ -1026,6 +1027,12 @@ func (P *Parser) ParseRangeStat() *Node.Stat {
} }
func (P *Parser) ParseEmptyStat() {
P.Trace("EmptyStat");
P.Ecart();
}
func (P *Parser) ParseStatement() *Node.Stat { func (P *Parser) ParseStatement() *Node.Stat {
P.Trace("Statement"); P.Trace("Statement");
indent := P.indent; indent := P.indent;
......
...@@ -13,7 +13,6 @@ export type Printer struct { ...@@ -13,7 +13,6 @@ export type Printer struct {
indent int; // indentation level indent int; // indentation level
semi bool; // pending ";" semi bool; // pending ";"
newl bool; // pending "\n" newl bool; // pending "\n"
prec int; // operator precedence
} }
...@@ -32,6 +31,11 @@ func (P *Printer) String(s string) { ...@@ -32,6 +31,11 @@ func (P *Printer) String(s string) {
} }
func (P *Printer) Token(tok int) {
P.String(Scanner.TokenString(tok));
}
func (P *Printer) NewLine() { // explicit "\n" func (P *Printer) NewLine() { // explicit "\n"
print("\n"); print("\n");
P.semi, P.newl = false, true; P.semi, P.newl = false, true;
...@@ -139,106 +143,68 @@ func (P *Printer) Type(t *Node.Type) { ...@@ -139,106 +143,68 @@ func (P *Printer) Type(t *Node.Type) {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// Expressions // Expressions
func (P *Printer) Val(tok int, val *Node.Val) { func (P *Printer) Expr1(x *Node.Expr, prec1 int) {
P.String(val.s); // for now
}
func (P *Printer) Expr(x *Node.Expr) {
if x == nil { if x == nil {
return; // empty expression list return; // empty expression list
} }
switch x.tok { switch x.tok {
case Scanner.IDENT: case Scanner.IDENT, Scanner.INT, Scanner.STRING, Scanner.FLOAT:
P.String(x.ident); P.String(x.s);
case Scanner.INT, Scanner.STRING, Scanner.FLOAT: case Scanner.COMMA:
P.Val(x.tok, x.val); P.Expr1(x.x, 0);
P.String(", ");
case Scanner.LPAREN: P.Expr1(x.y, 0);
// calls
P.Expr(x.x); case Scanner.PERIOD:
P.String("("); P.Expr1(x.x, 8);
P.Expr(x.y); P.String(".");
P.String(")"); P.Expr1(x.y, 8);
case Scanner.LBRACK: case Scanner.LBRACK:
P.Expr(x.x); P.Expr1(x.x, 8);
P.String("["); P.String("[");
P.Expr(x.y); P.Expr1(x.y, 0);
P.String("]"); P.String("]");
case Scanner.LPAREN:
P.Expr1(x.x, 8);
P.String("(");
P.Expr1(x.y, 0);
P.String(")");
default: default:
if x.x == nil { if x.x == nil {
// unary expression // unary expression
P.String(Scanner.TokenName(x.tok)); P.Token(x.tok);
P.Expr(x.y); P.Expr1(x.y, 7);
} else { } else {
// binary expression: print ()'s if necessary // binary expression: print ()'s if necessary
// TODO: pass precedence as parameter instead prec := Scanner.Precedence(x.tok);
outer := P.prec; if prec < prec1 {
P.prec = Scanner.Precedence(x.tok);
if P.prec < outer {
print("("); print("(");
} }
P.Expr(x.x); P.Expr1(x.x, prec);
if x.tok != Scanner.PERIOD && x.tok != Scanner.COMMA { P.String(" ");
P.String(" "); P.Token(x.tok);
} P.String(" ");
P.String(Scanner.TokenName(x.tok)); P.Expr1(x.y, prec);
if x.tok != Scanner.PERIOD { if prec < prec1 {
P.String(" ");
}
P.Expr(x.y);
if P.prec < outer {
print(")"); print(")");
} }
P.prec = outer;
} }
} }
} }
// ---------------------------------------------------------------------------- func (P *Printer) Expr(x *Node.Expr) {
// Statements P.Expr1(x, 0);
/*
func (P *Printer) DoLabel(x *AST.Label) {
P.indent--;
P.newl = true;
P.Print(x.ident);
P.String(":");
P.indent++;
}
func (P *Printer) DoExprStat(x *AST.ExprStat) {
P.Print(x.expr);
P.semi = true;
}
func (P *Printer) DoAssignment(x *AST.Assignment) {
P.PrintList(x.lhs);
P.String(" " + Scanner.TokenName(x.tok) + " ");
P.PrintList(x.rhs);
P.semi = true;
} }
func (P *Printer) DoIfStat(x *AST.IfStat) { // ----------------------------------------------------------------------------
P.String("if"); // Statements
P.PrintControlClause(x.ctrl);
P.DoBlock(x.then);
if x.has_else {
P.newl = false;
P.String(" else ");
P.Print(x.else_);
}
}
*/
func (P *Printer) Stat(s *Node.Stat) func (P *Printer) Stat(s *Node.Stat)
...@@ -250,9 +216,15 @@ func (P *Printer) StatementList(list *Node.List) { ...@@ -250,9 +216,15 @@ func (P *Printer) StatementList(list *Node.List) {
} }
func (P *Printer) Block(list *Node.List) { func (P *Printer) Block(list *Node.List, indent bool) {
P.OpenScope("{"); P.OpenScope("{");
if !indent {
P.indent--;
}
P.StatementList(list); P.StatementList(list);
if !indent {
P.indent++;
}
P.CloseScope("}"); P.CloseScope("}");
} }
...@@ -269,7 +241,7 @@ func (P *Printer) ControlClause(s *Node.Stat) { ...@@ -269,7 +241,7 @@ func (P *Printer) ControlClause(s *Node.Stat) {
P.Expr(s.expr); P.Expr(s.expr);
P.semi = false; P.semi = false;
} }
if s.post != nil { if s.tok == Scanner.FOR && s.post != nil {
P.semi = true; P.semi = true;
P.String(" "); P.String(" ");
P.Stat(s.post); P.Stat(s.post);
...@@ -286,6 +258,7 @@ func (P *Printer) Stat(s *Node.Stat) { ...@@ -286,6 +258,7 @@ func (P *Printer) Stat(s *Node.Stat) {
P.String("<nil stat>"); P.String("<nil stat>");
return; return;
} }
switch s.tok { switch s.tok {
case 0: // TODO use a real token const case 0: // TODO use a real token const
P.Expr(s.expr); P.Expr(s.expr);
...@@ -298,23 +271,43 @@ func (P *Printer) Stat(s *Node.Stat) { ...@@ -298,23 +271,43 @@ func (P *Printer) Stat(s *Node.Stat) {
Scanner.SUB_ASSIGN, Scanner.MUL_ASSIGN, Scanner.QUO_ASSIGN, Scanner.SUB_ASSIGN, Scanner.MUL_ASSIGN, Scanner.QUO_ASSIGN,
Scanner.REM_ASSIGN, Scanner.AND_ASSIGN, Scanner.OR_ASSIGN, Scanner.REM_ASSIGN, Scanner.AND_ASSIGN, Scanner.OR_ASSIGN,
Scanner.XOR_ASSIGN, Scanner.SHL_ASSIGN, Scanner.SHR_ASSIGN: Scanner.XOR_ASSIGN, Scanner.SHL_ASSIGN, Scanner.SHR_ASSIGN:
P.String(Scanner.TokenName(s.tok)); P.Expr(s.lhs);
P.String(" ");
P.Token(s.tok);
P.String(" "); P.String(" ");
P.Expr(s.expr); P.Expr(s.expr);
P.semi = true; P.semi = true;
case Scanner.INC, Scanner.DEC: case Scanner.INC, Scanner.DEC:
P.Expr(s.expr); P.Expr(s.expr);
P.String(Scanner.TokenName(s.tok)); P.Token(s.tok);
P.semi = true; P.semi = true;
case Scanner.IF, Scanner.FOR, Scanner.SWITCH, Scanner.SELECT: case Scanner.LBRACE:
P.String(Scanner.TokenName(s.tok)); P.Block(s.block, true);
case Scanner.IF:
P.String("if");
P.ControlClause(s); P.ControlClause(s);
P.Block(s.block); P.Block(s.block, true);
if s.post != nil {
P.newl = false;
P.String(" else ");
P.Stat(s.post);
}
case Scanner.FOR:
P.String("for");
P.ControlClause(s);
P.Block(s.block, true);
case Scanner.SWITCH, Scanner.SELECT:
P.Token(s.tok);
P.ControlClause(s);
P.Block(s.block, false);
case Scanner.CASE, Scanner.DEFAULT: case Scanner.CASE, Scanner.DEFAULT:
P.String(Scanner.TokenName(s.tok)); P.Token(s.tok);
if s.expr != nil { if s.expr != nil {
P.String(" "); P.String(" ");
P.Expr(s.expr); P.Expr(s.expr);
...@@ -323,9 +316,10 @@ func (P *Printer) Stat(s *Node.Stat) { ...@@ -323,9 +316,10 @@ func (P *Printer) Stat(s *Node.Stat) {
P.OpenScope(""); P.OpenScope("");
P.StatementList(s.block); P.StatementList(s.block);
P.CloseScope(""); P.CloseScope("");
case Scanner.GO, Scanner.RETURN, Scanner.BREAK, Scanner.CONTINUE, Scanner.GOTO: case Scanner.GO, Scanner.RETURN, Scanner.BREAK, Scanner.CONTINUE, Scanner.GOTO:
P.String("go "); P.Token(s.tok);
P.String(" ");
P.Expr(s.expr); P.Expr(s.expr);
P.semi = true; P.semi = true;
...@@ -341,15 +335,6 @@ func (P *Printer) Stat(s *Node.Stat) { ...@@ -341,15 +335,6 @@ func (P *Printer) Stat(s *Node.Stat) {
/* /*
func (P *Printer) DoImportDecl(x *AST.ImportDecl) {
if x.ident != nil {
P.Print(x.ident);
P.String(" ");
}
P.String(x.file);
}
func (P *Printer) DoFuncDecl(x *AST.FuncDecl) { func (P *Printer) DoFuncDecl(x *AST.FuncDecl) {
P.String("func "); P.String("func ");
if x.typ.recv != nil { if x.typ.recv != nil {
...@@ -383,7 +368,7 @@ func (P *Printer) Declaration(d *Node.Decl) { ...@@ -383,7 +368,7 @@ func (P *Printer) Declaration(d *Node.Decl) {
if d.exported { if d.exported {
P.String("export "); P.String("export ");
} }
P.String(Scanner.TokenName(d.tok)); P.Token(d.tok);
P.String(" "); P.String(" ");
} }
...@@ -417,10 +402,11 @@ func (P *Printer) Declaration(d *Node.Decl) { ...@@ -417,10 +402,11 @@ func (P *Printer) Declaration(d *Node.Decl) {
panic("must be a func declaration"); panic("must be a func declaration");
} }
P.String(" "); P.String(" ");
P.Block(d.list); P.Block(d.list, true);
} }
} }
// extra newline at the top level
if P.level == 0 { if P.level == 0 {
P.NewLine(); P.NewLine();
} }
......
...@@ -106,7 +106,7 @@ export const ( ...@@ -106,7 +106,7 @@ export const (
) )
export func TokenName(tok int) string { export func TokenString(tok int) string {
switch (tok) { switch (tok) {
case ILLEGAL: return "ILLEGAL"; case ILLEGAL: return "ILLEGAL";
...@@ -233,7 +233,7 @@ func init() { ...@@ -233,7 +233,7 @@ func init() {
Keywords = new(map [string] int); Keywords = new(map [string] int);
for i := KEYWORDS_BEG + 1; i < KEYWORDS_END; i++ { for i := KEYWORDS_BEG + 1; i < KEYWORDS_END; i++ {
Keywords[TokenName(i)] = i; Keywords[TokenString(i)] = i;
} }
// Provide column information in error messages for gri only... // Provide column information in error messages for gri only...
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment