// This is the yacc input for creating the parser for HCL JSON. %{ package json import ( "github.com/hashicorp/hcl/ast" ) %} %union { array ast.ListNode assign ast.AssignmentNode item ast.Node klist []ast.KeyedNode list []ast.Node num int str string obj ast.ObjectNode } %type array %type pair %type value %type members %type elements %type object %token NUMBER %token COLON COMMA IDENTIFIER EQUAL NEWLINE STRING %token LEFTBRACE RIGHTBRACE LEFTBRACKET RIGHTBRACKET %token TRUE FALSE NULL %% top: object { obj := $1 jsonResult = &obj } object: LEFTBRACE members RIGHTBRACE { $$ = ast.ObjectNode{Elem: $2} } | LEFTBRACE RIGHTBRACE { $$ = ast.ObjectNode{} } members: pair { $$ = []ast.KeyedNode{$1} } | pair COMMA members { $$ = append($3, $1) } pair: STRING COLON value { $$ = ast.AssignmentNode{ K: $1, Value: $3, } } value: STRING { $$ = ast.LiteralNode{ Type: ast.ValueTypeString, Value: $1, } } | NUMBER { $$ = ast.LiteralNode{ Type: ast.ValueTypeInt, Value: $1, } } | object { $$ = $1 } | array { $$ = $1 } | TRUE { $$ = ast.LiteralNode{ Type: ast.ValueTypeBool, Value: true, } } | FALSE { $$ = ast.LiteralNode{ Type: ast.ValueTypeBool, Value: false, } } | NULL { $$ = ast.LiteralNode{ Type: ast.ValueTypeNil, Value: nil, } } array: LEFTBRACKET RIGHTBRACKET { $$ = ast.ListNode{} } | LEFTBRACKET elements RIGHTBRACKET { $$ = ast.ListNode{Elem: $2} } elements: value { $$ = []ast.Node{$1} } | value COMMA elements { $$ = append($3, $1) } %%