<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->

<html>
<body>

This package and its subpackages contain the Falcon compiler.

<p>
The Falcon compiler compiles Flex code consisting of <code>.mxml</code>
<code>.as</code>, <code>.css</code>, <code>.fxg</code>, and
<code>.properties</code> files into SWF and SWC files.
<p>

<p>
The main entry point for compiling a SWF is in the <code>MXMLC</code> class
in the package <code>org.apache.flex.compiler.clients</code>.
The main entry point for compiling a SWC is in the <code>COMPC</code> class
in the same package.
The corresponding Ant tasks are in the package <code>org.apache.flex.compiler.ant</code>.
</p>

<p>
The <code>org.apache.flex.compiler</code> package makes use of the libraries
in the <code>org.apache.flex.abc</code>, <code>org.apache.flex.swf</code>,
and <code>org.apache.flex.swc</code> packages to read and write the ABC, SWF,
and SWC formats. However, these support libraries are independent of the compiler.
</p>

<p>
Falcon is a large body of code but it is organized around ten core concepts,
with a subpackage for each one:
</p>

<table border="1" cellspacing="0" cellpadding="3">
	<tr>
		<td>Workspace</td>
		<td><code>org.apache.flex.compiler.workspaces</code></td>
		<td>The root object of the compiler's data structures. Owns projects to be compiled.</td>
	</tr>
	<tr>
		<td>Project</td>
		<td><code>org.apache.flex.compiler.projects</code></td>
		<td>Owns compilation units to be compiled into one or more targets.</td>
	</tr>
	<tr>
		<td>Target</td>
		<td><code>org.apache.flex.compiler.targets</code></td>
		<td>Manages the compilation of a set of compilation units into a SWF or SWC.</td>
	</tr>
	<tr>
		<td>Compilation Unit</td>
		<td><code>org.apache.flex.compiler.units</code></td>
		<td>Manages the compilation of a single file.
		This typically involves building an AST and a file scope,
		performing semantic analysis to discover problems,
		and code-generating ABC for a <code>DoABC</code> SWF tag.</td>
	</tr>
	<tr>
		<td>AST</td>
		<td><code>org.apache.flex.compiler.tree</code></td>
		<td>Represents almost every detail of a source file as a tree of nodes.</td>
	</tr>
	<tr>
		<td>Scope</td>
		<td><code>org.apache.flex.compiler.scopes</code></td>
		<td>Organizes definitions -- named things declared in source code --
		in a hierarchy that reflects the block structure of the source file.
		Scopes and definitions comprise a symbol table that allow
		AST nodes representing identifiers in the source code
	    to be resolved to definitions (i.e., what they mean).
		A file scope contains the definitions defined with a single file.
		A project scope contains definitions that are visible between files.
	</tr>
	<tr>
		<td>Definition</td>
		<td><code>org.apache.flex.compiler.definitions</code></td>
		<td>Represents a named object in a scope,
		such as a class, interface, function, variable, etc.</td>
	</tr>
	<tr>
		<td>Semantic Analysis</td>
		<td><code>org.apache.flex.compiler.analysis</code></td>
		<td>Resolves identifier nodes in an AST to definitions in a scope
		(and quite a bit more.)</td>
	</tr>
	<tr>
		<td>Problem</td>
		<td><code>org.apache.flex.compiler.problems</code></td>
		<td>Represents an error or warning.
		Most problems are found during semantic analysis.</td>
	</tr>
	<tr>
		<td>Code Generation</td>
		<td><code>org.apache.flex.compiler.codegen</code></td>
		<td>Reduces an AST to ABC, using scopes and definitions
		to understand what each node means.
		The bulk of code generation is handled by a BURM (Bottom-Up Rewrite Machine).</td>
	</tr>
</table>

<p>
For more information, see the description of each of these packages.
</p>

<p>
The compiler code is organized into "external" and "internal" packages.
The internal packages are all within <code>org.apache.flex.compiler.internal</code>.
For example, <code>org.apache.flex.compiler.definitions</code> is an external package
that contains the definition interfaces for clients of the compiler to use;
<code>org.apache.flex.compiler.internal.definitions</code> is its internal counterpart
that contains the definition classes that the compiler itself creates.
Clients should never use code in an internal package; if it becomes necessary to do so,
the code should be moved to an external package.
The distinction can be important: in the case of definitions, for example,
the methods in the interfaces are guaranteed to be safe to call
from multiple threads, while the methods in the classes are not.
</p>

</body>
</html>
