diff options
Diffstat (limited to 'src/pkg/exp/datafmt/parser.go')
-rw-r--r-- | src/pkg/exp/datafmt/parser.go | 222 |
1 files changed, 111 insertions, 111 deletions
diff --git a/src/pkg/exp/datafmt/parser.go b/src/pkg/exp/datafmt/parser.go index c8144d9f2..653771674 100644 --- a/src/pkg/exp/datafmt/parser.go +++ b/src/pkg/exp/datafmt/parser.go @@ -5,83 +5,83 @@ package datafmt import ( - "container/vector"; - "go/scanner"; - "go/token"; - "os"; - "strconv"; - "strings"; + "container/vector" + "go/scanner" + "go/token" + "os" + "strconv" + "strings" ) // ---------------------------------------------------------------------------- // Parsing type parser struct { - scanner.ErrorVector; - scanner scanner.Scanner; - pos token.Position; // token position - tok token.Token; // one token look-ahead - lit []byte; // token literal - - packs map[string]string; // PackageName -> ImportPath - rules map[string]expr; // RuleName -> Expression + scanner.ErrorVector + scanner scanner.Scanner + pos token.Position // token position + tok token.Token // one token look-ahead + lit []byte // token literal + + packs map[string]string // PackageName -> ImportPath + rules map[string]expr // RuleName -> Expression } func (p *parser) next() { - p.pos, p.tok, p.lit = p.scanner.Scan(); + p.pos, p.tok, p.lit = p.scanner.Scan() switch p.tok { case token.CHAN, token.FUNC, token.INTERFACE, token.MAP, token.STRUCT: // Go keywords for composite types are type names // returned by reflect. Accept them as identifiers. - p.tok = token.IDENT // p.lit is already set correctly + p.tok = token.IDENT // p.lit is already set correctly } } func (p *parser) init(filename string, src []byte) { - p.ErrorVector.Reset(); - p.scanner.Init(filename, src, p, scanner.AllowIllegalChars); // return '@' as token.ILLEGAL w/o error message - p.next(); // initializes pos, tok, lit - p.packs = make(map[string]string); - p.rules = make(map[string]expr); + p.ErrorVector.Reset() + p.scanner.Init(filename, src, p, scanner.AllowIllegalChars) // return '@' as token.ILLEGAL w/o error message + p.next() // initializes pos, tok, lit + p.packs = make(map[string]string) + p.rules = make(map[string]expr) } func (p *parser) errorExpected(pos token.Position, msg string) { - msg = "expected " + msg; + msg = "expected " + msg if pos.Offset == p.pos.Offset { // the error happened at the current position; // make the error message more specific - msg += ", found '" + p.tok.String() + "'"; + msg += ", found '" + p.tok.String() + "'" if p.tok.IsLiteral() { msg += " " + string(p.lit) } } - p.Error(pos, msg); + p.Error(pos, msg) } func (p *parser) expect(tok token.Token) token.Position { - pos := p.pos; + pos := p.pos if p.tok != tok { p.errorExpected(pos, "'"+tok.String()+"'") } - p.next(); // make progress in any case - return pos; + p.next() // make progress in any case + return pos } func (p *parser) parseIdentifier() string { - name := string(p.lit); - p.expect(token.IDENT); - return name; + name := string(p.lit) + p.expect(token.IDENT) + return name } func (p *parser) parseTypeName() (string, bool) { - pos := p.pos; - name, isIdent := p.parseIdentifier(), true; + pos := p.pos + name, isIdent := p.parseIdentifier(), true if p.tok == token.PERIOD { // got a package name, lookup package if importPath, found := p.packs[name]; found { @@ -89,10 +89,10 @@ func (p *parser) parseTypeName() (string, bool) { } else { p.Error(pos, "package not declared: "+name) } - p.next(); - name, isIdent = name+"."+p.parseIdentifier(), false; + p.next() + name, isIdent = name+"."+p.parseIdentifier(), false } - return name, isIdent; + return name, isIdent } @@ -102,99 +102,99 @@ func (p *parser) parseTypeName() (string, bool) { // single identifier only (and thus could be a package name). // func (p *parser) parseRuleName() (string, bool) { - name, isIdent := "", false; + name, isIdent := "", false switch p.tok { case token.IDENT: name, isIdent = p.parseTypeName() case token.DEFAULT: - name = "default"; - p.next(); + name = "default" + p.next() case token.QUO: - name = "/"; - p.next(); + name = "/" + p.next() default: - p.errorExpected(p.pos, "rule name"); - p.next(); // make progress in any case + p.errorExpected(p.pos, "rule name") + p.next() // make progress in any case } - return name, isIdent; + return name, isIdent } func (p *parser) parseString() string { - s := ""; + s := "" if p.tok == token.STRING { - s, _ = strconv.Unquote(string(p.lit)); + s, _ = strconv.Unquote(string(p.lit)) // Unquote may fail with an error, but only if the scanner found // an illegal string in the first place. In this case the error // has already been reported. - p.next(); - return s; + p.next() + return s } else { p.expect(token.STRING) } - return s; + return s } func (p *parser) parseLiteral() literal { - s := strings.Bytes(p.parseString()); + s := strings.Bytes(p.parseString()) // A string literal may contain %-format specifiers. To simplify // and speed up printing of the literal, split it into segments // that start with "%" possibly followed by a last segment that // starts with some other character. - var list vector.Vector; - i0 := 0; + var list vector.Vector + i0 := 0 for i := 0; i < len(s); i++ { if s[i] == '%' && i+1 < len(s) { // the next segment starts with a % format if i0 < i { // the current segment is not empty, split it off - list.Push(s[i0:i]); - i0 = i; + list.Push(s[i0:i]) + i0 = i } - i++; // skip %; let loop skip over char after % + i++ // skip %; let loop skip over char after % } } // the final segment may start with any character // (it is empty iff the string is empty) - list.Push(s[i0:]); + list.Push(s[i0:]) // convert list into a literal - lit := make(literal, list.Len()); + lit := make(literal, list.Len()) for i := 0; i < list.Len(); i++ { lit[i] = list.At(i).([]byte) } - return lit; + return lit } func (p *parser) parseField() expr { - var fname string; + var fname string switch p.tok { case token.ILLEGAL: if string(p.lit) != "@" { return nil } - fname = "@"; - p.next(); + fname = "@" + p.next() case token.MUL: - fname = "*"; - p.next(); + fname = "*" + p.next() case token.IDENT: fname = p.parseIdentifier() default: return nil } - var ruleName string; + var ruleName string if p.tok == token.COLON { - p.next(); - ruleName, _ = p.parseRuleName(); + p.next() + ruleName, _ = p.parseRuleName() } - return &field{fname, ruleName}; + return &field{fname, ruleName} } @@ -204,40 +204,40 @@ func (p *parser) parseOperand() (x expr) { x = p.parseLiteral() case token.LPAREN: - p.next(); - x = p.parseExpression(); + p.next() + x = p.parseExpression() if p.tok == token.SHR { - p.next(); - x = &group{x, p.parseExpression()}; + p.next() + x = &group{x, p.parseExpression()} } - p.expect(token.RPAREN); + p.expect(token.RPAREN) case token.LBRACK: - p.next(); - x = &option{p.parseExpression()}; - p.expect(token.RBRACK); + p.next() + x = &option{p.parseExpression()} + p.expect(token.RBRACK) case token.LBRACE: - p.next(); - x = p.parseExpression(); - var div expr; + p.next() + x = p.parseExpression() + var div expr if p.tok == token.QUO { - p.next(); - div = p.parseExpression(); + p.next() + div = p.parseExpression() } - x = &repetition{x, div}; - p.expect(token.RBRACE); + x = &repetition{x, div} + p.expect(token.RBRACE) default: - x = p.parseField() // may be nil + x = p.parseField() // may be nil } - return x; + return x } func (p *parser) parseSequence() expr { - var list vector.Vector; + var list vector.Vector for x := p.parseOperand(); x != nil; x = p.parseOperand() { list.Push(x) @@ -252,26 +252,26 @@ func (p *parser) parseSequence() expr { } // convert list into a sequence - seq := make(sequence, list.Len()); + seq := make(sequence, list.Len()) for i := 0; i < list.Len(); i++ { seq[i] = list.At(i).(expr) } - return seq; + return seq } func (p *parser) parseExpression() expr { - var list vector.Vector; + var list vector.Vector for { - x := p.parseSequence(); + x := p.parseSequence() if x != nil { list.Push(x) } if p.tok != token.OR { break } - p.next(); + p.next() } // no need for an alternatives if list.Len() < 2 @@ -283,23 +283,23 @@ func (p *parser) parseExpression() expr { } // convert list into a alternatives - alt := make(alternatives, list.Len()); + alt := make(alternatives, list.Len()) for i := 0; i < list.Len(); i++ { alt[i] = list.At(i).(expr) } - return alt; + return alt } func (p *parser) parseFormat() { for p.tok != token.EOF { - pos := p.pos; + pos := p.pos - name, isIdent := p.parseRuleName(); + name, isIdent := p.parseRuleName() switch p.tok { case token.STRING: // package declaration - importPath := p.parseString(); + importPath := p.parseString() // add package declaration if !isIdent { @@ -312,8 +312,8 @@ func (p *parser) parseFormat() { case token.ASSIGN: // format rule - p.next(); - x := p.parseExpression(); + p.next() + x := p.parseExpression() // add rule if _, found := p.rules[name]; !found { @@ -323,8 +323,8 @@ func (p *parser) parseFormat() { } default: - p.errorExpected(p.pos, "package declaration or format rule"); - p.next(); // make progress in any case + p.errorExpected(p.pos, "package declaration or format rule") + p.next() // make progress in any case } if p.tok == token.SEMICOLON { @@ -333,23 +333,23 @@ func (p *parser) parseFormat() { break } } - p.expect(token.EOF); + p.expect(token.EOF) } func remap(p *parser, name string) string { - i := strings.Index(name, "."); + i := strings.Index(name, ".") if i >= 0 { - packageName, suffix := name[0:i], name[i:]; + packageName, suffix := name[0:i], name[i:] // lookup package if importPath, found := p.packs[packageName]; found { name = importPath + suffix } else { - var invalidPos token.Position; - p.Error(invalidPos, "package not declared: "+packageName); + var invalidPos token.Position + p.Error(invalidPos, "package not declared: "+packageName) } } - return name; + return name } @@ -360,20 +360,20 @@ func remap(p *parser, name string) string { // func Parse(filename string, src []byte, fmap FormatterMap) (Format, os.Error) { // parse source - var p parser; - p.init(filename, src); - p.parseFormat(); + var p parser + p.init(filename, src) + p.parseFormat() // add custom formatters, if any for name, form := range fmap { - name = remap(&p, name); + name = remap(&p, name) if _, found := p.rules[name]; !found { p.rules[name] = &custom{name, form} } else { - var invalidPos token.Position; - p.Error(invalidPos, "formatter already declared: "+name); + var invalidPos token.Position + p.Error(invalidPos, "formatter already declared: "+name) } } - return p.rules, p.GetError(scanner.NoMultiples); + return p.rules, p.GetError(scanner.NoMultiples) } |