示例#1
0
        /// <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();
            }
        }
示例#2
0
        private void TransformHelpersTokensTemplate(SmartAppInfo manifest)
        {
            var template = new TokensTemplate(manifest);

            _writingService.WriteFile(Path.Combine(_context.BasePath, template.OutputPath), template.TransformText());
        }