AssignmentStatement -> Identifier = Additive parse: a = 10*2,
(reader *TokenReader)
| 82 | |
| 83 | // AssignmentStatement -> Identifier = Additive parse: a = 10*2, |
| 84 | func AssignmentStatement(reader *TokenReader) (*ASTNode, error) { |
| 85 | var node *ASTNode |
| 86 | tokenType := reader.Peek() |
| 87 | if tokenType == nil { |
| 88 | return nil, errors.New("syntax err: invalid AssignmentStatement") |
| 89 | } |
| 90 | |
| 91 | if tokenType.TokenType() == token.Identifier { |
| 92 | tokenType = reader.Read() |
| 93 | node = NewASTNode(AssignmentStmt, tokenType.Value()) |
| 94 | |
| 95 | tokenType = reader.Peek() |
| 96 | if tokenType == nil { |
| 97 | return nil, errors.New("syntax err: invalid AssignmentStatement") |
| 98 | } |
| 99 | |
| 100 | if tokenType.TokenType() == token.Assignment { |
| 101 | tokenType = reader.Read() |
| 102 | |
| 103 | child1, err := AdditiveLoop(reader) |
| 104 | if err != nil { |
| 105 | return nil, err |
| 106 | } |
| 107 | node.AddChild(child1) |
| 108 | |
| 109 | // parse end |
| 110 | tokenType = reader.Peek() |
| 111 | if tokenType == nil || tokenType.TokenType() != token.Enter { |
| 112 | return nil, errors.New("syntax err: invalid statement, miss enter") |
| 113 | } |
| 114 | tokenType = reader.Read() |
| 115 | |
| 116 | } else { |
| 117 | reader.UnRead() |
| 118 | } |
| 119 | } |
| 120 | return node, nil |
| 121 | } |
| 122 | |
| 123 | // EvaluateWithRuntime deep recursion loop AST |
| 124 | func EvaluateWithRuntime(node *ASTNode, indent string) interface{} { |
no test coverage detected