AdditiveLoop Additive -> Multiplicative ( (+ | -) Multiplicative)*
(tokenReader *TokenReader)
| 154 | |
| 155 | // AdditiveLoop Additive -> Multiplicative ( (+ | -) Multiplicative)* |
| 156 | func AdditiveLoop(tokenReader *TokenReader) (*ASTNode, error) { |
| 157 | child1, err := MultiplicativeLoop(tokenReader) |
| 158 | node := child1 |
| 159 | if err != nil { |
| 160 | return nil, err |
| 161 | } |
| 162 | for { |
| 163 | // add' |
| 164 | tokenType := tokenReader.Peek() |
| 165 | if tokenType != nil && (tokenType.TokenType() == token.Plus || tokenType.TokenType() == token.Minus) { |
| 166 | tokenType = tokenReader.Read() |
| 167 | |
| 168 | child2, err := MultiplicativeLoop(tokenReader) |
| 169 | if err != nil { |
| 170 | return nil, err |
| 171 | } |
| 172 | node = NewASTNode(AdditiveType, tokenType.Value()) |
| 173 | node.AddChild(child1) |
| 174 | node.AddChild(child2) |
| 175 | child1 = node |
| 176 | } else { |
| 177 | break |
| 178 | } |
| 179 | } |
| 180 | |
| 181 | if node != nil { |
| 182 | return node, nil |
| 183 | } else { |
| 184 | return nil, errors.New("syntax err, invalid additive") |
| 185 | } |
| 186 | |
| 187 | } |
| 188 | |
| 189 | // MultiplicativeLoop Multiplicative -> Primary ((* | /) Primary)* |
| 190 | func MultiplicativeLoop(tokenReader *TokenReader) (*ASTNode, error) { |
no test coverage detected