public Code Not(Code opd)
        {
            Node expr = (Node)opd;

            if (expr.type == NodeType.tpInt)
            {
                if (expr.tag == NodeTag.opIntConst)
                {
                    IntLiteralNode ic = (IntLiteralNode)expr;
                    ic.val = ~ic.val;
                }
                else
                {
                    expr = new UnaryOpNode(NodeType.tpInt, NodeTag.opIntNot, expr);
                }
                return(expr);
            }
            else if (expr.type == NodeType.tpBool)
            {
                return(new UnaryOpNode(NodeType.tpBool, NodeTag.opBoolNot, expr));
            }
            else
            {
                throw new CodeGeneratorException("Invalid argument types");
            }
        }
Пример #2
0
        private Ast Assignment()
        {
            Func <Ast> op = () => {
                if (TokenStream.current is Keyword)
                {
                    if (((Keyword)TokenStream.current).KeywordType == KeywordType.Int)
                    {
                        TokenStream.Consume();
                        if (TokenStream.current is Statement)
                        {
                            string name = TokenStream.current.Value;
                            TokenStream.Consume();
                            if (((Keyword)TokenStream.current).KeywordType == KeywordType.Assignment)
                            {
                                TokenStream.Consume();
                                IntLiteralNode val = (IntLiteralNode)TokenStream.Capture(IntLiteral);
                                TokenStream.Consume();
                                return(new AssignmentNode(TypeValue.Integer, name, val.Value));
                            }
                        }
                    }
                }
                return(null);
            };

            return(TokenStream.Capture(op));
        }
        public Code Neg(Code opd)
        {
            Node expr = (Node)opd;

            if (expr.type == NodeType.tpInt)
            {
                if (expr.tag == NodeTag.opIntConst)
                {
                    IntLiteralNode ic = (IntLiteralNode)expr;
                    ic.val = -ic.val;
                }
                else
                {
                    expr = new UnaryOpNode(NodeType.tpInt, NodeTag.opIntNeg, expr);
                }
            }
            else if (expr.type == NodeType.tpReal)
            {
                if (expr.tag == NodeTag.opRealConst)
                {
                    RealLiteralNode fc = (RealLiteralNode)expr;
                    fc.val = -fc.val;
                }
                else
                {
                    expr = new UnaryOpNode(NodeType.tpReal, NodeTag.opRealNeg, expr);
                }
            }
            else
            {
                throw new CodeGeneratorException("Invalid argument types");
            }
            return(expr);
        }
        public void CanCreatePublicInstanceWithNonPublicConstructor()
        {
            ConstructorNode ctorNode = new ConstructorNode();
            ctorNode.Text=typeof(PublicTestClass).FullName;
            StringLiteralNode sNode = new StringLiteralNode();
            sNode.Text = "theValue2";
            ctorNode.addChild(sNode);
            IntLiteralNode iNode = new IntLiteralNode();
            iNode.Text="2";
            ctorNode.addChild(iNode);

            PublicTestClass instance = (PublicTestClass) ((IExpression)ctorNode).GetValue();
            Assert.AreEqual( sNode.Text, instance._s );
            Assert.AreEqual( 2, instance._i );
        }
Пример #5
0
        public Type Visit(IntLiteralNode node)
        {
            var intStr = node.AnchorToken.Lexeme;

            try
            {
                Convert.ToInt32(intStr);
            }
            catch (OverflowException)
            {
                throw new SemanticError(
                          $"Integer literal too large: {intStr}",
                          node.AnchorToken);
            }

            return(Type.INT);
        }
Пример #6
0
        public void Visit(IntLiteralNode node)
        {
            var intStr = node.AnchorToken.Lexeme;

            if (intStr.Equals("false"))
            {
                //Equivale a cero (único valor falso de Wyvern) 7u7
            }
            else
            {
                try {
                    Convert.ToInt32(intStr);
                }
                catch (OverflowException) {
                    throw new SemanticError("Integer overflow, this integer is too big: " + intStr, node.AnchorToken);
                }
            }
        }
Пример #7
0
        public void CanCreateNonPublicInstanceWithNonPublicConstructor()
        {
            ConstructorNode ctorNode = new ConstructorNode();

            ctorNode.Text = typeof(PrivateTestClass).FullName;
            StringLiteralNode sNode = new StringLiteralNode();

            sNode.Text = "theValue3";
            ctorNode.addChild(sNode);
            IntLiteralNode iNode = new IntLiteralNode();

            iNode.Text = "3";
            ctorNode.addChild(iNode);

            PublicTestClass instance = (PublicTestClass)((IExpression)ctorNode).GetValue();

            Assert.AreEqual(sNode.Text, instance._s);
            Assert.AreEqual(3, instance._i);
        }
