ParseSequence - Return ast.Sequence (sequence of commands) created from client input after tokenization Parse tokens returned by lexer to structures defines in ast package, and it's responsible for syntax validation.
()
| 906 | // |
| 907 | // Parse tokens returned by lexer to structures defines in ast package, and it's responsible for syntax validation. |
| 908 | func (parser *Parser) ParseSequence() (*ast.Sequence, error) { |
| 909 | // Create variable holding sequence/commands |
| 910 | sequence := &ast.Sequence{} |
| 911 | |
| 912 | for parser.currentToken.Type != token.EOF { |
| 913 | var command ast.Command |
| 914 | var err error |
| 915 | switch parser.currentToken.Type { |
| 916 | case token.CREATE: |
| 917 | command, err = parser.parseCreateCommand() |
| 918 | case token.INSERT: |
| 919 | command, err = parser.parseInsertCommand() |
| 920 | case token.UPDATE: |
| 921 | command, err = parser.parseUpdateCommand() |
| 922 | case token.SELECT: |
| 923 | command, err = parser.parseSelectCommand() |
| 924 | case token.DELETE: |
| 925 | command, err = parser.parseDeleteCommand() |
| 926 | case token.DROP: |
| 927 | command, err = parser.parseDropCommand() |
| 928 | case token.WHERE: |
| 929 | lastCommand, parserError := parser.getLastCommand(sequence, token.WHERE) |
| 930 | if parserError != nil { |
| 931 | return nil, parserError |
| 932 | } |
| 933 | |
| 934 | if lastCommand.TokenLiteral() == token.SELECT { |
| 935 | newCommand, err := parser.parseWhereCommand() |
| 936 | if err != nil { |
| 937 | return nil, err |
| 938 | } |
| 939 | lastCommand.(*ast.SelectCommand).WhereCommand = newCommand.(*ast.WhereCommand) |
| 940 | } else if lastCommand.TokenLiteral() == token.DELETE { |
| 941 | newCommand, err := parser.parseWhereCommand() |
| 942 | if err != nil { |
| 943 | return nil, err |
| 944 | } |
| 945 | lastCommand.(*ast.DeleteCommand).WhereCommand = newCommand.(*ast.WhereCommand) |
| 946 | } else if lastCommand.TokenLiteral() == token.UPDATE { |
| 947 | newCommand, err := parser.parseWhereCommand() |
| 948 | if err != nil { |
| 949 | return nil, err |
| 950 | } |
| 951 | lastCommand.(*ast.UpdateCommand).WhereCommand = newCommand.(*ast.WhereCommand) |
| 952 | } else { |
| 953 | return nil, &SyntaxCommandExpectedError{command: "WHERE", neededCommands: []string{"SELECT", "DELETE", "UPDATE"}} |
| 954 | } |
| 955 | case token.ORDER: |
| 956 | lastCommand, parserError := parser.getLastCommand(sequence, token.ORDER) |
| 957 | if parserError != nil { |
| 958 | return nil, parserError |
| 959 | } |
| 960 | |
| 961 | if lastCommand.TokenLiteral() != token.SELECT { |
| 962 | return nil, &SyntaxCommandExpectedError{command: "ORDER BY", neededCommands: []string{"SELECT"}} |
| 963 | } |
| 964 | |
| 965 | selectCommand := lastCommand.(*ast.SelectCommand) |