]> Cypherpunks repositories - gostls13.git/commitdiff
go/scanner: support for complex (imaginary) constants
authorRobert Griesemer <gri@golang.org>
Thu, 25 Feb 2010 01:06:40 +0000 (17:06 -0800)
committerRobert Griesemer <gri@golang.org>
Thu, 25 Feb 2010 01:06:40 +0000 (17:06 -0800)
R=rsc
CC=golang-dev
https://golang.org/cl/223044

src/pkg/go/parser/parser.go
src/pkg/go/printer/testdata/declarations.golden
src/pkg/go/printer/testdata/declarations.input
src/pkg/go/scanner/scanner.go
src/pkg/go/scanner/scanner_test.go
src/pkg/go/token/token.go

index 48b9a63c2e7a460e0ead06163b1c96f8280710fa..fd215f0d9e981de0067bc41674d5429d69a5edcc 100644 (file)
@@ -959,7 +959,7 @@ func (p *parser) parseOperand() ast.Expr {
        case token.IDENT:
                return p.findIdent()
 
-       case token.INT, token.FLOAT, token.CHAR, token.STRING:
+       case token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING:
                x := &ast.BasicLit{p.pos, p.tok, p.lit}
                p.next()
                return x
index b15e52ad64905bb32ff5d87f1e64d9641d4f2aeb..beb110d87d3d9d034e0050d48c45cb5344aa2774 100644 (file)
@@ -68,6 +68,48 @@ import _ "io"
 var _ int
 
 
+// printing of constant literals
+const (
+       _       = "foobar"
+       _       = "a۰۱۸"
+       _       = "foo६४"
+       _       = "bar9876"
+       _       = 0
+       _       = 1
+       _       = 123456789012345678890
+       _       = 01234567
+       _       = 0xcafebabe
+       _       = 0.
+       _       = .0
+       _       = 3.14159265
+       _       = 1e0
+       _       = 1e+100
+       _       = 1e-100
+       _       = 2.71828e-1000
+       _       = 0i
+       _       = 1i
+       _       = 012345678901234567889i
+       _       = 123456789012345678890i
+       _       = 0.i
+       _       = .0i
+       _       = 3.14159265i
+       _       = 1e0i
+       _       = 1e+100i
+       _       = 1e-100i
+       _       = 2.71828e-1000i
+       _       = 'a'
+       _       = '\000'
+       _       = '\xFF'
+       _       = '\uff16'
+       _       = '\U0000ff16'
+       _       = `foobar`
+       _       = `foo
+---
+---
+bar`
+)
+
+
 func _() {
        // the following decls need a semicolon at the end
        type _ int
index 1d1dc45f0c6bc53854eb09890df75d9cb7a511e8..c47be82b46f4c01e1d7ef537ca395f89aa1dd397 100644 (file)
@@ -67,6 +67,48 @@ import _ "io"
 var _ int
 
 
+// printing of constant literals
+const (
+       _ = "foobar"
+       _ = "a۰۱۸"
+       _ = "foo६४"
+       _ = "bar9876"
+       _ = 0
+       _ = 1
+       _ = 123456789012345678890
+       _ = 01234567
+       _ = 0xcafebabe
+       _ = 0.
+       _ = .0
+       _ = 3.14159265
+       _ = 1e0
+       _ = 1e+100
+       _ = 1e-100
+       _ = 2.71828e-1000
+       _ = 0i
+       _ = 1i
+       _ = 012345678901234567889i
+       _ = 123456789012345678890i
+       _ = 0.i
+       _ = .0i
+       _ = 3.14159265i
+       _ = 1e0i
+       _ = 1e+100i
+       _ = 1e-100i
+       _ = 2.71828e-1000i
+       _ = 'a'
+       _ = '\000'
+       _ = '\xFF'
+       _ = '\uff16'
+       _ = '\U0000ff16'
+       _ = `foobar`
+       _ = `foo
+---
+---
+bar`
+)
+
+
 func _() {
        // the following decls need a semicolon at the end
        type _ int
index b2e120179d9863861210d4e5d5b5a55f58262e1c..a59212011e5b85667fca56b77c4f48fb34d66001 100644 (file)
@@ -302,7 +302,7 @@ func (S *Scanner) scanNumber(pos token.Position, seenDecimalPoint bool) token.To
                                seenDecimalDigit = true
                                S.scanMantissa(10)
                        }
-                       if S.ch == '.' || S.ch == 'e' || S.ch == 'E' {
+                       if S.ch == '.' || S.ch == 'e' || S.ch == 'E' || S.ch == 'i' {
                                goto fraction
                        }
                        // octal int
@@ -333,6 +333,11 @@ exponent:
                S.scanMantissa(10)
        }
 
+       if S.ch == 'i' {
+               tok = token.IMAG
+               S.next()
+       }
+
 exit:
        return tok
 }
index 762252488aac9fe7cb5655fe92dc14aefebe97b9..5a7828e68a3208fe678a1607963a6835196e8b3b 100644 (file)
@@ -51,6 +51,8 @@ var tokens = [...]elt{
        elt{token.IDENT, "foo६४", literal},
        elt{token.IDENT, "bar9876", literal},
        elt{token.INT, "0", literal},
+       elt{token.INT, "1", literal},
+       elt{token.INT, "123456789012345678890", literal},
        elt{token.INT, "01234567", literal},
        elt{token.INT, "0xcafebabe", literal},
        elt{token.FLOAT, "0.", literal},
@@ -60,6 +62,17 @@ var tokens = [...]elt{
        elt{token.FLOAT, "1e+100", literal},
        elt{token.FLOAT, "1e-100", literal},
        elt{token.FLOAT, "2.71828e-1000", literal},
+       elt{token.IMAG, "0i", literal},
+       elt{token.IMAG, "1i", literal},
+       elt{token.IMAG, "012345678901234567889i", literal},
+       elt{token.IMAG, "123456789012345678890i", literal},
+       elt{token.IMAG, "0.i", literal},
+       elt{token.IMAG, ".0i", literal},
+       elt{token.IMAG, "3.14159265i", literal},
+       elt{token.IMAG, "1e0i", literal},
+       elt{token.IMAG, "1e+100i", literal},
+       elt{token.IMAG, "1e-100i", literal},
+       elt{token.IMAG, "2.71828e-1000i", literal},
        elt{token.CHAR, "'a'", literal},
        elt{token.CHAR, "'\\000'", literal},
        elt{token.CHAR, "'\\xFF'", literal},
index 95a35fed00b1fbee66db0e9b9da23cd53107d9e3..df4064c009b30c9e86d6a8cbb451ba309e865b58 100644 (file)
@@ -30,6 +30,7 @@ const (
        IDENT  // main
        INT    // 12345
        FLOAT  // 123.45
+       IMAG   // 123.45i
        CHAR   // 'a'
        STRING // "abc"
        literal_end
@@ -140,6 +141,7 @@ var tokens = map[Token]string{
        IDENT: "IDENT",
        INT: "INT",
        FLOAT: "FLOAT",
+       IMAG: "IMAG",
        CHAR: "CHAR",
        STRING: "STRING",