예제 #1
0
 /*multiplicative-expression-p:
  | multiplicative-operators unary-expression multiplicative-expression-p
  | EPSILON */
 private ExpressionNode multiplicative_expression_p(ExpressionNode leftExpression)
 {
     printIfDebug("multiplicative_expression_p");
     if (pass(multiplicativeOperatorOptions))
     {
         Token multiplicativeOperator = token;
         consumeToken();
         var            unaryExpression  = unary_expression();
         ExpressionNode resultExpression = null;
         if (multiplicativeOperator.type == TokenType.OP_MULTIPLICATION)
         {
             resultExpression = new MultNode(leftExpression, unaryExpression, multiplicativeOperator);
         }
         else if (multiplicativeOperator.type == TokenType.OP_DIVISION)
         {
             resultExpression = new DivNode(leftExpression, unaryExpression, multiplicativeOperator);
         }
         else
         {
             resultExpression = new ModNode(leftExpression, unaryExpression, multiplicativeOperator);
         }
         return(multiplicative_expression_p(resultExpression));
     }
     return(leftExpression);
 }
예제 #2
0
 private ExpressionNode TP(ExpressionNode param)
 {
     if (currentToken.Type == TokenTypes.Mult)
     {
         currentToken = lexer.GetNextToken();
         var fValue = F();
         var node   = new MultNode {
             LeftOperand = param, RightOperand = fValue
         };
         return(TP(node));
     }
     else if (currentToken.Type == TokenTypes.Div)
     {
         currentToken = lexer.GetNextToken();
         var fValue = F();
         var node   = new DivNode()
         {
             LeftOperand = param, RightOperand = fValue
         };
         return(TP(node));
     }
     else
     {
         return(param);
     }
 }
예제 #3
0
        private static (EquationNode part1, EquationNode part2) GenerateEquationTrees(IList <string> equation)
        {
            var(lhs1, lhs2) = GetNextNode(equation);

            while (equation.Count > 0)
            {
                var op = GetNextOpCode(equation);
                var(rhs1, rhs2) = GetNextNode(equation);

                switch (op)
                {
                case "*":
                    lhs1 = new MultNode(lhs1, rhs1);
                    lhs2 = new MultNode(lhs2, rhs2);
                    break;

                case "+":
                    lhs1 = new AddNode(lhs1, rhs1);

                    if (!lhs2.IsBracketNode && lhs2.GetType() == typeof(MultNode))
                    {
                        var multNode = (MultNode)lhs2;
                        multNode.Rhs = new AddNode(multNode.Rhs, rhs2);
                    }
                    else
                    {
                        lhs2 = new AddNode(lhs2, rhs2);
                    }
                    break;
                }
            }

            return(lhs1, lhs2);
        }
예제 #4
0
파일: expreval.cs 프로젝트: emtees/old-code
  public static Node BuildExpr() {
    MultNode tn = new MultNode();

    PlusNode pn = new PlusNode();
    pn.left = new IntNode (5);
    pn.right = new IntNode (4);

    tn.left = pn;
    tn.right = pn;

    return tn;
  }
예제 #5
0
    public static Node BuildExpr()
    {
        MultNode tn = new MultNode();

        PlusNode pn = new PlusNode();

        pn.left  = new IntNode(5);
        pn.right = new IntNode(4);

        tn.left  = pn;
        tn.right = pn;

        return(tn);
    }
예제 #6
0
 private void Parsing(MultNode node, StringBuilder sb, ref int lineNum)
 {
     Parsing(node.GetChild(0) as dynamic, sb, ref lineNum);
     Parsing(node.GetChild(1) as dynamic, sb, ref lineNum);
     PrintCommand(sb, "mul", ref lineNum);
 }
예제 #7
0
 private VarType Parsing(MultNode node, string methodName)
 {
     return ParseElementaryOperation(node, methodName);
 }
예제 #8
0
 private TypeInfo Visit(MultNode node, MethodBuilder builder, CodegenContext context)
 {
     return(BinaryOperatorVisit(node, builder, (x) => x.Mult(), context));
 }
