json: parses

This commit is contained in:
Mitchell Hashimoto 2014-08-11 16:23:28 -07:00
parent a3b46cc5d6
commit e704c5b624
3 changed files with 106 additions and 124 deletions

View File

@ -3,7 +3,7 @@ package json
import ( import (
"sync" "sync"
"github.com/hashicorp/hcl/ast" "github.com/hashicorp/hcl/hcl"
"github.com/hashicorp/terraform/helper/multierror" "github.com/hashicorp/terraform/helper/multierror"
) )
@ -11,10 +11,10 @@ import (
// be accessed directly. // be accessed directly.
var jsonErrors []error var jsonErrors []error
var jsonLock sync.Mutex var jsonLock sync.Mutex
var jsonResult *ast.ObjectNode var jsonResult *hcl.Object
// Parse parses the given string and returns the result. // 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() jsonLock.Lock()
defer jsonLock.Unlock() defer jsonLock.Unlock()
jsonErrors = nil jsonErrors = nil

View File

@ -7,29 +7,21 @@ import (
"fmt" "fmt"
"strconv" "strconv"
"github.com/hashicorp/hcl/ast" "github.com/hashicorp/hcl/hcl"
) )
%} %}
%union { %union {
array ast.ListNode
assign ast.AssignmentNode
item ast.Node
klist []ast.AssignmentNode
list []ast.Node
num int num int
str string str string
obj ast.ObjectNode obj *hcl.Object
objlist []*hcl.Object
} }
%type <array> array
%type <assign> pair
%type <item> value number
%type <klist> members
%type <list> elements
%type <num> int %type <num> int
%type <obj> object %type <obj> number object pair value
%type <objlist> array elements members
%type <str> frac %type <str> frac
%token <num> NUMBER %token <num> NUMBER
@ -42,24 +34,26 @@ import (
top: top:
object object
{ {
obj := $1 jsonResult = $1
jsonResult = &obj
} }
object: object:
LEFTBRACE members RIGHTBRACE LEFTBRACE members RIGHTBRACE
{ {
$$ = ast.ObjectNode{Elem: $2} $$ = &hcl.Object{
Type: hcl.ValueTypeObject,
Value: hcl.ObjectList($2).Map(),
}
} }
| LEFTBRACE RIGHTBRACE | LEFTBRACE RIGHTBRACE
{ {
$$ = ast.ObjectNode{} $$ = &hcl.Object{Type: hcl.ValueTypeObject}
} }
members: members:
pair pair
{ {
$$ = []ast.AssignmentNode{$1} $$ = []*hcl.Object{$1}
} }
| members COMMA pair | members COMMA pair
{ {
@ -69,23 +63,15 @@ members:
pair: pair:
STRING COLON value STRING COLON value
{ {
value := $3 $3.Key = $1
if obj, ok := value.(ast.ObjectNode); ok { $$ = $3
obj.K = $1
value = obj
}
$$ = ast.AssignmentNode{
K: $1,
Value: value,
}
} }
value: value:
STRING STRING
{ {
$$ = ast.LiteralNode{ $$ = &hcl.Object{
Type: ast.ValueTypeString, Type: hcl.ValueTypeString,
Value: $1, Value: $1,
} }
} }
@ -99,26 +85,29 @@ value:
} }
| array | array
{ {
$$ = $1 $$ = &hcl.Object{
Type: hcl.ValueTypeList,
Value: $1,
}
} }
| TRUE | TRUE
{ {
$$ = ast.LiteralNode{ $$ = &hcl.Object{
Type: ast.ValueTypeBool, Type: hcl.ValueTypeBool,
Value: true, Value: true,
} }
} }
| FALSE | FALSE
{ {
$$ = ast.LiteralNode{ $$ = &hcl.Object{
Type: ast.ValueTypeBool, Type: hcl.ValueTypeBool,
Value: false, Value: false,
} }
} }
| NULL | NULL
{ {
$$ = ast.LiteralNode{ $$ = &hcl.Object{
Type: ast.ValueTypeNil, Type: hcl.ValueTypeNil,
Value: nil, Value: nil,
} }
} }
@ -126,17 +115,17 @@ value:
array: array:
LEFTBRACKET RIGHTBRACKET LEFTBRACKET RIGHTBRACKET
{ {
$$ = ast.ListNode{} $$ = nil
} }
| LEFTBRACKET elements RIGHTBRACKET | LEFTBRACKET elements RIGHTBRACKET
{ {
$$ = ast.ListNode{Elem: $2} $$ = $2
} }
elements: elements:
value value
{ {
$$ = []ast.Node{$1} $$ = []*hcl.Object{$1}
} }
| elements COMMA value | elements COMMA value
{ {
@ -146,8 +135,8 @@ elements:
number: number:
int int
{ {
$$ = ast.LiteralNode{ $$ = &hcl.Object{
Type: ast.ValueTypeInt, Type: hcl.ValueTypeInt,
Value: $1, Value: $1,
} }
} }
@ -159,8 +148,8 @@ number:
panic(err) panic(err)
} }
$$ = ast.LiteralNode{ $$ = &hcl.Object{
Type: ast.ValueTypeFloat, Type: hcl.ValueTypeFloat,
Value: f, Value: f,
} }
} }

