/// <summary> /// Parse getted expression /// </summary> public void ParseExpression(TokensReader expr) { bool error = false; int trypos = -1; try { if (expr.tokens.IsEmpty()) { return; } reparse: TokensTemplate template = strongTemplates[expr.tokens[0]]; try { if (template.Parse(expr, exprend)) { List <TokensError> errs = template.Run(); if (!errs.IsEmpty()) { errors.AddRange(errs); error = true; } } else { error = true; } } catch { error = true; } if (error) { if (!tryTokens.IsEmpty()) { LaterCalls.RemoveLast(); if (trypos < 0) { if (tryPositions.IsEmpty()) // TODO: need to change text of error { errors.Add(new InvalidTokensTemplateError(line, "tryPositions is empty")); tryTokens.Clear(); // сделаем это для того, чтобы эта ошибка не повторялась return; // беспричинно и не было исключений (переведите на английский пж) } else { trypos = tryPositions.Pop(); } } expr.tokens.RemoveAt(trypos); if (count == 0) { count = tryCounts.Pop(); } if (count > 0) { count--; expr.tokens.Insert(trypos, tryTokens.Pop()); goto reparse; } } else { errors.Add(new InvalidTokensTemplateError(line, $"Invalid template of token {expression.tokens[0]}")); } } } catch (KeyNotFoundException) { reparse: foreach (TokensTemplate template in flexTemplates) { TokensReader backup = new TokensReader(); backup.Add(expr); try { if (template.Parse(expr, exprend)) { errors.AddRange(template.Run()); return; } else { expr = backup; } } catch { expr = backup; } } if (!tryTokens.IsEmpty()) { LaterCalls.RemoveLast(); if (trypos < 0) { if (tryPositions.IsEmpty()) // TODO: need to change text of error { errors.Add(new InvalidTokensTemplateError(line, "tryPositions is empty")); tryTokens.Clear(); // сделаем это для того, чтобы эта ошибка не повторялась return; // беспричинно и не было исключений (переведите на английский пж) } else { trypos = tryPositions.Pop(); } } expr.tokens.RemoveAt(trypos); if (count == 0) { count = tryCounts.Pop(); } if (count > 0) { count--; expr.tokens.Insert(trypos, tryTokens.Pop()); goto reparse; } } else { errors.Add(new InvalidTokensTemplateError(line, $"Unknown tokens template {string.Join(" ", expr.tokens)}")); } } finally { if (isFuncBody && needLaterCall) { LaterCalls.Call(); } needLaterCall = true; tryTokens.Clear(); } }
private void TransformHelpersTokensTemplate(SmartAppInfo manifest) { var template = new TokensTemplate(manifest); _writingService.WriteFile(Path.Combine(_context.BasePath, template.OutputPath), template.TransformText()); }