From e704c5b6243587b0c6c407b2e95ab5ad401f52f0 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 11 Aug 2014 16:23:28 -0700 Subject: [PATCH] json: parses --- json/parse.go | 6 +-- json/parse.y | 77 ++++++++++++-------------- json/y.go | 147 ++++++++++++++++++++++++-------------------------- 3 files changed, 106 insertions(+), 124 deletions(-) diff --git a/json/parse.go b/json/parse.go index 106095c..3f304c4 100644 --- a/json/parse.go +++ b/json/parse.go @@ -3,7 +3,7 @@ package json import ( "sync" - "github.com/hashicorp/hcl/ast" + "github.com/hashicorp/hcl/hcl" "github.com/hashicorp/terraform/helper/multierror" ) @@ -11,10 +11,10 @@ import ( // be accessed directly. var jsonErrors []error var jsonLock sync.Mutex -var jsonResult *ast.ObjectNode +var jsonResult *hcl.Object // Parse parses the given string and returns the result. -func Parse(v string) (*ast.ObjectNode, error) { +func Parse(v string) (*hcl.Object, error) { jsonLock.Lock() defer jsonLock.Unlock() jsonErrors = nil diff --git a/json/parse.y b/json/parse.y index 205f340..66a193a 100644 --- a/json/parse.y +++ b/json/parse.y @@ -7,29 +7,21 @@ import ( "fmt" "strconv" - "github.com/hashicorp/hcl/ast" + "github.com/hashicorp/hcl/hcl" ) %} %union { - array ast.ListNode - assign ast.AssignmentNode - item ast.Node - klist []ast.AssignmentNode - list []ast.Node num int str string - obj ast.ObjectNode + obj *hcl.Object + objlist []*hcl.Object } -%type array -%type pair -%type value number -%type members -%type elements %type int -%type object +%type number object pair value +%type array elements members %type frac %token NUMBER @@ -42,24 +34,26 @@ import ( top: object { - obj := $1 - jsonResult = &obj + jsonResult = $1 } object: LEFTBRACE members RIGHTBRACE { - $$ = ast.ObjectNode{Elem: $2} + $$ = &hcl.Object{ + Type: hcl.ValueTypeObject, + Value: hcl.ObjectList($2).Map(), + } } | LEFTBRACE RIGHTBRACE { - $$ = ast.ObjectNode{} + $$ = &hcl.Object{Type: hcl.ValueTypeObject} } members: pair { - $$ = []ast.AssignmentNode{$1} + $$ = []*hcl.Object{$1} } | members COMMA pair { @@ -69,23 +63,15 @@ members: pair: STRING COLON value { - value := $3 - if obj, ok := value.(ast.ObjectNode); ok { - obj.K = $1 - value = obj - } - - $$ = ast.AssignmentNode{ - K: $1, - Value: value, - } + $3.Key = $1 + $$ = $3 } value: STRING { - $$ = ast.LiteralNode{ - Type: ast.ValueTypeString, + $$ = &hcl.Object{ + Type: hcl.ValueTypeString, Value: $1, } } @@ -99,26 +85,29 @@ value: } | array { - $$ = $1 + $$ = &hcl.Object{ + Type: hcl.ValueTypeList, + Value: $1, + } } | TRUE { - $$ = ast.LiteralNode{ - Type: ast.ValueTypeBool, + $$ = &hcl.Object{ + Type: hcl.ValueTypeBool, Value: true, } } | FALSE { - $$ = ast.LiteralNode{ - Type: ast.ValueTypeBool, + $$ = &hcl.Object{ + Type: hcl.ValueTypeBool, Value: false, } } | NULL { - $$ = ast.LiteralNode{ - Type: ast.ValueTypeNil, + $$ = &hcl.Object{ + Type: hcl.ValueTypeNil, Value: nil, } } @@ -126,17 +115,17 @@ value: array: LEFTBRACKET RIGHTBRACKET { - $$ = ast.ListNode{} + $$ = nil } | LEFTBRACKET elements RIGHTBRACKET { - $$ = ast.ListNode{Elem: $2} + $$ = $2 } elements: value { - $$ = []ast.Node{$1} + $$ = []*hcl.Object{$1} } | elements COMMA value { @@ -146,8 +135,8 @@ elements: number: int { - $$ = ast.LiteralNode{ - Type: ast.ValueTypeInt, + $$ = &hcl.Object{ + Type: hcl.ValueTypeInt, Value: $1, } } @@ -159,8 +148,8 @@ number: panic(err) } - $$ = ast.LiteralNode{ - Type: ast.ValueTypeFloat, + $$ = &hcl.Object{ + Type: hcl.ValueTypeFloat, Value: f, } } diff --git a/json/y.go b/json/y.go index 9357ff3..44d960b 100644 --- a/json/y.go +++ b/json/y.go @@ -8,20 +8,16 @@ import ( "fmt" "strconv" - "github.com/hashicorp/hcl/ast" + "github.com/hashicorp/hcl/hcl" ) //line parse.y:15 type jsonSymType struct { - yys int - array ast.ListNode - assign ast.AssignmentNode - item ast.Node - klist []ast.AssignmentNode - list []ast.Node - num int - str string - obj ast.ObjectNode + yys int + num int + str string + obj *hcl.Object + objlist []*hcl.Object } const NUMBER = 57346 @@ -65,7 +61,7 @@ const jsonEofCode = 1 const jsonErrCode = 2 const jsonMaxDepth = 200 -//line parse.y:184 +//line parse.y:173 //line yacctab:1 var jsonExca = []int{ @@ -88,7 +84,7 @@ var jsonAct = []int{ 21, 26, 17, 18, 19, 22, 30, 23, 22, 7, 1, 5, 28, 13, 3, 29, 21, 32, 17, 18, 19, 22, 9, 33, 6, 31, 15, 2, 8, 24, - 27, 4, 14, 16, 11, + 4, 27, 16, 14, 11, } var jsonPact = []int{ @@ -99,14 +95,14 @@ var jsonPact = []int{ } var jsonPgo = []int{ - 0, 43, 34, 0, 42, 41, 40, 2, 36, 39, + 0, 2, 43, 36, 34, 0, 42, 41, 40, 39, 20, } var jsonR1 = []int{ - 0, 10, 8, 8, 5, 5, 2, 3, 3, 3, - 3, 3, 3, 3, 1, 1, 6, 6, 4, 4, - 7, 7, 9, + 0, 10, 3, 3, 8, 8, 4, 5, 5, 5, + 5, 5, 5, 5, 6, 6, 7, 7, 2, 2, + 1, 1, 9, } var jsonR2 = []int{ @@ -116,10 +112,10 @@ var jsonR2 = []int{ } var jsonChk = []int{ - -1000, -10, -8, 11, -5, 12, -2, 10, 12, 6, - 5, -2, -3, 10, -4, -8, -1, 15, 16, 17, - -7, 13, 18, 4, -9, 19, 14, -6, -3, -7, - 4, 14, 6, -3, + -1000, -10, -3, 11, -8, 12, -4, 10, 12, 6, + 5, -4, -5, 10, -2, -3, -6, 15, 16, 17, + -1, 13, 18, 4, -9, 19, 14, -7, -5, -1, + 4, 14, 6, -5, } var jsonDef = []int{ @@ -367,122 +363,119 @@ jsondefault: switch jsonnt { case 1: - //line parse.y:44 + //line parse.y:36 { - obj := jsonS[jsonpt-0].obj - jsonResult = &obj + jsonResult = jsonS[jsonpt-0].obj } case 2: - //line parse.y:51 + //line parse.y:42 { - jsonVAL.obj = ast.ObjectNode{Elem: jsonS[jsonpt-1].klist} + jsonVAL.obj = &hcl.Object{ + Type: hcl.ValueTypeObject, + Value: hcl.ObjectList(jsonS[jsonpt-1].objlist).Map(), + } } case 3: - //line parse.y:55 + //line parse.y:49 { - jsonVAL.obj = ast.ObjectNode{} + jsonVAL.obj = &hcl.Object{Type: hcl.ValueTypeObject} } case 4: - //line parse.y:61 + //line parse.y:55 { - jsonVAL.klist = []ast.AssignmentNode{jsonS[jsonpt-0].assign} + jsonVAL.objlist = []*hcl.Object{jsonS[jsonpt-0].obj} } case 5: - //line parse.y:65 + //line parse.y:59 { - jsonVAL.klist = append(jsonS[jsonpt-2].klist, jsonS[jsonpt-0].assign) + jsonVAL.objlist = append(jsonS[jsonpt-2].objlist, jsonS[jsonpt-0].obj) } case 6: - //line parse.y:71 + //line parse.y:65 { - value := jsonS[jsonpt-0].item - if obj, ok := value.(ast.ObjectNode); ok { - obj.K = jsonS[jsonpt-2].str - value = obj - } - - jsonVAL.assign = ast.AssignmentNode{ - K: jsonS[jsonpt-2].str, - Value: value, - } + jsonS[jsonpt-0].obj.Key = jsonS[jsonpt-2].str + jsonVAL.obj = jsonS[jsonpt-0].obj } case 7: - //line parse.y:86 + //line parse.y:72 { - jsonVAL.item = ast.LiteralNode{ - Type: ast.ValueTypeString, + jsonVAL.obj = &hcl.Object{ + Type: hcl.ValueTypeString, Value: jsonS[jsonpt-0].str, } } case 8: - //line parse.y:93 + //line parse.y:79 { - jsonVAL.item = jsonS[jsonpt-0].item + jsonVAL.obj = jsonS[jsonpt-0].obj } case 9: - //line parse.y:97 + //line parse.y:83 { - jsonVAL.item = jsonS[jsonpt-0].obj + jsonVAL.obj = jsonS[jsonpt-0].obj } case 10: - //line parse.y:101 + //line parse.y:87 { - jsonVAL.item = jsonS[jsonpt-0].array + jsonVAL.obj = &hcl.Object{ + Type: hcl.ValueTypeList, + Value: jsonS[jsonpt-0].objlist, + } } case 11: - //line parse.y:105 + //line parse.y:94 { - jsonVAL.item = ast.LiteralNode{ - Type: ast.ValueTypeBool, + jsonVAL.obj = &hcl.Object{ + Type: hcl.ValueTypeBool, Value: true, } } case 12: - //line parse.y:112 + //line parse.y:101 { - jsonVAL.item = ast.LiteralNode{ - Type: ast.ValueTypeBool, + jsonVAL.obj = &hcl.Object{ + Type: hcl.ValueTypeBool, Value: false, } } case 13: - //line parse.y:119 + //line parse.y:108 { - jsonVAL.item = ast.LiteralNode{ - Type: ast.ValueTypeNil, + jsonVAL.obj = &hcl.Object{ + Type: hcl.ValueTypeNil, Value: nil, } } case 14: - //line parse.y:128 + //line parse.y:117 { - jsonVAL.array = ast.ListNode{} + jsonVAL.objlist = nil } case 15: - //line parse.y:132 + //line parse.y:121 { - jsonVAL.array = ast.ListNode{Elem: jsonS[jsonpt-1].list} + jsonVAL.objlist = jsonS[jsonpt-1].objlist } case 16: - //line parse.y:138 + //line parse.y:127 { - jsonVAL.list = []ast.Node{jsonS[jsonpt-0].item} + jsonVAL.objlist = []*hcl.Object{jsonS[jsonpt-0].obj} } case 17: - //line parse.y:142 + //line parse.y:131 { - jsonVAL.list = append(jsonS[jsonpt-2].list, jsonS[jsonpt-0].item) + jsonVAL.objlist = append(jsonS[jsonpt-2].objlist, jsonS[jsonpt-0].obj) } case 18: - //line parse.y:148 + //line parse.y:137 { - jsonVAL.item = ast.LiteralNode{ - Type: ast.ValueTypeInt, + jsonVAL.obj = &hcl.Object{ + Type: hcl.ValueTypeInt, Value: jsonS[jsonpt-0].num, } } case 19: - //line parse.y:155 + //line parse.y:144 { fs := fmt.Sprintf("%d.%s", jsonS[jsonpt-1].num, jsonS[jsonpt-0].str) f, err := strconv.ParseFloat(fs, 64) @@ -490,23 +483,23 @@ jsondefault: panic(err) } - jsonVAL.item = ast.LiteralNode{ - Type: ast.ValueTypeFloat, + jsonVAL.obj = &hcl.Object{ + Type: hcl.ValueTypeFloat, Value: f, } } case 20: - //line parse.y:170 + //line parse.y:159 { jsonVAL.num = jsonS[jsonpt-0].num * -1 } case 21: - //line parse.y:174 + //line parse.y:163 { jsonVAL.num = jsonS[jsonpt-0].num } case 22: - //line parse.y:180 + //line parse.y:169 { jsonVAL.str = strconv.FormatInt(int64(jsonS[jsonpt-0].num), 10) }