summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/datafmt/datafmt.go11
-rw-r--r--src/lib/datafmt/datafmt_test.go6
-rw-r--r--src/lib/datafmt/parser.go9
-rw-r--r--usr/gri/pretty/ast.txt14
4 files changed, 21 insertions, 19 deletions
diff --git a/src/lib/datafmt/datafmt.go b/src/lib/datafmt/datafmt.go
index baeb3ac41..7e0242479 100644
--- a/src/lib/datafmt/datafmt.go
+++ b/src/lib/datafmt/datafmt.go
@@ -78,10 +78,10 @@
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 "*":
diff --git a/src/lib/datafmt/datafmt_test.go b/src/lib/datafmt/datafmt_test.go
index fcacc80f1..74c87aee8 100644
--- a/src/lib/datafmt/datafmt_test.go
+++ b/src/lib/datafmt/datafmt_test.go
@@ -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);
}
diff --git a/src/lib/datafmt/parser.go b/src/lib/datafmt/parser.go
index 89fc3cdec..3fe89f915 100644
--- a/src/lib/datafmt/parser.go
+++ b/src/lib/datafmt/parser.go
@@ -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 = "*";
diff --git a/usr/gri/pretty/ast.txt b/usr/gri/pretty/ast.txt
index b51146c5c..e4c257309 100644
--- a/usr/gri/pretty/ast.txt
+++ b/usr/gri/pretty/ast.txt
@@ -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"}
);