Пример #1
0
        public string Visit(NExprUnary nExprUnary)
        {
            var   retVal      = "";
            Token anchorToken = nExprUnary.AnchorToken;

            retVal += Visit((dynamic)nExprUnary[0]);
            if (anchorToken != null)
            {
                switch (anchorToken.Category)
                {
                case TokenCategory.ADDITION: {
                    // Do nothing
                    break;
                }

                case TokenCategory.SUBTRACTION: {
                    // Multiply times -1
                    retVal += "\t\tldc.i8 -1\n";
                    retVal += "\t\tmul\n";
                    break;
                }

                case TokenCategory.NOT /*!*/: {
                    string pushTrueValue  = GenerateLabel();
                    string pushFalseValue = GenerateLabel();
                    string exitExpression = GenerateLabel();
                    retVal += "\t\tbrfalse " + pushTrueValue + "\n";
                    retVal += "\t\tbr " + pushFalseValue + "\n";
                    retVal += pushTrueValue + ":\n";
                    retVal += "\t\tldc.i8 1\n";
                    retVal += "\t\tbr " + exitExpression + "\n";
                    retVal += pushFalseValue + ":\n";
                    retVal += "\t\tldc.i8 0\n";
                    retVal += exitExpression + ":\n";
                    break;
                }

                case TokenCategory.BIT_NOT /*~*/: {
                    retVal += "\t\tnot\n";
                    break;
                }
                }
            }
            return(retVal);
        }
Пример #2
0
        // Returns NExprUnary or any of subproduction nodes
        public Node ExprUnary()
        {
            NExprUnary nExprUnary = new NExprUnary();

            if (firstOfUnary.Contains(CurrentToken))
            {
                switch (CurrentToken)
                {
                case TokenCategory.ADDITION: {
                    nExprUnary.AnchorToken = Expect(TokenCategory.ADDITION);
                    nExprUnary.Add(ExprUnary());
                    break;
                }

                case TokenCategory.SUBTRACTION: {
                    nExprUnary.AnchorToken = Expect(TokenCategory.SUBTRACTION);
                    nExprUnary.Add(ExprUnary());
                    break;
                }

                case TokenCategory.NOT: {
                    nExprUnary.AnchorToken = Expect(TokenCategory.NOT);
                    nExprUnary.Add(ExprUnary());
                    break;
                }

                case TokenCategory.BIT_NOT: {
                    nExprUnary.AnchorToken = Expect(TokenCategory.BIT_NOT);
                    nExprUnary.Add(ExprUnary());
                    break;
                }
                    // Default case would be unreachable
                }
            }
            else if (firstOfExprPrimary.Contains(CurrentToken))
            {
                return(ExprPrimary());
            }
            else
            {
                return(null);
            }
            return(nExprUnary);
        }
Пример #3
0
//-----------------------------------------------------------
        public void Visit(NExprUnary node)
        {
            Console.WriteLine($"+++++++++++++++ NExprUnary ++++++++++++++++");
            //VisitBinaryOperator('*', node /*, Type.INT*/);
            VisitChildren(node);
        }
 public void Visit(NExprUnary nExprUnary)
 {
     GenericChildVisitor(nExprUnary);
 }