Пример #1
0
        // Returns NExprComp or any of subproduction nodes
        public Node ExprComp()
        {
            Node resultingNode = ExprRel();

            while (CurrentToken == TokenCategory.NOT_EQUAL || CurrentToken == TokenCategory.EQUAL)
            {
                NExprComp tmp = new NExprComp();
                tmp.Add(resultingNode);
                resultingNode = tmp;
                switch (CurrentToken)
                {
                case TokenCategory.NOT_EQUAL: {
                    resultingNode.AnchorToken = Expect(TokenCategory.NOT_EQUAL);
                    resultingNode.Add(ExprRel());
                    break;
                }

                case TokenCategory.EQUAL: {
                    resultingNode.AnchorToken = Expect(TokenCategory.EQUAL);
                    resultingNode.Add(ExprRel());
                    break;
                }
                }
            }
            return(resultingNode);
        }
Пример #2
0
        public string Visit(NExprComp nExprComp)
        {
            string retVal = "";

            if (nExprComp.children.Count == 2)
            {
                string pushTrueValue  = GenerateLabel();
                string pushFalseValue = GenerateLabel();
                string exitExpression = GenerateLabel();
                if (nExprComp.AnchorToken.Lexeme == "==")
                {
                    retVal += Visit((dynamic)nExprComp[0]);
                    retVal += Visit((dynamic)nExprComp[1]);
                    retVal += "\t\tceq\n";
                    retVal += "\t\tbrtrue " + pushTrueValue + "\n";
                    retVal += "\t\tbr " + pushFalseValue + "\n";
                }
                else if (nExprComp.AnchorToken.Lexeme == "!=")
                {
                    retVal += Visit((dynamic)nExprComp[0]);
                    retVal += Visit((dynamic)nExprComp[1]);
                    retVal += "\t\tceq\n";
                    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";
            }
            else
            {
                retVal += Visit((dynamic)nExprComp[0]);
            }
            return(retVal);
        }
Пример #3
0
//-----------------------------------------------------------
        public void Visit(NExprComp node)
        {
            VisitBinaryOperator('<', node /*, Type.INT*/);
        }
 public void Visit(NExprComp nExprComp)
 {
     GenericChildVisitor(nExprComp);
 }