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)); }
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)); }
public static Parser <Lexeme> Optional(this Token token) { CodeContract.RequiresArgumentNotNull(token, "token"); return(token.AsParser().Optional()); }
public static Parser <IEnumerable <Lexeme> > Many1(this Token token, Token separator) { CodeContract.RequiresArgumentNotNull(token, "parser"); return(token.AsParser().Many1(separator.AsParser())); }
public static Parser <IEnumerable <T> > Many1 <T>(this Parser <T> parser, Token seperator) { CodeContract.RequiresArgumentNotNull(parser, "parser"); return(parser.Many1(seperator.AsParser())); }
public static Parser <IEnumerable <Lexeme> > Many(this Token token) { CodeContract.RequiresArgumentNotNull(token, "token"); return(token.AsParser().Many()); }
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); }
public static Parser <Lexeme[]> Many1(this Token token) { CodeContract.RequiresArgumentNotNull(token, "token"); return(token.AsParser().Many1()); }