コード例 #1
0
        public override void Visit(FunctionDCLNode node)
        {
            InsideFunc = true;
            _FuncPrototypes.Append(node.Type + " " + node.ID + "(");
            Emit(node.Type + " " + node.ID + "(");

            foreach (FunctionArgumentNode argumentNode in node.Arguments)
            {
                if (argumentNode != node.Arguments[^ 1])
                {
                    _FuncPrototypes.Append(argumentNode.Type + " " + argumentNode.ID + ", ");
                    Emit(argumentNode.Type + " " + argumentNode.ID + ", ");
                }
                else
                {
                    _FuncPrototypes.Append(argumentNode.Type + " " + argumentNode.ID);
                    Emit(argumentNode.Type + " " + argumentNode.ID);
                }
            }
            _FuncPrototypes.Append(");\n");
            Emit(") {\n");

            Visit(node.Body);
            Emit("}\n");
            InsideFunc = false;
        }
コード例 #2
0
ファイル: PrettyPrintVisitor.cs プロジェクト: Deaxz/ML4D
 public override void Visit(FunctionDCLNode node)
 {
     Console.WriteLine(node.Type + " " + node.ID);
     i += 2;
     VisitChildren(node, Inden());
     i -= 2;
 }
コード例 #3
0
        public void DuplicateFunctionDeclarationErrorTest()
        {
            FunctionDCLNode funcDclNode1 = new FunctionDCLNode("void", "myFunction");

            funcDclNode1.Body = new LinesNode();
            FunctionDCLNode funcDclNode2 = new FunctionDCLNode("int", "myFunction");

            funcDclNode2.Body = new LinesNode();

            SymbolTable symbolTable             = new SymbolTable();
            TypeCheckSymbolTableVisitor visitor = new TypeCheckSymbolTableVisitor(symbolTable);

            visitor.Visit(funcDclNode1);

            Assert.ThrowsException <FunctionAlreadyDeclaredException>(() =>
            {
                visitor.Visit(funcDclNode2);
            });
        }
コード例 #4
0
ファイル: ASTBuilder.cs プロジェクト: Deaxz/ML4D
        public override Node VisitFuncDecl(ML4DParser.FuncDeclContext context)
        {
            FunctionDCLNode functionDclNode;

            switch (context.type.type.Type)
            {
            case ML4DLexer.INT:
                functionDclNode = new FunctionDCLNode("int", context.id.Text);
                break;

            case ML4DLexer.DOUBLE:
                functionDclNode = new FunctionDCLNode("double", context.id.Text);
                break;

            case ML4DLexer.BOOL:
                functionDclNode = new FunctionDCLNode("bool", context.id.Text);
                break;

            case ML4DLexer.VOID:
                functionDclNode = new FunctionDCLNode("void", context.id.Text);
                break;

            default:
                throw new NotSupportedException(
                          $"The function {context.id.Text}, was declared with an illegal type.");
            }

            for (int i = 0; i < context._argid.Count; i++)
            {
                functionDclNode.Arguments.Add(new FunctionArgumentNode(
                                                  context._argtype[i].type.Text, context._argid[i].Text));
            }

            functionDclNode.Body = VisitLines(context.body);
            return(functionDclNode);
        }
コード例 #5
0
        public override void Visit(FunctionDCLNode node)
        {
            if (SymbolTable.GetCurrentFunctionType() is null)
            {
                if (SymbolTable.Retrieve(node.ID) is null)
                {
                    SymbolTable.Insert(node.ID, node.Type, true);
                }
                else
                {
                    throw new FunctionAlreadyDeclaredException(node,
                                                               $"The function \"{node.ID}\" has already been declared in the current or parent scope.");
                }
            }
            else
            {
                throw new Exception(
                          $"The function \"{node.ID}\" was declared in a function. Nested function are not allowed in ML4D.");
            }

            SymbolTable.OpenScope(node.Type);
            base.Visit(node);
            SymbolTable.CloseScope();
        }
コード例 #6
0
 public FunctionAlreadyDeclaredException(FunctionDCLNode node, string message) : base(message)
 {
     Node = node;
 }
コード例 #7
0
 public virtual void Visit(FunctionDCLNode node)
 {
     VisitChildren(node);
 }