Пример #1
0
        private static void TestFactorial()
        {
            var whileParser = new WhileParser();
            var builder     = new ParserBuilder <WhileToken, WhileAST>();
            var Parser      = builder.BuildParser(whileParser, ParserType.EBNF_LL_RECURSIVE_DESCENT, "statement");

            ;

            var program = @"
(
    r:=1;
    i:=1;
    while i < 11 do 
    (";

            program += "\nprint \"r=\".r;\n";
            program += "r := r * i;\n";
            program += "print \"r=\".r;\n";
            program += "print \"i=\".i;\n";
            program += "i := i + 1 \n);\n";
            program += "return r)\n";
            var result      = Parser.Result.Parse(program);
            var interpreter = new Interpreter();
            var context     = interpreter.Interprete(result.Result);

            var compiler = new WhileCompiler();
            var code     = compiler.TranspileToCSharp(program);
            var f        = compiler.CompileToFunction(program);

            ;
        }
Пример #2
0
        public WhileCompiler()
        {
            var parser  = new WhileParser();
            var builder = new ParserBuilder <WhileToken, WhileAST>();
            var whileParserBuildResult = builder.BuildParser(parser, ParserType.EBNF_LL_RECURSIVE_DESCENT, "statement");

            whileParser = whileParserBuildResult.Result;
        }
Пример #3
0
        public BuildResult <Parser <WhileToken, WhileAST> > buildParser()
        {
            if (Parser == null)
            {
                var whileParser = new WhileParser();
                var builder     = new ParserBuilder <WhileToken, WhileAST>();
                Parser = builder.BuildParser(whileParser, ParserType.EBNF_LL_RECURSIVE_DESCENT, "statement");
            }

            return(Parser);
        }
Пример #4
0
        public static bool Parse(SyntaxContext context, int position)
        {
            var list     = context.list;
            var offset   = 0;
            var index    = position;
            var count    = 0;
            var isMissed = false;

            count = 0;
            while (true)
            {
                while (ReturnParser.Parse(context, index))
                {
                    ;
                }
                while (BreakParser.Parse(context, index))
                {
                    ;
                }
                while (DoParser.Parse(context, index))
                {
                    ;
                }
                while (WhileParser.Parse(context, index))
                {
                    ;
                }
                while (ForNParser.Parse(context, index))
                {
                    ;
                }
                while (ForParser.Parse(context, index))
                {
                    ;
                }
                while (ForEachParser.Parse(context, index))
                {
                    ;
                }
                while (FunctionNParser.Parse(context, index))
                {
                    ;
                }
                while (FunctionSParser.Parse(context, index))
                {
                    ;
                }
                while (IfParser.Parse(context, index))
                {
                    ;
                }
                while (IfElseParser.Parse(context, index))
                {
                    ;
                }
                while (DefineNParser.Parse(context, index))
                {
                    ;
                }
                while (CallParser.Parse(context, index))
                {
                    ;
                }
                while (BindParser.Parse(context, index))
                {
                    ;
                }
                while (BindNParser.Parse(context, index))
                {
                    ;
                }
                if (context.isMissed)
                {
                    context.isMissed = false;
                    offset          += 1;
                    index            = position + offset;
                    count           += 1;
                    break;
                }
                if (!list[index].isStatement)
                {
                    break;
                }
                else
                {
                    // ignored
                }
                offset += 1;
                index   = position + offset;
                count  += 1;
            }
            if (count == 0)
            {
                return(false);
            }
            context.Insert(position, ExpressionCreator.CreateModule(list, position, offset));
            context.Remove(position + 1, offset);
            return(true);
        }