diff --git a/ast/base.go b/ast/base.go new file mode 100644 index 0000000..f129bed --- /dev/null +++ b/ast/base.go @@ -0,0 +1,13 @@ +package ast + +type BaseNode struct { + ID NodeID +} + +func (node *BaseNode) initBaseNode(id NodeID) { + node.ID = id +} + +func (node *BaseNode) Name() string { + return NodeNames[node.ID] +} diff --git a/ast/compoundstatement.go b/ast/compoundstatement.go new file mode 100644 index 0000000..ea3cc46 --- /dev/null +++ b/ast/compoundstatement.go @@ -0,0 +1,13 @@ +package ast + +type CompoundStatement struct { + Statement +} + +func NewCompoundStatement() *CompoundStatement { + node := &CompoundStatement{} + node.initBaseNode(SIMPLE_STMT) + return node +} + +func (node *CompoundStatement) StatementNode() {} diff --git a/ast/expressionstatement.go b/ast/expressionstatement.go new file mode 100644 index 0000000..b7b6ddf --- /dev/null +++ b/ast/expressionstatement.go @@ -0,0 +1,13 @@ +package ast + +type ExpressionStatement struct { + BaseNode +} + +func NewExpressionStatement() *ExpressionStatement { + node := &ExpressionStatement{} + node.initBaseNode(EXPR_STMT) + return node +} + +func (node *ExpressionStatement) SmallStatementNode() {} diff --git a/ast/node.go b/ast/node.go index 3d50198..bbc0d0a 100644 --- a/ast/node.go +++ b/ast/node.go @@ -1,6 +1,5 @@ package ast type Node interface { - ID() NodeID Name() string } diff --git a/ast/simplestatement.go b/ast/simplestatement.go new file mode 100644 index 0000000..517d5d7 --- /dev/null +++ b/ast/simplestatement.go @@ -0,0 +1,18 @@ +package ast + +type SimpleStatement struct { + BaseNode + Statements []*SmallStatement +} + +func NewSimpleStatement() *SimpleStatement { + node := &SimpleStatement{} + node.initBaseNode(SIMPLE_STMT) + return node +} + +func (node *SimpleStatement) StatementNode() {} + +func (node *SimpleStatement) AppendSmallStatement(n *SmallStatement) { + node.Statements = append(node.Statements, n) +} diff --git a/ast/smallstatement.go b/ast/smallstatement.go new file mode 100644 index 0000000..afaf76a --- /dev/null +++ b/ast/smallstatement.go @@ -0,0 +1,16 @@ +package ast + +type SmallStatementNode interface { + SmallStatementNode() +} + +type SmallStatement struct { + BaseNode + Statement SmallStatementNode +} + +func NewSmallStatement() *SmallStatement { + node := &SmallStatement{} + node.initBaseNode(SMALL_STMT) + return node +} diff --git a/ast/statement.go b/ast/statement.go new file mode 100644 index 0000000..ace66b3 --- /dev/null +++ b/ast/statement.go @@ -0,0 +1,18 @@ +package ast + +type StatementNode interface { + StatementNode() +} + +type Statement struct { + BaseNode + Statement StatementNode +} + +func NewStatement() *Statement { + node := &Statement{} + node.initBaseNode(STMT) + return node +} + +func (node *Statement) StatementNode() {}