summaryrefslogtreecommitdiff
path: root/usr/gri/pretty/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'usr/gri/pretty/parser.go')
-rw-r--r--usr/gri/pretty/parser.go38
1 files changed, 11 insertions, 27 deletions
diff --git a/usr/gri/pretty/parser.go b/usr/gri/pretty/parser.go
index 4712996d9..4d37c87ad 100644
--- a/usr/gri/pretty/parser.go
+++ b/usr/gri/pretty/parser.go
@@ -8,8 +8,7 @@
//
// A client may parse the entire program (ParseProgram), only the package
// clause (ParsePackageClause), or the package clause and the import
-// declarations (ParseImportDecls). The resulting AST represents the part
-// of the program that is parsed.
+// declarations (ParseImportDecls).
//
package Parser
@@ -70,23 +69,11 @@ type Parser struct {
// ----------------------------------------------------------------------------
// Helper functions
-func unimplemented() {
- panic("unimplemented");
-}
-
-
func unreachable() {
panic("unreachable");
}
-func assert(pred bool) {
- if !pred {
- panic("assertion failed");
- }
-}
-
-
// ----------------------------------------------------------------------------
// Parsing support
@@ -178,13 +165,6 @@ func (P *Parser) expect(tok int) {
}
-func (P *Parser) OptSemicolon() {
- if P.tok == token.SEMICOLON {
- P.next();
- }
-}
-
-
// ----------------------------------------------------------------------------
// Common productions
@@ -194,7 +174,6 @@ func (P *Parser) parseStatement() ast.Stat;
func (P *Parser) parseDeclaration() ast.Decl;
-// If scope != nil, lookup identifier in scope. Otherwise create one.
func (P *Parser) parseIdent() *ast.Ident {
if P.trace {
defer un(trace(P, "Ident"));
@@ -662,7 +641,9 @@ func (P *Parser) parseStructType() ast.Expr {
break;
}
}
- P.OptSemicolon();
+ if P.tok == token.SEMICOLON {
+ P.next();
+ }
end = P.pos;
P.expect(token.RBRACE);
@@ -812,9 +793,8 @@ func (P *Parser) parseStringLit() ast.Expr {
defer un(trace(P, "StringLit"));
}
- assert(P.tok == token.STRING);
var x ast.Expr = &ast.BasicLit{P.pos, P.tok, P.val};
- P.next();
+ P.expect(token.STRING); // always satisfied
for P.tok == token.STRING {
y := &ast.BasicLit{P.pos, P.tok, P.val};
@@ -1605,7 +1585,9 @@ func (P *Parser) parseImportDecls() *vector.Vector {
list := vector.New(0);
for P.tok == token.IMPORT {
list.Push(P.parseDecl(token.IMPORT));
- P.OptSemicolon();
+ if P.tok == token.SEMICOLON {
+ P.next();
+ }
}
return list;
@@ -1651,7 +1633,9 @@ func (P *Parser) ParseProgram() *ast.Program {
list := P.parseImportDecls();
for P.tok != token.EOF {
list.Push(P.parseDeclaration());
- P.OptSemicolon();
+ if P.tok == token.SEMICOLON {
+ P.next();
+ }
}
// convert list