]> Cypherpunks repositories - gostls13.git/commitdiff
change datafmt syntax to use '@' instead of '^' (to match
authorRobert Griesemer <gri@golang.org>
Wed, 3 Jun 2009 01:03:47 +0000 (18:03 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 3 Jun 2009 01:03:47 +0000 (18:03 -0700)
convention used in template.go)

R=rsc
DELTA=22  (3 added, 1 deleted, 18 changed)
OCL=29780
CL=29782

src/lib/datafmt/datafmt.go
src/lib/datafmt/datafmt_test.go
src/lib/datafmt/parser.go
usr/gri/pretty/ast.txt

index baeb3ac411bc872a7e350fde1f062443d58bd7db..7e02424799fc8c0b5a706f40d705f379ad804b45 100644 (file)
 
        A field operand is a field name optionally followed by an alternate
        rule name. The field name may be an identifier or one of the special
-       names ^ or *.
+       names @ or *.
 
                Field       = FieldName [ ":" RuleName ] .
-               FieldName   = identifier | "^" | "*" .
+               FieldName   = identifier | "@" | "*" .
 
        If the field name is an identifier, the current value must be a struct,
        and there must be a field with that name in the struct. The same lookup
@@ -91,8 +91,7 @@
        and an error message is returned. (TODO consider changing the semantics
        such that if a field is not found, it evaluates to nil).
 
-       The special name '^' denotes the current value. (TODO see if ^ can
-       change to @ or be eliminated).
+       The special name '@' denotes the current value.
 
        The meaning of the special name '*' depends on the type of the current
        value:
@@ -252,7 +251,7 @@ type (
        literal [][]byte;  // a list of string segments, possibly starting with '%'
 
        field struct {
-               fieldName string;  // including "^", "*"
+               fieldName string;  // including "@", "*"
                ruleName string;  // "" if no rule name specified
        };
 
@@ -587,7 +586,7 @@ func (s *State) eval(fexpr expr, value reflect.Value, index int) bool {
        case *field:
                // determine field value
                switch t.fieldName {
-               case "^":
+               case "@":
                        // field value is current value
 
                case "*":
index fcacc80f16b17ed5d21d4389f6d9f59fe6949ff5..74c87aee865294b07454dc40227497315905dfa0 100644 (file)
@@ -76,10 +76,10 @@ func TestCustomFormatters(t *testing.T) {
        f = parse(t, ``, fmap1);
        verify(t, f, `even odd even odd `, 0, 1, 2, 3);
 
-       f = parse(t, `/ =^:blank; float="#"`, fmap1);
+       f = parse(t, `/ =@:blank; float="#"`, fmap1);
        verify(t, f, `# # #`, 0.0, 1.0, 2.0);
 
-       f = parse(t, `float=^:nil`, fmap1);
+       f = parse(t, `float=@:nil`, fmap1);
        verify(t, f, ``, 0.0, 1.0, 2.0);
 
        // TODO needs more tests
@@ -212,7 +212,7 @@ func TestDefaultRule(t *testing.T) {
        check(t, `default="%v"`, `42foo3.14`, 42, "foo", 3.14);
        check(t, `default="%v"; int="%x"`, `abcdef`, 10, 11, 12, 13, 14, 15);
        check(t, `default="%v"; int="%x"`, `ab**ef`, 10, 11, "**", 14, 15);
-       check(t, `default="%x"; int=^:default`, `abcdef`, 10, 11, 12, 13, 14, 15);
+       check(t, `default="%x"; int=@:default`, `abcdef`, 10, 11, 12, 13, 14, 15);
 }
 
 
index 89fc3cdec714e1aa3b26318b7bce0836789705dd..3fe89f9151ccc7e4720efd29111d7d57581ada8d 100644 (file)
@@ -86,7 +86,7 @@ func (p *parser) next() {
 
 func (p *parser) init(src []byte) {
        p.errors.Init(0);
-       p.scanner.Init(src, p, 0);
+       p.scanner.Init(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);
@@ -231,8 +231,11 @@ func (p *parser) parseLiteral() literal {
 func (p *parser) parseField() expr {
        var fname string;
        switch p.tok {
-       case token.XOR:
-               fname = "^";
+       case token.ILLEGAL:
+               if string(p.lit) != "@" {
+                       return nil;
+               }
+               fname = "@";
                p.next();
        case token.MUL:
                fname = "*";
index b51146c5c1a447c2a93a96dfb62b207e43acf8cf..e4c257309d884dad670acff4b6557f5482084e58 100644 (file)
@@ -44,7 +44,7 @@ ast.Decl =
 // Tokens and comments
 
 token.Token =
-       ^:string;
+       @:string;
 
 ast.Comment =
        // TODO this doesn't indent properly after //-style comments because
@@ -87,7 +87,7 @@ ast.StringList =
        {Strings / "\n"};
 
 ast.FuncLit =
-       Type " " Body ^:clearOptSemi;  // no optional ; after a func literal body
+       Type " " Body @:clearOptSemi;  // no optional ; after a func literal body
 
 ast.CompositeLit =
        Type "{" {Elts / ", "} "}";
@@ -139,7 +139,7 @@ funcSignature =
        *:signature;
 
 ast.FuncType =
-       [Position:isValidPos "func"] ^:signature;
+       [Position:isValidPos "func"] @:signature;
 
 ast.InterfaceType =
        "interface"
@@ -201,7 +201,7 @@ ast.BranchStmt =
        Tok [" " Label];
 
 stmtList =
-       {^ / ^:optSemi "\n"};
+       {@ / @:optSemi "\n"};
 
 blockStmt =  // like ast.BlockStmt but w/o indentation
        "{"
@@ -210,7 +210,7 @@ blockStmt =  // like ast.BlockStmt but w/o indentation
                List:stmtList
        "\n"
        ]
-       "}" ^:setOptSemi;
+       "}" @:setOptSemi;
 
 blockStmtPtr =
        *:blockStmt;
@@ -222,7 +222,7 @@ ast.BlockStmt =
                List:stmtList
        ) "\n"
        ]
-       "}" ^:setOptSemi;
+       "}" @:setOptSemi;
 
 ast.IfStmt =
        "if " [Init "; "] [Cond " "] Body [" else " Else];
@@ -315,7 +315,7 @@ ast.GenDecl =
                        {Specs / ";\n"}
                ) "\n"
                ]
-               ")" ^:setOptSemi
+               ")" @:setOptSemi
        |       {Specs / ";\n"}
        );