Esempio n. 1
0
        private static CodeMemberMethod CreateBinOpParseFunction(AphidBinaryOperatorExpressionRule rule)
        {
            var parseOperand    = CreateParseOperand(rule);
            var operandRef      = CodeHelper.VarRef("operand");
            var operandVar      = CodeHelper.VarDecl(typeof(Expression), "operand", parseOperand);
            var curTokenTypeRef = CodeHelper.PropRef("_currentToken").GetProperty("TokenType");
            var tokenTypeRef    = CodeHelper.TypeRefExp <AphidTokenType>();
            var operatorRef     = CodeHelper.VarRef("op");
            var operatorVar     = CodeHelper.VarDecl(typeof(AphidTokenType), "op", curTokenTypeRef);
            var nextToken       = CodeHelper.This().InvokeMethod("NextToken");

            var condition = rule.Operators
                            .Select(x => tokenTypeRef.GetProperty(x))
                            .Select(x => CodeHelper.BinOpExp(curTokenTypeRef, CodeBinaryOperatorType.ValueEquality, x))
                            .BinOpExpJoin(CodeBinaryOperatorType.BooleanOr);

            var assignStmt = CodeHelper.Assign(
                operandRef,
                CodeHelper.New(
                    typeof(BinaryOperatorExpression),
                    operandRef,
                    operatorRef,
                    parseOperand));

            var whileStmt = CodeHelper.While(condition);

            whileStmt.Statements.Add(operatorVar);
            whileStmt.Statements.Add(nextToken);
            whileStmt.Statements.Add(assignStmt);

            var method = new CodeMemberMethod()
            {
                ReturnType = CodeHelper.TypeRef <Expression>(),
                Name       = "Parse" + rule.Name,
            };

            method.Statements.Add(operandVar);
            method.Statements.Add(whileStmt);
            method.Statements.Add(CodeHelper.Return(operandRef));

            return(method);
        }
Esempio n. 2
0
        private static CodeMemberMethod CreateBinOpParseFunction(AphidBinaryOperatorExpressionRule rule)
        {
            var parseOperand = CreateParseOperand(rule);
            var operandRef = CodeHelper.VarRef("operand");
            var operandVar = CodeHelper.VarDecl(typeof(AphidExpression), "operand", parseOperand);
            var curTokenTypeRef = CodeHelper.PropRef("_currentToken").GetProperty("TokenType");
            var tokenTypeRef = CodeHelper.TypeRefExp<AphidTokenType>();
            var operatorRef = CodeHelper.VarRef("op");
            var operatorVar = CodeHelper.VarDecl(typeof(AphidTokenType), "op", curTokenTypeRef);
            var nextToken = CodeHelper.This().InvokeMethod("NextToken");

            var condition = rule.Operators
                .Select(x => tokenTypeRef.GetProperty(x))
                .Select(x => CodeHelper.BinOpExp(curTokenTypeRef, CodeBinaryOperatorType.ValueEquality, x))
                .BinOpExpJoin(CodeBinaryOperatorType.BooleanOr);

            var assignStmt = CodeHelper.Assign(
                operandRef,
                CodeHelper.New(
                    typeof(BinaryOperatorExpression),
                    operandRef,
                    operatorRef,
                    parseOperand));

            var whileStmt = CodeHelper.While(condition);
            whileStmt.Statements.Add(operatorVar);
            whileStmt.Statements.Add(nextToken);
            whileStmt.Statements.Add(assignStmt);

            var method = new CodeMemberMethod()
            {
                ReturnType = CodeHelper.TypeRef<AphidExpression>(),
                Name = "Parse" + rule.Name,
            };

            method.Statements.Add(operandVar);
            method.Statements.Add(whileStmt);
            method.Statements.Add(CodeHelper.Return(operandRef));

            return method;
        }
Esempio n. 3
0
 private static CodeExpression CreateParseOperand(AphidBinaryOperatorExpressionRule rule)
 {
     return CodeHelper.This().InvokeMethod("Parse" + rule.Operand);
 }
Esempio n. 4
0
 private static CodeExpression CreateParseOperand(AphidBinaryOperatorExpressionRule rule)
 {
     return(CodeHelper.This().InvokeMethod("Parse" + rule.Operand));
 }