diff --git a/ast/nodes.go b/ast/nodes.go index 3f23bb2..930186d 100644 --- a/ast/nodes.go +++ b/ast/nodes.go @@ -21,7 +21,9 @@ func (node *TokenNode) atomExpressionChild() {} func (node *TokenNode) comparisonChild() {} func (node *TokenNode) expressionStatementChild() {} func (node *TokenNode) factorChild() {} +func (node *TokenNode) fileInputChild() {} func (node *TokenNode) shiftExpressionChild() {} +func (node *TokenNode) simpleStatementChild() {} func (node *TokenNode) trailerChild() {} func (node *TokenNode) Name() string { return token.TokenNames[node.Token.ID] } func (node *TokenNode) Repr() []interface{} { diff --git a/ast/smallstatements.go b/ast/smallstatements.go deleted file mode 100644 index 27811d6..0000000 --- a/ast/smallstatements.go +++ /dev/null @@ -1,38 +0,0 @@ -package ast - -type SmallStatementChildNode interface { - Node - smallStmtChild() -} - -type SmallStatement struct { - ParentNode -} - -func NewSmallStatement() *SmallStatement { - node := &SmallStatement{} - node.initBaseNode(SMALL_STMT) - return node -} - -func (node *SmallStatement) SetChild(n SmallStatementChildNode) { node.ParentNode.SetChild(n) } - -type ExpressionStatementChildNode interface { - Node - expressionStatementChild() -} - -type ExpressionStatement struct { - ListNode - Expression *TestlistStarExpression -} - -func NewExpressionStatement() *ExpressionStatement { - node := &ExpressionStatement{} - node.initBaseNode(EXPR_STMT) - node.initListNode() - return node -} - -func (node *ExpressionStatement) smallStmtChild() {} -func (node *ExpressionStatement) Append(n ExpressionStatementChildNode) { node.ListNode.Append(n) } diff --git a/ast/start.go b/ast/start.go index 709ceee..55cf35f 100644 --- a/ast/start.go +++ b/ast/start.go @@ -1,5 +1,10 @@ package ast +type FileInputChildNode interface { + Node + fileInputChild() +} + type FileInput struct { ListNode } @@ -11,4 +16,4 @@ func NewFileInput() *FileInput { return node } -func (node *FileInput) Append(n *Statement) { node.ListNode.Append(n) } +func (node *FileInput) Append(n FileInputChildNode) { node.ListNode.Append(n) } diff --git a/ast/statements.go b/ast/statements.go index 2474025..1af25dc 100644 --- a/ast/statements.go +++ b/ast/statements.go @@ -15,8 +15,14 @@ func NewStatement() *Statement { return node } +func (node *Statement) fileInputChild() {} func (node *Statement) SetChild(n StatementChildNode) { node.ParentNode.SetChild(n) } +type SimpleStatementChildNode interface { + Node + simpleStatementChild() +} + type SimpleStatement struct { ListNode } @@ -28,8 +34,8 @@ func NewSimpleStatement() *SimpleStatement { return node } -func (node *SimpleStatement) stmtChildNode() {} -func (node *SimpleStatement) Append(n *SmallStatement) { node.ListNode.Append(n) } +func (node *SimpleStatement) stmtChildNode() {} +func (node *SimpleStatement) Append(n SimpleStatementChildNode) { node.ListNode.Append(n) } type CompoundStatement struct { BaseNode @@ -41,3 +47,41 @@ func NewCompoundStatement() *CompoundStatement { return node } func (node *CompoundStatement) stmtChildNode() {} + +type SmallStatementChildNode interface { + Node + smallStmtChild() +} + +type SmallStatement struct { + ParentNode +} + +func NewSmallStatement() *SmallStatement { + node := &SmallStatement{} + node.initBaseNode(SMALL_STMT) + return node +} + +func (node *SmallStatement) simpleStatementChild() {} +func (node *SmallStatement) SetChild(n SmallStatementChildNode) { node.ParentNode.SetChild(n) } + +type ExpressionStatementChildNode interface { + Node + expressionStatementChild() +} + +type ExpressionStatement struct { + ListNode + Expression *TestlistStarExpression +} + +func NewExpressionStatement() *ExpressionStatement { + node := &ExpressionStatement{} + node.initBaseNode(EXPR_STMT) + node.initListNode() + return node +} + +func (node *ExpressionStatement) smallStmtChild() {} +func (node *ExpressionStatement) Append(n ExpressionStatementChildNode) { node.ListNode.Append(n) } diff --git a/parser/parser.go b/parser/parser.go index 892b881..8ed4d1f 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -557,7 +557,12 @@ func (parser *Parser) parseSimpleStatement() *ast.SimpleStatement { break } } - parser.expect(token.NEWLINE) + next := parser.nextToken() + if next.ID != token.NEWLINE { + parser.addError("Expected \"NEWLINE\" instead found \"" + next.ID.String() + "\"") + return nil + } + simpleStmt.Append(ast.NewTokenNode(next)) // no small statements found if simpleStmt.Length() == 0 { @@ -589,8 +594,7 @@ func (parser *Parser) parseFileInput() *ast.FileInput { for parser.tokenizer.State() == errorcode.E_OK { next := parser.nextToken() if next.ID == token.NEWLINE { - // root.Append(ast.NewTokenNode(next)) - continue + root.Append(ast.NewTokenNode(next)) } else if next.ID == token.ENDMARKER { // Unread, so we can read in the expected value later parser.unreadToken(next) @@ -602,11 +606,15 @@ func (parser *Parser) parseFileInput() *ast.FileInput { break } root.Append(stmt) - break } } - parser.expect(token.ENDMARKER) + next := parser.nextToken() + if next.ID != token.ENDMARKER { + parser.addError("Expected \"ENDMARKER\" instead received \"" + next.ID.String() + "\"") + return nil + } + root.Append(ast.NewTokenNode(next)) return root }