char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
c15395f73
char/aliceai-t5-moe
1#pragma once 2 3#include "utils.h" 4 5#include <cctype> 6#include <map> 7#include <stdexcept> 8#include <string> 9#include <vector> 10 11namespace jinja { 12 13struct token { 14enum type { 15eof ,// end of source 16text ,// The text between Jinja statements or expressions 17 18numeric_literal ,// e.g., 123, 1.0 19string_literal ,// 'string' 20identifier ,// Variables, functions, statements, booleans, etc. 21equals ,// = 22open_paren ,// ( 23close_paren ,// ) 24open_statement ,// {% 25close_statement ,// %} 26open_expression ,// {{ 27close_expression ,// }} 28open_square_bracket ,// [ 29close_square_bracket ,// ] 30open_curly_bracket ,// { 31close_curly_bracket ,// } 32comma ,// , 33dot ,// . 34colon ,// : 35pipe ,// | 36 37call_operator ,// () 38additive_binary_operator ,// + - ~ 39multiplicative_binary_operator ,// * / % 40comparison_binary_operator ,// < > <= >= == != 41unary_operator ,// ! - + 42comment ,// {# ... #} 43 }; 44type t ; 45std ::string value ; 46size_t pos ; 47}; 48 49static std ::string type_to_string (token ::type t ) { 50switch (t ) { 51case token ::eof :return "eof" ; 52case token ::text :return "text" ; 53case token ::numeric_literal :return "numeric_literal" ; 54case token ::string_literal :return "string_literal" ; 55case token ::identifier :return "identifier" ; 56case token ::equals :return "equals" ; 57case token ::open_paren :return "open_paren" ; 58case token ::close_paren :return "close_paren" ; 59case token ::open_statement :return "open_statement" ; 60case token ::close_statement :return "close_statement" ; 61case token ::open_expression :return "open_expression" ; 62case token ::close_expression :return "close_expression" ; 63case token ::open_square_bracket :return "open_square_bracket" ; 64case token ::close_square_bracket :return "close_square_bracket" ; 65case token ::open_curly_bracket :return "open_curly_bracket" ; 66case token ::close_curly_bracket :return "close_curly_bracket" ; 67case token ::comma :return "comma" ; 68case token ::dot :return "dot" ; 69case token ::colon :return "colon" ; 70case token ::pipe :return "pipe" ; 71case token ::call_operator :return "call_operator" ; 72case token ::additive_binary_operator :return "additive_binary_operator" ; 73case token ::multiplicative_binary_operator :return "multiplicative_binary_operator" ; 74case token ::comparison_binary_operator :return "comparison_binary_operator" ; 75case token ::unary_operator :return "unary_operator" ; 76case token ::comment :return "comment" ; 77default :return "unknown" ; 78 } 79} 80 81struct lexer_result { 82std ::vector < token > tokens ; 83std ::string source ; 84}; 85 86struct lexer { 87const std ::map < char ,char > escape_chars = { 88 {'n ','\n' }, 89 {'t' ,'\t' }, 90 {'r' ,'\r' }, 91 {'b' ,'\b' }, 92 {'f' ,'\f' }, 93 {'v' ,'\v' }, 94 {'\\' ,'\\' }, 95 {'\'' ,'\'' }, 96 {'\"' ,'\"' }, 97 }; 98 99static bool is_word (char c ) { 100return std ::isalnum (static_cast < unsigned char > (c ))|| c == '_' ; 101 } 102 103static bool is_integer (char c ) { 104return std ::isdigit (static_cast < unsigned char > (c )); 105 } 106 107const std ::vector < std ::pair < std ::string ,token ::type >>ordered_mapping_table = { 108// Trimmed control sequences 109 {"{%-" ,token ::open_statement }, 110 {"-%}" ,token ::close_statement }, 111 {"{{-" ,token ::open_expression }, 112 {"-}}" ,token ::close_expression }, 113// Control sequences 114 {"{%" ,token ::open_statement }, 115 {"%}" ,token ::close_statement }, 116 {"{{" ,token ::open_expression }, 117 {"}}" ,token ::close_expression }, 118// Single character tokens 119 {"(" ,token ::open_paren }, 120 {")" ,token ::close_paren }, 121 {"{" ,token ::open_curly_bracket }, 122 {"}" ,token ::close_curly_bracket }, 123 {"[" ,token ::open_square_bracket }, 124 {"]" ,token ::close_square_bracket }, 125 {"," ,token ::comma }, 126 {"." ,token ::dot }, 127 {":" ,token ::colon }, 128 {"|" ,token ::pipe }, 129// Comparison operators 130 {"<=" ,token ::comparison_binary_operator }, 131 {">=" ,token ::comparison_binary_operator }, 132 {"==" ,token ::comparison_binary_operator }, 133 {"!=" ,token ::comparison_binary_operator }, 134 {"<" ,token ::comparison_binary_operator }, 135 {">" ,token ::comparison_binary_operator }, 136// Arithmetic operators 137 {"+" ,token ::additive_binary_operator }, 138 {"-" ,token ::additive_binary_operator }, 139 {"~" ,token ::additive_binary_operator }, 140 {"*" ,token ::multiplicative_binary_operator }, 141 {"/" ,token ::multiplicative_binary_operator }, 142 {"%" ,token ::multiplicative_binary_operator }, 143// Assignment operator 144 {"=" ,token ::equals }, 145 }; 146 147// tokenize the source string into a list of tokens 148// may throw lexer_exception on error 149lexer_result tokenize (const std ::string & source ); 150}; 151 152struct lexer_exception :public std ::runtime_error { 153lexer_exception (const std ::string & msg ,const std ::string & source ,size_t pos ) 154 :std ::runtime_error (fmt_error_with_source ("lexer" ,msg ,source ,pos )) {} 155}; 156 157}// namespace jinja