| #pragma once |
| |
| #include "Token.h" |
| #include "VarContext.h" |
| |
| struct MatchResult |
| { |
| bool success; |
| VarContext context; |
| }; |
| |
| template <typename T> |
| bool listStartsWith(const QList<T> &haystack, const QList<T> &needle) |
| { |
| if (needle.length() > haystack.length()) |
| return false; |
| |
| for (int i = 0; i < needle.length(); i++) |
| { |
| if (haystack[i] != needle[i]) |
| return false; |
| } |
| |
| return true; |
| } |
| |
| template <typename T> |
| void listDrop(QList<T> &list, int n) |
| { |
| for (; n; n--) |
| { |
| list.removeFirst(); |
| } |
| } |
| |
| template <typename T> |
| QList<T> listSlice(QList<T> &list, int from, int to) |
| { |
| QList<T> prime; |
| |
| if (from >= list.length()) |
| return prime; |
| |
| // I guess we'll just panic if it's too long |
| // TODO: ERROR HANDLING |
| for (int i = 0; i < to - from; i++) |
| { |
| prime.append(list[from + i]); |
| } |
| |
| return prime; |
| } |
| |
| MatchResult match(QList<Token> data, QList<Token> pattern, VarContext context); |