public MacroStatement(SourceFile sourceFile, int lineNo, 
            Token[] definition, Token[][] body) throws SyntaxError {
        super(sourceFile, lineNo, definition);

        if(!definition[0].is(TokenType.MACRO_START)){
            throwSyntaxError(0, "Not a macro");
        }
        
        if(!body[body.length - 1][0].is(TokenType.MACRO_END)){
            throwSyntaxError(0, "No macro end found");
        }
        
        if(body.length == 1){
            throwSyntaxError(0, "No macro body defined");
        }
        
        name = definition[0].getValue().substring(1);
        this.body = body;
        arguments = new ArrayList<String>();
        expansionCount = 0;
        
        for(int i = 1; i < definition.length; i++) {
            if(definition[i].is(TokenType.WORD)){
                String argument = definition[i].getValue();
                if(arguments.contains(argument)){
                    throwSyntaxError(i, "Argument '" + argument + "' repeated");
                }
                
                arguments.add(argument);
            }else if(!definition[i].is(TokenType.EOL)){
                throwSyntaxError(i, "Unexpected  " + definition[i].getType() + " token");
            }
        }  
    }