147
json/y.go
View File

@ -8,20 +8,16 @@ import (
"fmt" "fmt"
"strconv" "strconv"
"github.com/hashicorp/hcl/ast" "github.com/hashicorp/hcl/hcl"
) )
//line parse.y:15 //line parse.y:15
type jsonSymType struct { type jsonSymType struct {
yys int yys int
array ast.ListNode num int
assign ast.AssignmentNode str string
item ast.Node obj *hcl.Object
klist []ast.AssignmentNode objlist []*hcl.Object
list []ast.Node
num int
str string
obj ast.ObjectNode
} }
const NUMBER = 57346 const NUMBER = 57346
@ -65,7 +61,7 @@ const jsonEofCode = 1
const jsonErrCode = 2 const jsonErrCode = 2
const jsonMaxDepth = 200 const jsonMaxDepth = 200
//line parse.y:184 //line parse.y:173
//line yacctab:1 //line yacctab:1
var jsonExca = []int{ var jsonExca = []int{
@ -88,7 +84,7 @@ var jsonAct = []int{
21, 26, 17, 18, 19, 22, 30, 23, 22, 7, 21, 26, 17, 18, 19, 22, 30, 23, 22, 7,
1, 5, 28, 13, 3, 29, 21, 32, 17, 18, 1, 5, 28, 13, 3, 29, 21, 32, 17, 18,
19, 22, 9, 33, 6, 31, 15, 2, 8, 24, 19, 22, 9, 33, 6, 31, 15, 2, 8, 24,
27, 4, 14, 16, 11, 4, 27, 16, 14, 11,
} }
var jsonPact = []int{ var jsonPact = []int{
@ -99,14 +95,14 @@ var jsonPact = []int{
} }
var jsonPgo = []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, 20,
} }
var jsonR1 = []int{ var jsonR1 = []int{
0, 10, 8, 8, 5, 5, 2, 3, 3, 3, 0, 10, 3, 3, 8, 8, 4, 5, 5, 5,
3, 3, 3, 3, 1, 1, 6, 6, 4, 4, 5, 5, 5, 5, 6, 6, 7, 7, 2, 2,
7, 7, 9, 1, 1, 9,
} }
var jsonR2 = []int{ var jsonR2 = []int{
@ -116,10 +112,10 @@ var jsonR2 = []int{
} }
var jsonChk = []int{ var jsonChk = []int{
-1000, -10, -8, 11, -5, 12, -2, 10, 12, 6, -1000, -10, -3, 11, -8, 12, -4, 10, 12, 6,
5, -2, -3, 10, -4, -8, -1, 15, 16, 17, 5, -4, -5, 10, -2, -3, -6, 15, 16, 17,
-7, 13, 18, 4, -9, 19, 14, -6, -3, -7, -1, 13, 18, 4, -9, 19, 14, -7, -5, -1,
4, 14, 6, -3, 4, 14, 6, -5,
} }
var jsonDef = []int{ var jsonDef = []int{
@ -367,122 +363,119 @@ jsondefault:
switch jsonnt { switch jsonnt {
case 1: case 1:
//line parse.y:44 //line parse.y:36
{ {
obj := jsonS[jsonpt-0].obj jsonResult = jsonS[jsonpt-0].obj
jsonResult = &obj
} }
case 2: 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: case 3:
//line parse.y:55 //line parse.y:49
{ {
jsonVAL.obj = ast.ObjectNode{} jsonVAL.obj = &hcl.Object{Type: hcl.ValueTypeObject}
} }
case 4: 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: 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: case 6:
//line parse.y:71 //line parse.y:65
{ {
value := jsonS[jsonpt-0].item jsonS[jsonpt-0].obj.Key = jsonS[jsonpt-2].str
if obj, ok := value.(ast.ObjectNode); ok { jsonVAL.obj = jsonS[jsonpt-0].obj
obj.K = jsonS[jsonpt-2].str
value = obj
}
jsonVAL.assign = ast.AssignmentNode{
K: jsonS[jsonpt-2].str,
Value: value,
}
} }
case 7: case 7:
//line parse.y:86 //line parse.y:72
{ {
jsonVAL.item = ast.LiteralNode{ jsonVAL.obj = &hcl.Object{
Type: ast.ValueTypeString, Type: hcl.ValueTypeString,
Value: jsonS[jsonpt-0].str, Value: jsonS[jsonpt-0].str,
} }
} }
case 8: case 8:
//line parse.y:93 //line parse.y:79
{ {
jsonVAL.item = jsonS[jsonpt-0].item jsonVAL.obj = jsonS[jsonpt-0].obj
} }
case 9: case 9:
//line parse.y:97 //line parse.y:83
{ {
jsonVAL.item = jsonS[jsonpt-0].obj jsonVAL.obj = jsonS[jsonpt-0].obj
} }
case 10: 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: case 11:
//line parse.y:105 //line parse.y:94
{ {
jsonVAL.item = ast.LiteralNode{ jsonVAL.obj = &hcl.Object{
Type: ast.ValueTypeBool, Type: hcl.ValueTypeBool,
Value: true, Value: true,
} }
} }
case 12: case 12:
//line parse.y:112 //line parse.y:101
{ {
jsonVAL.item = ast.LiteralNode{ jsonVAL.obj = &hcl.Object{
Type: ast.ValueTypeBool, Type: hcl.ValueTypeBool,
Value: false, Value: false,
} }
} }
case 13: case 13:
//line parse.y:119 //line parse.y:108
{ {
jsonVAL.item = ast.LiteralNode{ jsonVAL.obj = &hcl.Object{
Type: ast.ValueTypeNil, Type: hcl.ValueTypeNil,
Value: nil, Value: nil,
} }
} }
case 14: case 14:
//line parse.y:128 //line parse.y:117
{ {
jsonVAL.array = ast.ListNode{} jsonVAL.objlist = nil
} }
case 15: 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: 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: 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: case 18:
//line parse.y:148 //line parse.y:137
{ {
jsonVAL.item = ast.LiteralNode{ jsonVAL.obj = &hcl.Object{
Type: ast.ValueTypeInt, Type: hcl.ValueTypeInt,
Value: jsonS[jsonpt-0].num, Value: jsonS[jsonpt-0].num,
} }
} }
case 19: case 19:
//line parse.y:155 //line parse.y:144
{ {
fs := fmt.Sprintf("%d.%s", jsonS[jsonpt-1].num, jsonS[jsonpt-0].str) fs := fmt.Sprintf("%d.%s", jsonS[jsonpt-1].num, jsonS[jsonpt-0].str)
f, err := strconv.ParseFloat(fs, 64) f, err := strconv.ParseFloat(fs, 64)
@ -490,23 +483,23 @@ jsondefault:
panic(err) panic(err)
} }
jsonVAL.item = ast.LiteralNode{ jsonVAL.obj = &hcl.Object{
Type: ast.ValueTypeFloat, Type: hcl.ValueTypeFloat,
Value: f, Value: f,
} }
} }
case 20: case 20:
//line parse.y:170 //line parse.y:159
{ {
jsonVAL.num = jsonS[jsonpt-0].num * -1 jsonVAL.num = jsonS[jsonpt-0].num * -1
} }
case 21: case 21:
//line parse.y:174 //line parse.y:163
{ {
jsonVAL.num = jsonS[jsonpt-0].num jsonVAL.num = jsonS[jsonpt-0].num
} }
case 22: case 22:
//line parse.y:180 //line parse.y:169
{ {
jsonVAL.str = strconv.FormatInt(int64(jsonS[jsonpt-0].num), 10) jsonVAL.str = strconv.FormatInt(int64(jsonS[jsonpt-0].num), 10)
} }