Пример #8
0
        public Node SimpleLiteral()
        {
            switch (CurrentToken)
            {
            case TokenCategory.INT_LITERAL:
                var intLiteral = new IntLiteralNode()
                {
                    AnchorToken = Expect(TokenCategory.INT_LITERAL)
                };
                return(intLiteral);


            case TokenCategory.STR_LITERAL:
                var str_literal = Expect(TokenCategory.STR_LITERAL);
                var strLiteral  = new StrLiteralNode()
                {
                };
                strLiteral.AnchorToken = str_literal;
                return(strLiteral);

            case TokenCategory.TRUE:
                var trueLiteral = new TrueNode()
                {
                    AnchorToken = Expect(TokenCategory.TRUE)
                };
                return(trueLiteral);

            case TokenCategory.FALSE:
                var falseLiteral = new FalseNode()
                {
                    AnchorToken = Expect(TokenCategory.FALSE)
                };
                return(falseLiteral);

            default:
                throw new SyntaxError(firstOfDeclaration,
                                      tokenStream.Current);
            }
        }
Пример #9
0
 public object Visit(IntLiteralNode n, object o)
 {
     return(null);
 }
Пример #10
0
 public void Visit(IntLiteralNode node)
 {
     builder.AppendLine($"\t\tldc.i4 {node.AnchorToken.Lexeme}");
 }
Пример #11
0
 public object Visit(IntLiteralNode n, object o)
 {
     Append(n.Value);
     return(null);
 }
Пример #12
0
        private ExpressionNode Primary()
        {
            ExpressionNode     itsAST = null; // in case there is a syntactic error
            SourceCodePosition itsPos = _currentToken.SourcePosition;

            if (_currentToken.Type == Token.TokenType.LeftParen)
            {
                Accept(Token.TokenType.LeftParen);
                itsAST = Expression();
                Accept(Token.TokenType.RightParen);
            }
            else if (Array.Exists(_literalFirstSet, e => e == _currentToken.Type))
            {
                switch (_currentToken.Type)
                {
                case Token.TokenType.IntLiteral:
                    IntLiteralNode intLiteral = new IntLiteralNode(_currentToken.Value, _currentToken.SourcePosition);
                    Accept(Token.TokenType.IntLiteral);
                    itsAST = new IntExpressionNode(intLiteral, itsPos);
                    break;

                case Token.TokenType.RealLiteral:
                    RealLiteralNode realLiteral = new RealLiteralNode(_currentToken.Value, _currentToken.SourcePosition);
                    Accept(Token.TokenType.RealLiteral);
                    itsAST = new RealExpressionNode(realLiteral, itsPos);
                    break;

                case Token.TokenType.StringLiteral:
                    StringLiteralNode stringLiteral = new StringLiteralNode(_currentToken.Value, _currentToken.SourcePosition);
                    Accept(Token.TokenType.StringLiteral);
                    itsAST = new StringExpressionNode(stringLiteral, itsPos);
                    break;

                case Token.TokenType.BooleanLiteral:
                    BooleanLiteralNode booleanLiteral = new BooleanLiteralNode(_currentToken.Value, _currentToken.SourcePosition);
                    Accept(Token.TokenType.BooleanLiteral);
                    itsAST = new BooleanExpressionNode(booleanLiteral, itsPos);
                    break;

                case Token.TokenType.Null:
                    NullLiteralNode nullLiteral = new NullLiteralNode(_currentToken.Value, _currentToken.SourcePosition);
                    Accept(Token.TokenType.Null);
                    itsAST = new NullExpressionNode(nullLiteral, itsPos);
                    break;

                default:
                    itsAST = null;      // should not happen
                    break;
                }
            }
            else if (_currentToken.Type == Token.TokenType.Identifier)
            {
                itsAST = MemberReference();
            }
            else if (_currentToken.Type == Token.TokenType.This)
            {
                itsAST = ThisReference();
            }
            else if (_currentToken.Type == Token.TokenType.New)
            {
                itsAST = Instantiation();
            }
            else
            {
                Error("The token is invalid in the current context");
            }
            return(itsAST);
        }
Пример #13
0
 public IntExpressionNode(IntLiteralNode intLiteral, SourceCodePosition pos) : base(pos)
 {
     IntLiteral = intLiteral;
 }