+Rules for identifiers are the same as in Ada. Identifiers
+are case-insensitive. Strings are case sensitive, except where noted.
+Comments have the same form as in Ada.
+
+@noindent
+Syntax:
+
+@smallexample
+simple_name ::=
+ identifier
+
+name ::=
+ simple_name @{. simple_name@}
+@end smallexample
+
+@node Declarations
+@section Declarations
+
+@noindent
+Declarations introduce new entities that denote types, variables, attributes,
+and packages. Some declarations can only appear immediately within a project
+declaration. Others can appear within a project or within a package.
+
+Syntax:
+@smallexample
+declarative_item ::=
+ simple_declarative_item |
+ typed_string_declaration |
+ package_declaration
+
+simple_declarative_item ::=
+ variable_declaration |
+ typed_variable_declaration |
+ attribute_declaration |
+ case_construction |
+ empty_declaration
+@end smallexample
+
+@node Empty declarations
+@section Empty declarations
+
+@smallexample
+empty_declaration ::=
+ @b{null} ;
+@end smallexample
+
+An empty declaration is allowed anywhere a declaration is allowed.
+It has no effect.
+
+@node Typed string declarations
+@section Typed string declarations
+
+@noindent
+Typed strings are sequences of string literals. Typed strings are the only
+named types in project files. They are used in case constructions, where they
+provide support for conditional attribute definitions.
+
+Syntax:
+@smallexample
+typed_string_declaration ::=
+ @b{type} <typed_string_>_simple_name @b{is}
+ ( string_literal @{, string_literal@} );
+@end smallexample
+
+@noindent
+A typed string declaration can only appear immediately within a project
+declaration.
+
+All the string literals in a typed string declaration must be distinct.
+
+@node Variables
+@section Variables
+
+@noindent
+Variables denote values, and appear as constituents of expressions.
+
+@smallexample
+typed_variable_declaration ::=
+ <typed_variable_>simple_name : <typed_string_>name := string_expression ;
+
+variable_declaration ::=
+ <variable_>simple_name := expression;
+@end smallexample
+
+@noindent
+The elaboration of a variable declaration introduces the variable and
+assigns to it the value of the expression. The name of the variable is
+available after the assignment symbol.
+
+@noindent
+A typed_variable can only be declare once.
+
+@noindent
+a non-typed variable can be declared multiple times.
+
+@noindent
+Before the completion of its first declaration, the value of variable
+is the null string.
+
+@node Expressions
+@section Expressions
+
+@noindent
+An expression is a formula that defines a computation or retrieval of a value.
+In a project file the value of an expression is either a string or a list
+of strings. A string value in an expression is either a literal, the current
+value of a variable, an external value, an attribute reference, or a
+concatenation operation.
+
+Syntax:
+
+@smallexample
+expression ::=
+ term @{& term@}
+
+term ::=
+ string_literal |
+ string_list |
+ <variable_>name |
+ external_value |
+ attribute_reference
+
+string_literal ::=
+ (same as Ada)
+
+string_list ::=
+ ( <string_>expression @{ , <string_>expression @} )
+@end smallexample
+
+@subsection Concatenation
+@noindent
+The following concatenation functions are defined:
+
+@smallexample @c ada
+ function "&" (X : String; Y : String) return String;
+ function "&" (X : String_List; Y : String) return String_List;
+ function "&" (X : String_List; Y : String_List) return String_List;
+@end smallexample
+
+@node Attributes
+@section Attributes
+
+@noindent
+An attribute declaration defines a property of a project or package. This
+property can later be queried by means of an attribute reference.
+Attribute values are strings or string lists.
+
+Some attributes are associative arrays. These attributes are mappings whose
+domain is a set of strings. These attributes are declared one association
+at a time, by specifying a point in the domain and the corresponding image
+of the attribute. They may also be declared as a full associative array,
+getting the same associations as the corresponding attribute in an imported
+or extended project.
+
+Attributes that are not associative arrays are called simple attributes.
+
+Syntax:
+@smallexample
+attribute_declaration ::=
+ full_associative_array_declaration |
+ @b{for} attribute_designator @b{use} expression ;
+
+full_associative_array_declaration ::=
+ @b{for} <associative_array_attribute_>simple_name @b{use}
+ <project_>simple_name [ . <package_>simple_Name ] ' <attribute_>simple_name ;
+
+attribute_designator ::=
+ <simple_attribute_>simple_name |
+ <associative_array_attribute_>simple_name ( string_literal )
+@end smallexample
+
+@noindent
+Some attributes are project-specific, and can only appear immediately within
+a project declaration. Others are package-specific, and can only appear within
+the proper package.
+
+The expression in an attribute definition must be a string or a string_list.
+The string literal appearing in the attribute_designator of an associative
+array attribute is case-insensitive.
+
+@node Project Attributes
+@section Project Attributes
+
+@noindent
+The following attributes apply to a project. All of them are simple
+attributes.
+
+@table @code
+@item Object_Dir
+Expression must be a path name. The attribute defines the
+directory in which the object files created by the build are to be placed. If
+not specified, object files are placed in the project directory.
+
+@item Exec_Dir
+Expression must be a path name. The attribute defines the
+directory in which the executables created by the build are to be placed.
+If not specified, executables are placed in the object directory.
+
+@item Source_Dirs
+Expression must be a list of path names. The attribute
+defines the directories in which the source files for the project are to be
+found. If not specified, source files are found in the project directory.
+If a string in the list ends with "/**", then the directory that precedes
+"/**" and all of its subdirectories (recursively) are included in the list
+of source directories.
+
+@item Excluded_Source_Dirs
+Expression must be a list of strings. Each entry designates a directory that
+is not to be included in the list of source directories of the project.
+This is normally used when there are strings ending with "/**" in the value
+of attribute Source_Dirs.
+
+@item Source_Files
+Expression must be a list of file names. The attribute
+defines the individual files, in the project directory, which are to be used
+as sources for the project. File names are path_names that contain no directory
+information. If the project has no sources the attribute must be declared
+explicitly with an empty list.
+
+@item Excluded_Source_Files (Locally_Removed_Files)
+Expression must be a list of strings that are legal file names.
+Each file name must designate a source that would normally be a source file
+in the source directories of the project or, if the project file is an
+extending project file, inherited by the current project file. It cannot
+designate an immediate source that is not inherited. Each of the source files
+in the list are not considered to be sources of the project file: they are not
+inherited. Attribute Locally_Removed_Files is obsolescent, attribute
+Excluded_Source_Files is preferred.
+
+@item Source_List_File
+Expression must a single path name. The attribute
+defines a text file that contains a list of source file names to be used
+as sources for the project
+
+@item Library_Dir
+Expression must be a path name. The attribute defines the
+directory in which a library is to be built. The directory must exist, must
+be distinct from the project's object directory, and must be writable.
+
+@item Library_Name
+Expression must be a string that is a legal file name,
+without extension. The attribute defines a string that is used to generate
+the name of the library to be built by the project.
+
+@item Library_Kind
+Argument must be a string value that must be one of the
+following @code{"static"}, @code{"dynamic"} or @code{"relocatable"}. This
+string is case-insensitive. If this attribute is not specified, the library is
+a static library. Otherwise, the library may be dynamic or relocatable. This
+distinction is operating-system dependent.
+
+@item Library_Version
+Expression must be a string value whose interpretation
+is platform dependent. On UNIX, it is used only for dynamic/relocatable
+libraries as the internal name of the library (the @code{"soname"}). If the
+library file name (built from the @code{Library_Name}) is different from the
+@code{Library_Version}, then the library file will be a symbolic link to the
+actual file whose name will be @code{Library_Version}.
+
+@item Library_Interface
+Expression must be a string list. Each element of the string list
+must designate a unit of the project.
+If this attribute is present in a Library Project File, then the project
+file is a Stand-alone Library_Project_File.
+
+@item Library_Auto_Init
+Expression must be a single string "true" or "false", case-insensitive.
+If this attribute is present in a Stand-alone Library Project File,
+it indicates if initialization is automatic when the dynamic library
+is loaded.
+
+@item Library_Options
+Expression must be a string list. Indicates additional switches that
+are to be used when building a shared library.
+
+@item Library_GCC
+Expression must be a single string. Designates an alternative to "gcc"
+for building shared libraries.
+
+@item Library_Src_Dir
+Expression must be a path name. The attribute defines the
+directory in which the sources of the interfaces of a Stand-alone Library will
+be copied. The directory must exist, must be distinct from the project's
+object directory and source directories of all projects in the project tree,
+and must be writable.
+
+@item Library_Src_Dir
+Expression must be a path name. The attribute defines the
+directory in which the ALI files of a Library will
+be copied. The directory must exist, must be distinct from the project's
+object directory and source directories of all projects in the project tree,
+and must be writable.
+
+@item Library_Symbol_File
+Expression must be a single string. Its value is the single file name of a
+symbol file to be created when building a stand-alone library when the
+symbol policy is either "compliant", "controlled" or "restricted",
+on platforms that support symbol control, such as VMS. When symbol policy
+is "direct", then a file with this name must exist in the object directory.
+
+@item Library_Reference_Symbol_File
+Expression must be a single string. Its value is the path name of a
+reference symbol file that is read when the symbol policy is either
+"compliant" or "controlled", on platforms that support symbol control,
+such as VMS, when building a stand-alone library. The path may be an absolute
+path or a path relative to the project directory.
+
+@item Library_Symbol_Policy
+Expression must be a single string. Its case-insensitive value can only be
+"autonomous", "default", "compliant", "controlled", "restricted" or "direct".
+
+This attribute is not taken into account on all platforms. It controls the
+policy for exported symbols and, on some platforms (like VMS) that have the
+notions of major and minor IDs built in the library files, it controls
+the setting of these IDs.
+
+"autonomous" or "default": exported symbols are not controlled.
+
+"compliant": if attribute Library_Reference_Symbol_File is not defined, then
+it is equivalent to policy "autonomous". If there are exported symbols in
+the reference symbol file that are not in the object files of the interfaces,
+the major ID of the library is increased. If there are symbols in the
+object files of the interfaces that are not in the reference symbol file,
+these symbols are put at the end of the list in the newly created symbol file
+and the minor ID is increased.
+
+"controlled": the attribute Library_Reference_Symbol_File must be defined.
+The library will fail to build if the exported symbols in the object files of
+the interfaces do not match exactly the symbol in the symbol file.
+
+"restricted": The attribute Library_Symbol_File must be defined. The library
+will fail to build if there are symbols in the symbol file that are not in
+the exported symbols of the object files of the interfaces. Additional symbols
+in the object files are not added to the symbol file.
+
+"direct": The attribute Library_Symbol_File must be defined and must designate
+an existing file in the object directory. This symbol file is passed directly
+to the underlying linker without any symbol processing.
+
+@item Main
+Expression must be a list of strings that are legal file names.
+These file names designate existing compilation units in the source directory
+that are legal main subprograms.
+
+When a project file is elaborated, as part of the execution of a gnatmake
+command, one or several executables are built and placed in the Exec_Dir.
+If the gnatmake command does not include explicit file names, the executables
+that are built correspond to the files specified by this attribute.
+
+@item Externally_Built
+Expression must be a single string. Its value must be either "true" of "false",
+case-insensitive. The default is "false". When the value of this attribute is
+"true", no attempt is made to compile the sources or to build the library,
+when the project is a library project.
+
+@item Main_Language
+This is a simple attribute. Its value is a string that specifies the
+language of the main program.
+
+@item Languages
+Expression must be a string list. Each string designates
+a programming language that is known to GNAT. The strings are case-insensitive.