2014-08-02 18:38:41 +00:00
|
|
|
// This is the yacc input for creating the parser for HCL JSON.
|
|
|
|
|
|
|
|
%{
|
|
|
|
package json
|
|
|
|
|
|
|
|
import (
|
2014-08-03 20:34:08 +00:00
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
|
2015-11-07 00:48:00 +00:00
|
|
|
"github.com/hashicorp/hcl/hcl/ast"
|
|
|
|
"github.com/hashicorp/hcl/hcl/token"
|
2014-08-02 18:38:41 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
%union {
|
2014-11-13 05:29:07 +00:00
|
|
|
f float64
|
2015-11-07 00:48:00 +00:00
|
|
|
list []ast.Node
|
|
|
|
node ast.Node
|
2014-08-02 18:38:41 +00:00
|
|
|
num int
|
|
|
|
str string
|
2015-11-07 00:48:00 +00:00
|
|
|
obj *ast.ObjectType
|
|
|
|
objitem *ast.ObjectItem
|
|
|
|
objlist *ast.ObjectList
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
|
2014-11-13 05:29:07 +00:00
|
|
|
%type <f> float
|
2015-11-07 00:48:00 +00:00
|
|
|
%type <list> array elements
|
|
|
|
%type <node> number value
|
2014-08-03 20:34:08 +00:00
|
|
|
%type <num> int
|
2015-11-07 00:48:00 +00:00
|
|
|
%type <obj> object
|
|
|
|
%type <objitem> pair
|
|
|
|
%type <objlist> members
|
2014-11-13 05:29:07 +00:00
|
|
|
%type <str> exp
|
2014-08-02 18:38:41 +00:00
|
|
|
|
2014-11-13 05:29:07 +00:00
|
|
|
%token <f> FLOAT
|
2014-08-02 18:38:41 +00:00
|
|
|
%token <num> NUMBER
|
|
|
|
%token <str> COLON COMMA IDENTIFIER EQUAL NEWLINE STRING
|
|
|
|
%token <str> LEFTBRACE RIGHTBRACE LEFTBRACKET RIGHTBRACKET
|
2014-08-21 18:22:37 +00:00
|
|
|
%token <str> TRUE FALSE NULL MINUS PERIOD EPLUS EMINUS
|
2014-08-02 18:38:41 +00:00
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
top:
|
|
|
|
object
|
|
|
|
{
|
2015-11-07 19:33:31 +00:00
|
|
|
jsonResult = &ast.File{
|
|
|
|
Node: $1.List,
|
|
|
|
}
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
object:
|
|
|
|
LEFTBRACE members RIGHTBRACE
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.ObjectType{
|
|
|
|
List: $2,
|
2014-08-11 23:23:28 +00:00
|
|
|
}
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
| LEFTBRACE RIGHTBRACE
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.ObjectType{}
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
members:
|
|
|
|
pair
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.ObjectList{
|
|
|
|
Items: []*ast.ObjectItem{$1},
|
|
|
|
}
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
2014-08-05 04:53:39 +00:00
|
|
|
| members COMMA pair
|
2014-08-02 18:38:41 +00:00
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$1.Items = append($1.Items, $3)
|
|
|
|
$$ = $1
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pair:
|
|
|
|
STRING COLON value
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.ObjectItem{
|
|
|
|
Keys: []*ast.ObjectKey{
|
|
|
|
&ast.ObjectKey{
|
|
|
|
Token: token.Token{
|
2015-11-07 07:33:40 +00:00
|
|
|
Type: token.IDENT,
|
2015-11-07 00:48:00 +00:00
|
|
|
Text: $1,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
Val: $3,
|
|
|
|
}
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
value:
|
|
|
|
STRING
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.LiteralType{
|
2015-11-07 07:42:40 +00:00
|
|
|
Token: token.Token{
|
|
|
|
Type: token.STRING,
|
|
|
|
Text: fmt.Sprintf(`"%s"`, $1),
|
|
|
|
},
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
}
|
2014-08-03 20:34:08 +00:00
|
|
|
| number
|
2014-08-02 18:38:41 +00:00
|
|
|
{
|
2015-11-07 07:33:40 +00:00
|
|
|
$$ = $1
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
| object
|
|
|
|
{
|
|
|
|
$$ = $1
|
|
|
|
}
|
|
|
|
| array
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.ListType{
|
|
|
|
List: $1,
|
2014-08-11 23:23:28 +00:00
|
|
|
}
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
| TRUE
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.LiteralType{
|
|
|
|
Token: token.Token{Type: token.BOOL, Text: "true"},
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
| FALSE
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.LiteralType{
|
|
|
|
Token: token.Token{Type: token.BOOL, Text: "false"},
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
| NULL
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.LiteralType{
|
|
|
|
Token: token.Token{Type: token.STRING, Text: ""},
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
array:
|
|
|
|
LEFTBRACKET RIGHTBRACKET
|
|
|
|
{
|
2014-08-11 23:23:28 +00:00
|
|
|
$$ = nil
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
| LEFTBRACKET elements RIGHTBRACKET
|
|
|
|
{
|
2014-08-11 23:23:28 +00:00
|
|
|
$$ = $2
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
elements:
|
|
|
|
value
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = []ast.Node{$1}
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
2014-08-05 04:53:39 +00:00
|
|
|
| elements COMMA value
|
2014-08-02 18:38:41 +00:00
|
|
|
{
|
2014-08-05 04:53:39 +00:00
|
|
|
$$ = append($1, $3)
|
2014-08-02 18:38:41 +00:00
|
|
|
}
|
|
|
|
|
2014-08-03 20:34:08 +00:00
|
|
|
number:
|
|
|
|
int
|
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.LiteralType{
|
2015-11-07 07:33:40 +00:00
|
|
|
Token: token.Token{
|
|
|
|
Type: token.NUMBER,
|
|
|
|
Text: fmt.Sprintf("%d", $1),
|
|
|
|
},
|
2014-08-03 20:34:08 +00:00
|
|
|
}
|
|
|
|
}
|
2014-11-13 05:29:07 +00:00
|
|
|
| float
|
2014-08-03 20:34:08 +00:00
|
|
|
{
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.LiteralType{
|
|
|
|
Token: token.Token{
|
|
|
|
Type: token.FLOAT,
|
|
|
|
Text: fmt.Sprintf("%f", $1),
|
|
|
|
},
|
2014-08-03 20:34:08 +00:00
|
|
|
}
|
|
|
|
}
|
2014-08-21 18:22:37 +00:00
|
|
|
| int exp
|
|
|
|
{
|
|
|
|
fs := fmt.Sprintf("%d%s", $1, $2)
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.LiteralType{
|
|
|
|
Token: token.Token{
|
|
|
|
Type: token.FLOAT,
|
|
|
|
Text: fs,
|
|
|
|
},
|
2014-08-22 08:34:03 +00:00
|
|
|
}
|
|
|
|
}
|
2014-11-13 05:29:07 +00:00
|
|
|
| float exp
|
2014-08-22 08:34:03 +00:00
|
|
|
{
|
2014-11-13 05:29:07 +00:00
|
|
|
fs := fmt.Sprintf("%f%s", $1, $2)
|
2015-11-07 00:48:00 +00:00
|
|
|
$$ = &ast.LiteralType{
|
|
|
|
Token: token.Token{
|
|
|
|
Type: token.FLOAT,
|
|
|
|
Text: fs,
|
|
|
|
},
|
2014-08-21 18:22:37 +00:00
|
|
|
}
|
|
|
|
}
|
2014-08-03 20:34:08 +00:00
|
|
|
|
|
|
|
int:
|
|
|
|
MINUS int
|
|
|
|
{
|
|
|
|
$$ = $2 * -1
|
|
|
|
}
|
|
|
|
| NUMBER
|
|
|
|
{
|
|
|
|
$$ = $1
|
|
|
|
}
|
|
|
|
|
2014-11-13 05:29:07 +00:00
|
|
|
float:
|
|
|
|
MINUS float
|
|
|
|
{
|
|
|
|
$$ = $2 * -1
|
|
|
|
}
|
|
|
|
| FLOAT
|
|
|
|
{
|
|
|
|
$$ = $1
|
|
|
|
}
|
|
|
|
|
2014-08-21 18:22:37 +00:00
|
|
|
exp:
|
|
|
|
EPLUS NUMBER
|
|
|
|
{
|
|
|
|
$$ = "e" + strconv.FormatInt(int64($2), 10)
|
|
|
|
}
|
|
|
|
| EMINUS NUMBER
|
|
|
|
{
|
|
|
|
$$ = "e-" + strconv.FormatInt(int64($2), 10)
|
|
|
|
}
|
|
|
|
|
2014-08-02 18:38:41 +00:00
|
|
|
%%
|