1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | open System let testString = List.ofArray ("not a or b and c iff (d imp e)".ToCharArray()); // Тип-прямая сумма с токенами type Token = | LBrace | RBrace | Follows | IFF | Imp | And | Or | Not | True | False | Term of string // Именование токенов // TODO: сделать средствами языка let nameToken = function | LBrace -> "<Token: ( >" | RBrace -> "<Token: ) >" | Follows -> "<Token: |- >" | IFF -> "<Token: iff >" | Imp -> "<Token: imp >" | And -> "<Token: and >" | Or -> "<Token: or >" | Not -> "<Token: not >" | True -> "<Token: true >" | False -> "<Token: false >" | Term(s) -> "<Token: term \"" + s + "\" >" // Преобразование из списка символов в строку // TODO: сделать средствами языка let chListToString = List.fold (fun acc (chr:char) -> (acc.ToString()) + (chr.ToString())) "" // Функция-токенайзер let tokenize source = // Накапливает символы имени, возвращает разобранное имя и остаток строки // На входе имя и функция-аккумулятор let rec getName source' acmltor = match source' with | (')' :: _) as t -> List.rev acmltor, t // Завершить по скобке | w :: t when Char.IsWhiteSpace(w) -> List.rev acmltor, t // Завершить по пробелу | [] -> List.rev acmltor, [] // Завершить по концу списка | c :: t -> getName t (c :: acmltor) // Иначе накапливать символы // Преобразует строку имени в перечисляемый тип let determineToken s = match s with | "follows" -> Follows | "iff" -> IFF | "imp" -> Imp | "and" -> And | "or" -> Or | "not" -> Not | "true" -> True | "false" -> False | _ -> Term s // Основная функция токенайзера, выполняет лексиечский разбор // Требует аргумент-пустой список и возвращает токены в обратном порядке, // Поэтому обёрнута в функцию tokenize let rec tokenize' acmltor = function | w :: t when Char.IsWhiteSpace(w) -> tokenize' acmltor t | '(' :: t -> tokenize' (LBrace :: acmltor) t | ')' :: t -> tokenize' (RBrace :: acmltor) t | [] -> acmltor | term -> let tokenName, tail = getName term [] let token = determineToken (chListToString tokenName) tokenize' (token :: acmltor) tail | _ -> failwith "Ошибка лексического разбора" List.rev (tokenize' [] source) // Тестируем List.iter (fun x -> Console.WriteLine(nameToken x)) (tokenize testString) |
b3BlbiBTeXN0ZW0KbGV0IHRlc3RTdHJpbmcgPSAgTGlzdC5vZkFycmF5ICgibm90IGEgb3IgYiBhbmQgYyBpZmYgKGQgaW1wIGUpIi5Ub0NoYXJBcnJheSgpKTsKCi8vINCi0LjQvy3Qv9GA0Y/QvNCw0Y8g0YHRg9C80LzQsCDRgSDRgtC+0LrQtdC90LDQvNC4CnR5cGUgVG9rZW4gPQogfCBMQnJhY2UgfCBSQnJhY2UgfCBGb2xsb3dzIHwgSUZGIHwgSW1wCiB8IEFuZCB8IE9yIHwgTm90IHwgVHJ1ZSB8IEZhbHNlIHwgVGVybSBvZiBzdHJpbmcKCi8vINCY0LzQtdC90L7QstCw0L3QuNC1INGC0L7QutC10L3QvtCyCi8vIFRPRE86INGB0LTQtdC70LDRgtGMINGB0YDQtdC00YHRgtCy0LDQvNC4INGP0LfRi9C60LAKbGV0IG5hbWVUb2tlbiA9IGZ1bmN0aW9uCiB8IExCcmFjZSAtPiAiPFRva2VuOiAoID4iCiB8IFJCcmFjZSAtPiAiPFRva2VuOiApID4iCiB8IEZvbGxvd3MgLT4gIjxUb2tlbjogfC0gPiIKIHwgSUZGIC0+ICI8VG9rZW46IGlmZiA+IgogfCBJbXAgLT4gIjxUb2tlbjogaW1wID4iCiB8IEFuZCAtPiAiPFRva2VuOiBhbmQgPiIKIHwgT3IgLT4gIjxUb2tlbjogb3IgPiIKIHwgTm90IC0+ICI8VG9rZW46IG5vdCA+IgogfCBUcnVlIC0+ICI8VG9rZW46IHRydWUgPiIKIHwgRmFsc2UgLT4gIjxUb2tlbjogZmFsc2UgPiIKIHwgVGVybShzKSAtPiAiPFRva2VuOiB0ZXJtIFwiIiArIHMgKyAiXCIgPiIKCgovLyDQn9GA0LXQvtCx0YDQsNC30L7QstCw0L3QuNC1INC40Lcg0YHQv9C40YHQutCwINGB0LjQvNCy0L7Qu9C+0LIg0LIg0YHRgtGA0L7QutGDCi8vIFRPRE86INGB0LTQtdC70LDRgtGMINGB0YDQtdC00YHRgtCy0LDQvNC4INGP0LfRi9C60LAKbGV0IGNoTGlzdFRvU3RyaW5nID0gTGlzdC5mb2xkIChmdW4gYWNjIChjaHI6Y2hhcikgLT4gKGFjYy5Ub1N0cmluZygpKSArIChjaHIuVG9TdHJpbmcoKSkpICIiCgoKLy8g0KTRg9C90LrRhtC40Y8t0YLQvtC60LXQvdCw0LnQt9C10YAKbGV0IHRva2VuaXplIHNvdXJjZSA9IAogLy8g0J3QsNC60LDQv9C70LjQstCw0LXRgiDRgdC40LzQstC+0LvRiyDQuNC80LXQvdC4LCDQstC+0LfQstGA0LDRidCw0LXRgiDRgNCw0LfQvtCx0YDQsNC90L3QvtC1INC40LzRjyDQuCDQvtGB0YLQsNGC0L7QuiDRgdGC0YDQvtC60LgKIC8vINCd0LAg0LLRhdC+0LTQtSDQuNC80Y8g0Lgg0YTRg9C90LrRhtC40Y8t0LDQutC60YPQvNGD0LvRj9GC0L7RgAogbGV0IHJlYyBnZXROYW1lIHNvdXJjZScgYWNtbHRvciA9IAogIG1hdGNoIHNvdXJjZScgd2l0aAogICB8ICgnKScgOjogXykgYXMgdCAtPiBMaXN0LnJldiBhY21sdG9yLCB0ICAgICAgICAgICAgICAgICAgICAgLy8g0JfQsNCy0LXRgNGI0LjRgtGMINC/0L4g0YHQutC+0LHQutC1CiAgIHwgdyA6OiB0IHdoZW4gQ2hhci5Jc1doaXRlU3BhY2UodykgLT4gTGlzdC5yZXYgYWNtbHRvciwgdCAgICAvLyDQl9Cw0LLQtdGA0YjQuNGC0Ywg0L/QviDQv9GA0L7QsdC10LvRgwogICB8IFtdIC0+IExpc3QucmV2IGFjbWx0b3IsIFtdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g0JfQsNCy0LXRgNGI0LjRgtGMINC/0L4g0LrQvtC90YbRgyDRgdC/0LjRgdC60LAKICAgfCBjIDo6IHQgLT4gZ2V0TmFtZSB0IChjIDo6IGFjbWx0b3IpICAgICAgICAgICAgICAgICAgICAgICAgIC8vINCY0L3QsNGH0LUg0L3QsNC60LDQv9C70LjQstCw0YLRjCDRgdC40LzQstC+0LvRiwogLy8g0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDRgdGC0YDQvtC60YMg0LjQvNC10L3QuCDQsiDQv9C10YDQtdGH0LjRgdC70Y/QtdC80YvQuSDRgtC40L8KIGxldCBkZXRlcm1pbmVUb2tlbiBzID0gICAgICAgIAogIG1hdGNoIHMgd2l0aAogICB8ICJmb2xsb3dzIiAtPiBGb2xsb3dzCiAgIHwgImlmZiIgLT4gSUZGCiAgIHwgImltcCIgLT4gSW1wCiAgIHwgImFuZCIgLT4gQW5kCiAgIHwgIm9yIiAtPiBPcgogICB8ICJub3QiIC0+IE5vdAogICB8ICJ0cnVlIiAtPiBUcnVlCiAgIHwgImZhbHNlIiAtPiBGYWxzZQogICB8IF8gLT4gVGVybSBzCiAvLyDQntGB0L3QvtCy0L3QsNGPINGE0YPQvdC60YbQuNGPINGC0L7QutC10L3QsNC50LfQtdGA0LAsINCy0YvQv9C+0LvQvdGP0LXRgiDQu9C10LrRgdC40LXRh9GB0LrQuNC5INGA0LDQt9Cx0L7RgAogLy8g0KLRgNC10LHRg9C10YIg0LDRgNCz0YPQvNC10L3Rgi3Qv9GD0YHRgtC+0Lkg0YHQv9C40YHQvtC6INC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCINGC0L7QutC10L3RiyDQsiDQvtCx0YDQsNGC0L3QvtC8INC/0L7RgNGP0LTQutC1LAogLy8g0J/QvtGN0YLQvtC80YMg0L7QsdGR0YDQvdGD0YLQsCDQsiDRhNGD0L3QutGG0LjRjiB0b2tlbml6ZSAKIGxldCByZWMgdG9rZW5pemUnIGFjbWx0b3IgPSBmdW5jdGlvbgogIHwgdyA6OiB0IHdoZW4gQ2hhci5Jc1doaXRlU3BhY2UodykgLT4gdG9rZW5pemUnIGFjbWx0b3IgdAogIHwgJygnIDo6IHQgLT4gdG9rZW5pemUnIChMQnJhY2UgOjogYWNtbHRvcikgdAogIHwgJyknIDo6IHQgLT4gdG9rZW5pemUnIChSQnJhY2UgOjogYWNtbHRvcikgdCAgICAgCiAgfCBbXSAtPiBhY21sdG9yCiAgfCB0ZXJtIC0+IAogICBsZXQgdG9rZW5OYW1lLCB0YWlsID0gZ2V0TmFtZSB0ZXJtIFtdICAgCiAgIGxldCB0b2tlbiA9IGRldGVybWluZVRva2VuIChjaExpc3RUb1N0cmluZyB0b2tlbk5hbWUpICAgCiAgIHRva2VuaXplJyAodG9rZW4gOjogYWNtbHRvcikgdGFpbAogIHwgXyAtPiBmYWlsd2l0aCAi0J7RiNC40LHQutCwINC70LXQutGB0LjRh9C10YHQutC+0LPQviDRgNCw0LfQsdC+0YDQsCIKIExpc3QucmV2ICh0b2tlbml6ZScgW10gc291cmNlKQoKLy8g0KLQtdGB0YLQuNGA0YPQtdC8Ckxpc3QuaXRlciAoZnVuIHggLT4gQ29uc29sZS5Xcml0ZUxpbmUobmFtZVRva2VuIHgpKSAodG9rZW5pemUgdGVzdFN0cmluZykg
-
upload with new input
-
result: Success time: 0.06s memory: 11488 kB returned value: 0
<Token: not > <Token: term "a" > <Token: or > <Token: term "b" > <Token: and > <Token: term "c" > <Token: iff > <Token: ( > <Token: term "d" > <Token: imp > <Token: term "e" > <Token: ) >
-
result: Success time: 0.06s memory: 11488 kB returned value: 0
<Token: not > <Token: term "a" > <Token: or > <Token: term "b" > <Token: and > <Token: term "c" > <Token: iff > <Token: ( > <Token: term "d" > <Token: imp > <Token: term "e" > <Token: ) >



