From 6b5bd170f60839c029cbc8d0ed842ebe4a98a2f7 Mon Sep 17 00:00:00 2001 From: Fatih Arslan Date: Sat, 24 Oct 2015 22:10:10 +0300 Subject: [PATCH] parser: fix all tests, comments are still WIP --- ast/ast.go | 17 ----------------- parser/parser.go | 40 +++++++++++----------------------------- parser/parser_test.go | 1 + 3 files changed, 12 insertions(+), 46 deletions(-) diff --git a/ast/ast.go b/ast/ast.go index e30d88b..25b42da 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -8,8 +8,6 @@ type Node interface { Pos() token.Pos } -func (NodeList) node() {} - func (ObjectList) node() {} func (ObjectKey) node() {} func (ObjectItem) node() {} @@ -19,21 +17,6 @@ func (ObjectType) node() {} func (LiteralType) node() {} func (ListType) node() {} -// ObjectList represents a list of ObjectItems. An HCL file itself is an -// ObjectList. -type NodeList struct { - Nodes []Node -} - -func (n *NodeList) Add(node Node) { - n.Nodes = append(n.Nodes, node) -} - -func (n *NodeList) Pos() token.Pos { - // always returns the uninitiliazed position - return n.Nodes[0].Pos() -} - // ObjectList represents a list of ObjectItems. An HCL file itself is an // ObjectList. type ObjectList struct { diff --git a/parser/parser.go b/parser/parser.go index 96323df..c47c21c 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -29,12 +29,12 @@ var errEofToken = errors.New("EOF token found") // Parse returns the fully parsed source and returns the abstract syntax tree. func (p *Parser) Parse() (ast.Node, error) { - return p.parseNodeList() + return p.parseObjectList() } -func (p *Parser) parseNodeList() (*ast.NodeList, error) { +func (p *Parser) parseObjectList() (*ast.ObjectList, error) { defer un(trace(p, "ParseObjectList")) - node := &ast.NodeList{} + node := &ast.ObjectList{} for { n, err := p.next() @@ -48,31 +48,11 @@ func (p *Parser) parseNodeList() (*ast.NodeList, error) { return node, err } - // we successfully parsed a node, add it to the final source node - node.Add(n) - } - - return node, nil -} - -func (p *Parser) parseObjectList() (*ast.ObjectList, error) { - defer un(trace(p, "ParseObjectList")) - node := &ast.ObjectList{} - - for { - n, err := p.parseObjectItem() - if err == errEofToken { - break // we are finished + if item, ok := n.(*ast.ObjectItem); ok { + // we successfully parsed a node, add it to the final source node + node.Add(item) } - // we don't return a nil, because might want to use already collected - // items. - if err != nil { - return node, err - } - - // we successfully parsed a node, add it to the final source node - node.Add(n) } return node, nil @@ -83,11 +63,10 @@ func (p *Parser) next() (ast.Node, error) { defer un(trace(p, "ParseNode")) tok := p.scan() - if tok.Type == token.EOF { - return nil, errEofToken - } switch tok.Type { + case token.EOF: + return nil, errEofToken case token.IDENT, token.STRING: p.unscan() return p.parseObjectItem() @@ -240,6 +219,9 @@ func (p *Parser) parseListType() (*ast.ListType, error) { case token.COMMA: // get next list item or we are at the end continue + case token.COMMENT: + // TODO(arslan): parse comment + continue case token.BOOL: // TODO(arslan) should we support? not supported by HCL yet case token.LBRACK: diff --git a/parser/parser_test.go b/parser/parser_test.go index b91318f..5d800a7 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -20,6 +20,7 @@ func TestType(t *testing.T) { {token.STRING, `foo = "foo"`}, {token.NUMBER, `foo = 123`}, {token.FLOAT, `foo = 123.12`}, + {token.FLOAT, `foo = -123.12`}, {token.BOOL, `foo = true`}, }