Ejemplo n.º 1
0
Archivo: Parsers.cs Proyecto: zgf/VBF
        public static Parser <TResult> Select <TResult>(this Token token, Func <Lexeme, TResult> selector)
        {
            CodeContract.RequiresArgumentNotNull(token, "token");
            CodeContract.RequiresArgumentNotNull(selector, "selector");

            return(new MappingParser <Lexeme, TResult>(token.AsParser(), selector));
        }
Ejemplo n.º 2
0
Archivo: Parsers.cs Proyecto: zgf/VBF
        public static Parser <TResult> SelectMany <TResult>(this Token token, Func <Lexeme, Token> parserSelector, Func <Lexeme, Lexeme, TResult> resultSelector)
        {
            CodeContract.RequiresArgumentNotNull(token, "token");
            CodeContract.RequiresArgumentNotNull(parserSelector, "parserSelector");
            CodeContract.RequiresArgumentNotNull(resultSelector, "resultSelector");

            return(new ConcatenationParser <Lexeme, Lexeme, TResult>(token.AsParser(), v => parserSelector(v).AsParser(), resultSelector));
        }
Ejemplo n.º 3
0
Archivo: Parsers.cs Proyecto: zgf/VBF
        public static Parser <Lexeme> Optional(this Token token)
        {
            CodeContract.RequiresArgumentNotNull(token, "token");

            return(token.AsParser().Optional());
        }
Ejemplo n.º 4
0
Archivo: Parsers.cs Proyecto: zgf/VBF
        public static Parser <IEnumerable <Lexeme> > Many1(this Token token, Token separator)
        {
            CodeContract.RequiresArgumentNotNull(token, "parser");

            return(token.AsParser().Many1(separator.AsParser()));
        }
Ejemplo n.º 5
0
Archivo: Parsers.cs Proyecto: zgf/VBF
        public static Parser <IEnumerable <T> > Many1 <T>(this Parser <T> parser, Token seperator)
        {
            CodeContract.RequiresArgumentNotNull(parser, "parser");

            return(parser.Many1(seperator.AsParser()));
        }
Ejemplo n.º 6
0
Archivo: Parsers.cs Proyecto: zgf/VBF
        public static Parser <IEnumerable <Lexeme> > Many(this Token token)
        {
            CodeContract.RequiresArgumentNotNull(token, "token");

            return(token.AsParser().Many());
        }
