コード例 #1
0
        private static SyntaxNode BinaryOperator(RParser.ExprContext expr, Func <ParserRuleContext, Scope, SyntaxNode> transform, Scope scope)
        {
            var left  = transform(expr.GetRuleContext <RParser.ExprContext>(0), scope) as ExpressionSyntax;
            var right = transform(expr.GetRuleContext <RParser.ExprContext>(1), scope) as ExpressionSyntax;

            Debug.Assert(left != null && right != null);

            Debug.Assert(expr.children.Count == 3);
            var op = expr.children[1].GetText();

            return(binaryOperatorCall.Get(_binaryOperators[op], left, right));
        }
コード例 #2
0
        private static SyntaxNode UnaryOperator(RParser.ExprContext expr, Func <ParserRuleContext, Scope, SyntaxNode> transform, Scope scope)
        {
            Debug.Assert(expr.children.Count == 2);
            var op = expr.children[0].GetText();

            var value = transform(expr.GetRuleContext <RParser.ExprContext>(0), scope) as ExpressionSyntax;

            if (isConstant(value))
            {
                return(CSharp.ParseExpression(op + value.ToString()));
            }

            Debug.Assert(value != null);

            return(unaryOperatorCall.Get(_unaryOperators[op], value));
        }
コード例 #3
0
        private static BlockSyntax parseBlock(RParser.ExprContext expr, Func <ParserRuleContext, Scope, SyntaxNode> transform, Scope scope)
        {
            var node = transform(expr, scope);

            if (expr is RParser.CompoundContext)
            {
                return((BlockSyntax)node);
            }

            if (node is ExpressionSyntax)
            {
                node = CSharp.ExpressionStatement(node as ExpressionSyntax);
            }

            return(CSharp
                   .Block()
                   .WithStatements(CSharp.List(new StatementSyntax[] {
                (StatementSyntax)node
            })));
        }