ParseTokens parses the given tokens into a StatementGenerator.
(tokens []Token, includeRepetition bool)
| 18 | |
| 19 | // ParseTokens parses the given tokens into a StatementGenerator. |
| 20 | func ParseTokens(tokens []Token, includeRepetition bool) (StatementGenerator, error) { |
| 21 | stack := NewStatementGeneratorStack() |
| 22 | var statements []StatementGenerator |
| 23 | variables := make(map[string]StatementGenerator) |
| 24 | currentVariable := "" |
| 25 | tokenReader := NewTokenReader(tokens) |
| 26 | ForLoop: |
| 27 | for { |
| 28 | token, ok := tokenReader.Next() |
| 29 | if !ok { |
| 30 | break ForLoop |
| 31 | } |
| 32 | switch token.Type { |
| 33 | case TokenType_Text: |
| 34 | stack.AddText(token.Literal) |
| 35 | case TokenType_Variable: |
| 36 | stack.AddVariable(token.Literal) |
| 37 | case TokenType_VariableDefinition: |
| 38 | currentVariable = token.Literal |
| 39 | if token, _ = tokenReader.Next(); token.Type != TokenType_LongSpace { |
| 40 | return nil, errors.Errorf("expected a long space after a variable definition declaration") |
| 41 | } |
| 42 | case TokenType_Or: |
| 43 | if err := stack.Or(); err != nil { |
| 44 | return nil, err |
| 45 | } |
| 46 | case TokenType_Repeat: |
| 47 | if includeRepetition { |
| 48 | if err := stack.Repeat(); err != nil { |
| 49 | return nil, err |
| 50 | } |
| 51 | } |
| 52 | case TokenType_OptionalRepeat: |
| 53 | if includeRepetition { |
| 54 | if err := stack.OptionalRepeat(token.Literal); err != nil { |
| 55 | return nil, err |
| 56 | } |
| 57 | } |
| 58 | case TokenType_ShortSpace, TokenType_MediumSpace: |
| 59 | return nil, errors.Errorf("token reader should have removed all short and medium spaces") |
| 60 | case TokenType_LongSpace, TokenType_EOF: |
| 61 | newStatement, err := stack.Finish() |
| 62 | if err != nil { |
| 63 | return nil, err |
| 64 | } |
| 65 | if newStatement == nil { |
| 66 | return nil, errors.Errorf("long space encountered before writing to the stack") |
| 67 | } |
| 68 | if len(currentVariable) > 0 { |
| 69 | if _, ok = variables[currentVariable]; ok { |
| 70 | return nil, errors.Errorf("multiple definitions for the same variable: %s", currentVariable) |
| 71 | } |
| 72 | variables[currentVariable] = newStatement |
| 73 | currentVariable = "" |
| 74 | } else { |
| 75 | statements = append(statements, newStatement) |
| 76 | } |
| 77 | if token.Type == TokenType_EOF { |
no test coverage detected