hcl/json/parse.y

228 lines
3.1 KiB
Plaintext
Raw Normal View History

2014-08-02 18:38:41 +00:00
// This is the yacc input for creating the parser for HCL JSON.
%{
package json
import (
"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
%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
%token <str> TRUE FALSE NULL MINUS PERIOD EPLUS EMINUS
2014-08-02 18:38:41 +00:00
%%
top:
object
{
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
}
}
| 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
}
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-11-13 05:29:07 +00:00
| float
{
2015-11-07 00:48:00 +00:00
$$ = &ast.LiteralType{
Token: token.Token{
Type: token.FLOAT,
Text: fmt.Sprintf("%f", $1),
},
}
}
| 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-11-13 05:29:07 +00:00
| float exp
{
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,
},
}
}
int:
MINUS int
{
$$ = $2 * -1
}
| NUMBER
{
$$ = $1
}
2014-11-13 05:29:07 +00:00
float:
MINUS float
{
$$ = $2 * -1
}
| FLOAT
{
$$ = $1
}
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
%%