예제 #9
0
    // throws RecognitionException [1]
    // $ANTLR end "expr_pm"
    // $ANTLR start "expr_dm"
    // C:\\Users\\Danaice\\Desktop\\lastversion\\Dany_gramatica tiger ANTLR oficial\\tiger_grammar.g:154:1: expr_dm returns [TigerNode dm] : exp1= expr ( MULT a= expr | DIV b= expr )* ;
    public TigerNode expr_dm()
    {
        TigerNode dm = null;

        IToken MULT12 = null;
        IToken DIV13 = null;
        TigerNode exp1 = null;

        TigerNode a = null;

        TigerNode b = null;

        try
        {
            // C:\\Users\\Danaice\\Desktop\\lastversion\\Dany_gramatica tiger ANTLR oficial\\tiger_grammar.g:154:32: (exp1= expr ( MULT a= expr | DIV b= expr )* )
            // C:\\Users\\Danaice\\Desktop\\lastversion\\Dany_gramatica tiger ANTLR oficial\\tiger_grammar.g:154:34: exp1= expr ( MULT a= expr | DIV b= expr )*
            {
                PushFollow(FOLLOW_expr_in_expr_dm1033);
                exp1 = expr();
                state.followingStackPointer--;
                if (state.failed) return dm;
                if ( (state.backtracking==0) )
                {
                  dm =  exp1;
                }
                // C:\\Users\\Danaice\\Desktop\\lastversion\\Dany_gramatica tiger ANTLR oficial\\tiger_grammar.g:155:36: ( MULT a= expr | DIV b= expr )*
                do
                {
                    int alt6 = 3;
                    int LA6_0 = input.LA(1);

                    if ( (LA6_0 == MULT) )
                    {
                        alt6 = 1;
                    }
                    else if ( (LA6_0 == DIV) )
                    {
                        alt6 = 2;
                    }

                    switch (alt6)
                    {
                        case 1 :
                            // C:\\Users\\Danaice\\Desktop\\lastversion\\Dany_gramatica tiger ANTLR oficial\\tiger_grammar.g:155:37: MULT a= expr
                            {
                                MULT12=(IToken)Match(input,MULT,FOLLOW_MULT_in_expr_dm1073); if (state.failed) return dm;
                                PushFollow(FOLLOW_expr_in_expr_dm1077);
                                a = expr();
                                state.followingStackPointer--;
                                if (state.failed) return dm;
                                if ( (state.backtracking==0) )
                                {

                                                                                        dm =  new MultNode(dm, a);
                                                                                        dm.Col=MULT12.CharPositionInLine;
                                                                                        dm.Row = MULT12.Line;

                                }

                            }
                            break;
                        case 2 :
                            // C:\\Users\\Danaice\\Desktop\\lastversion\\Dany_gramatica tiger ANTLR oficial\\tiger_grammar.g:160:37: DIV b= expr
                            {
                                DIV13=(IToken)Match(input,DIV,FOLLOW_DIV_in_expr_dm1118); if (state.failed) return dm;
                                PushFollow(FOLLOW_expr_in_expr_dm1122);
                                b = expr();
                                state.followingStackPointer--;
                                if (state.failed) return dm;
                                if ( (state.backtracking==0) )
                                {

                                                                                        dm =  new DivNode(dm, b);
                                                                                        dm.Col=DIV13.CharPositionInLine;
                                                                                        dm.Row = DIV13.Line;

                                }

                            }
                            break;

                        default:
                            goto loop6;
                    }
                } while (true);

                loop6:
                    ;	// Stops C# compiler whining that label 'loop6' has no statements

            }

        }
        catch (RecognitionException re)
        {
            ReportError(re);
            Recover(input,re);
        }
        finally
        {
        }
        return dm;
    }
예제 #10
0
 private ValInfo Visit(MultNode node)
 {
     return(BinaryOperator(node, (x, y) => x * y));
 }
예제 #11
0
 private TypeDescriptor Visit(MultNode node, Context context)
 {
     return(MathOperator(node, context));
 }