// 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); }
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); }
//----------------------------------------------------------- public void Visit(NExprComp node) { VisitBinaryOperator('<', node /*, Type.INT*/); }
public void Visit(NExprComp nExprComp) { GenericChildVisitor(nExprComp); }