Ejemplo n.º 7
0
        protected override Compilers.Parsers.Combinators.Parser <Ast.Program> OnDefineParser()
        {
            PProgram.Reference = // MainClass ClassDecl*
                                 from main in PMainClass
                                 from classes in PClassDecl.Many()
                                 select new Program(main, classes.ToArray());

            PMainClass.Reference = // static class id { public static void Main(string[] id) { statement }}
                                   from _static1 in K_STATIC
                                   from _class in K_CLASS
                                   from className in ID
                                   from _1 in LEFT_BR
                                   from _public in K_PUBLIC
                                   from _static2 in K_STATIC
                                   from _void in K_VOID
                                   from _main in K_MAIN
                                   from _2 in LEFT_PH
                                   from _string in K_STRING
                                   from _3 in LEFT_BK
                                   from _4 in RIGHT_BK
                                   from arg in ID
                                   from _5 in RIGHT_PH
                                   from _6 in LEFT_BR
                                   from statements in PStatement.Many1()
                                   from _7 in RIGHT_BR
                                   from _8 in RIGHT_BR
                                   select new MainClass(className.Value, arg.Value, statements.ToArray());

            var classMembers =
                from _1 in LEFT_BR
                from varDecls in PFieldDecl.Many()
                from methodDecls in PMethodDecl.Many()
                from _2 in RIGHT_BR
                select new { Fields = varDecls.ToArray(), Methods = methodDecls.ToArray() };

            var classDeclSimple = // { VarDecl* MethodDecl* }
                                  from members in classMembers
                                  select new { BaseClassName = default(Lexeme), Members = members };

            var classDeclInherits = //: id { VarDecl* MethodDecl* }
                                    from _1 in COLON
                                    from baseClassName in ID
                                    from members in classMembers
                                    select new { BaseClassName = baseClassName, Members = members };

            PClassDecl.Reference = //class id
                                   from _class in K_CLASS
                                   from className in ID
                                   from def in (classDeclSimple | classDeclInherits)
                                   select new ClassDecl(className.Value, def.BaseClassName.GetValue(), def.Members.Fields, def.Members.Methods);

            PFieldDecl.Reference = // Type id;
                                   from type in PType
                                   from varName in ID
                                   from _sc in SEMICOLON
                                   select new FieldDecl(type, varName.Value);

            var methodBody =
                from _1 in LEFT_BR
                from statements in PStatement.Many()
                from _return in K_RETURN
                from returnExp in PExp
                from _sc in SEMICOLON
                from _2 in RIGHT_BR
                select new { Statements = statements.ToArray(), ReturnExp = returnExp };

            var methodNoBody =
                from _sc in SEMICOLON
                select new { Statements = default(Statement[]), ReturnExp = default(Expression) };

            PMethodDecl.Reference = // public Type id (FormalList) { Statement* return Exp; }
                                    from _public in K_PUBLIC
                                    from type in PType
                                    from methodName in ID
                                    from _1 in LEFT_PH
                                    from formals in PFormalList
                                    from _2 in RIGHT_PH
                                    from body in (methodBody | methodNoBody)
                                    select new MethodDecl(methodName.Value, type, formals, body.Statements, body.ReturnExp);

            var paramFormal =
                from paramType in PType
                from paramName in ID
                select new Formal(paramType, paramName.Value);

            PFormalList.Reference = // Type id FormalRest* | <empty>
                                    from list in paramFormal.Many(COMMA)
                                    select list.ToArray();

            PType.Reference = // int[] | bool | int | id
                              PIntArrayType | PBoolType | PIntType | PIdType;

            PIntArrayType.Reference = //int[]
                                      from _int in K_INT
                                      from _lb in LEFT_BK
                                      from _rb in RIGHT_BK
                                      select(Ast.Type) new IntArrayType();

            PBoolType.Reference = // bool
                                  from _bool in K_BOOL
                                  select(Ast.Type) new BooleanType();

            PIntType.Reference = // int
                                 from _int in K_INT
                                 select(Ast.Type) new IntegerType();

            PIdType.Reference = // id
                                from type in ID
                                select(Ast.Type) new IdentifierType(type.Value);

            //statements

            PStatement.Reference = // { statement*} | ifelse | while | writeline | assign | array assign | var decl
                                   (from _1 in LEFT_BR from stmts in PStatement.Many() from _2 in RIGHT_BR select(Statement) new Block(stmts.ToArray())) |
                                   PIfElse |
                                   PWhile |
                                   PWriteLine |
                                   PAssignment |
                                   PArrayAssignment |
                                   PVarDeclStmt;

            PIfElse.Reference = // if ( exp ) statement else statement
                                from _if in K_IF
                                from _1 in LEFT_PH
                                from condExp in PExp
                                from _2 in RIGHT_PH
                                from truePart in PStatement
                                from _else in K_ELSE
                                from falsePart in PStatement
                                select(Statement) new IfElse(condExp, truePart, falsePart, _if.Value.Span, _else.Value.Span);

            PWhile.Reference = // while ( exp ) statement
                               from _while in K_WHILE
                               from _1 in LEFT_PH
                               from condExp in PExp
                               from _2 in RIGHT_PH
                               from loopBody in PStatement
                               select(Statement) new While(condExp, loopBody, _while.Value.Span);

            PWriteLine.Reference = // System.Console.WriteLine( exp );
                                   from _sys in K_SYSTEM
                                   from _1 in DOT
                                   from _console in K_CONSOLE
                                   from _2 in DOT
                                   from _wl in K_WRITELINE
                                   from _3 in LEFT_PH
                                   from exp in PExp
                                   from _4 in RIGHT_PH
                                   from _sc in SEMICOLON
                                   select(Statement) new WriteLine(exp, new SourceSpan(_sys.Value.Span.StartLocation, _wl.Value.Span.EndLocation));

            PAssignment.Reference = // id = exp;
                                    from variable in ID
                                    from _eq in ASSIGN
                                    from value in PExp
                                    from _sc in SEMICOLON
                                    select(Statement) new Assign(variable.Value, value);

            PArrayAssignment.Reference = // id[ exp ] = exp ;
                                         from variable in ID
                                         from _1 in LEFT_BK
                                         from index in PExp
                                         from _2 in RIGHT_BK
                                         from _eq in ASSIGN
                                         from value in PExp
                                         from _sc in SEMICOLON
                                         select(Statement) new ArrayAssign(variable.Value, index, value);

            PVarDeclStmt.Reference = // Type id;
                                     from type in PType
                                     from varName in ID
                                     from _sc in SEMICOLON
                                     select(Statement) new VarDecl(type, varName.Value);

            //expressions

            //basic
            PNumberLiteral.Reference = // number
                                       from intvalue in INTEGER_LITERAL
                                       select(Expression) new IntegerLiteral(intvalue.Value);

            PBoolLiteral.Reference = // true | false
                                     from b in K_TRUE.AsParser() | K_FALSE.AsParser()
                                     select(Expression) new BooleanLiteral(b.Value);

            PThis.Reference = // this
                              from _this in K_THIS
                              select(Expression) new This(_this.Value.Span);

            PVariable.Reference = // id
                                  from varName in ID
                                  select(Expression) new Variable(varName.Value);

            PNewObj.Reference = // new id()
                                from _new in K_NEW
                                from typeName in ID
                                from _1 in LEFT_PH
                                from _2 in RIGHT_PH
                                select(Expression) new NewObject(typeName.Value);

            PNewArray.Reference = // new int [exp]
                                  from _new in K_NEW
                                  from _int in K_INT
                                  from _1 in LEFT_BK
                                  from length in PExp
                                  from _2 in RIGHT_BR
                                  select(Expression) new NewArray(length, new SourceSpan(_1.Value.Span.EndLocation, _2.Value.Span.StartLocation));

            var foundationExp = // (exp) | number literal | true | false | this | id | new
                                PNumberLiteral |
                                PBoolLiteral |
                                PThis |
                                PVariable |
                                PNewObj |
                                PNewArray |
                                PExp.PackedBy(LEFT_PH.AsParser(), RIGHT_PH.AsParser());


            PCall.Reference = // exp.id(explist)
                              from _d in DOT
                              from methodName in ID
                              from _1 in LEFT_PH
                              from args in PExpList
                              from _2 in RIGHT_PH
                              select new Func <Expression, Expression>(e =>
                                                                       new Call(e, methodName.Value, args));

            PArrayLookup.Reference = // exp[exp]
                                     from _1 in LEFT_BK
                                     from index in PExp
                                     from _2 in RIGHT_BK
                                     select new Func <Expression, Expression>(e =>
                                                                              new ArrayLookup(e, index, new SourceSpan(_1.Value.Span.EndLocation, _2.Value.Span.StartLocation)));

            PArrayLength.Reference = // exp.Length
                                     from _d in DOT
                                     from _length in K_LENGTH
                                     select new Func <Expression, Expression>(e =>
                                                                              new ArrayLength(e, _length.Value.Span));

            var basicExp = //foundation >> call | id[exp] | id.Length
                           from exp in foundationExp
                           from follow in (PCall | PArrayLookup | PArrayLength).Optional()
                           select follow == null ? exp : follow(exp);

            //unary

            PNot.Reference = // ! exp
                             basicExp |
                             from _n in LOGICAL_NOT
                             from exp in PNot
                             select(Expression) new Not(exp, _n.Value.Span);

            //binary

            PFactor.Reference = // exp | !exp
                                PNot;

            var termRest =
                from op in (ASTERISK.AsParser() | SLASH.AsParser())
                from factor in PFactor
                select new { Op = op, Right = factor };

            PTerm.Reference = // term * factor | factor
                              from factor in PFactor
                              from rest in termRest.Many()
                              select rest.Aggregate(factor, (f, r) => new Binary(r.Op.Value, f, r.Right));

            var comparandRest =
                from op in (PLUS.AsParser() | MINUS.AsParser())
                from term in PTerm
                select new { Op = op, Right = term };

            PComparand.Reference = // comparand + term | term
                                   from term in PTerm
                                   from rest in comparandRest.Many()
                                   select rest.Aggregate(term, (t, r) => new Binary(r.Op.Value, t, r.Right));


            var comparisonRest =
                from op in (LESS.AsParser() | GREATER.AsParser() | EQUAL.AsParser())
                from comparand in PComparand
                select new { Op = op, Right = comparand };

            PComparison.Reference = // comparison < comparand | comparand
                                    from comparand in PComparand
                                    from rest in comparisonRest.Many()
                                    select rest.Aggregate(comparand, (c, r) => new Binary(r.Op.Value, c, r.Right));

            var andRest =
                from op in LOGICAL_AND
                from comparison in PComparison
                select new { Op = op, Right = comparison };

            PAnd.Reference = // andexp && comparison | comparison
                             from comparison in PComparison
                             from rest in andRest.Many()
                             select rest.Aggregate(comparison, (c, r) => new Binary(r.Op.Value, c, r.Right));

            var orRest =
                from op in LOGICAL_OR
                from comparison in PComparison
                select new { Op = op, Right = comparison };

            POr.Reference = // orexp || andexp | andexp
                            from and in PAnd
                            from rest in orRest.Many()
                            select rest.Aggregate(and, (c, r) => new Binary(r.Op.Value, c, r.Right));

            PExp.Reference = POr;

            PExpList.Reference =
                from list in PExp.Many(COMMA)
                select list.ToArray();


            return(PProgram);
        }
Ejemplo n.º 8
0
        public static Parser <Lexeme[]> Many1(this Token token)
        {
            CodeContract.RequiresArgumentNotNull(token, "token");

            return(token.AsParser().Many1());
        }