MCPcopy Create free account
hub / github.com/dolthub/doltgresql / ParseTokens

Function ParseTokens

testing/generation/utils/parse_tokens.go:20–124  ·  view source on GitHub ↗

ParseTokens parses the given tokens into a StatementGenerator.

(tokens []Token, includeRepetition bool)

Source from the content-addressed store, hash-verified

18
19// ParseTokens parses the given tokens into a StatementGenerator.
20func 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)
26ForLoop:
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 {

Callers 3

customDefinitionFunction · 0.92

Calls 15

NextMethod · 0.95
AddTextMethod · 0.95
AddVariableMethod · 0.95
OrMethod · 0.95
RepeatMethod · 0.95
OptionalRepeatMethod · 0.95
FinishMethod · 0.95
NewParenScopeMethod · 0.95
ExitParenScopeMethod · 0.95
NewOptionalScopeMethod · 0.95
ExitOptionalScopeMethod · 0.95
NewScopeMethod · 0.95

Tested by

no test coverage detected