Browse Source

+ Further syntax diagrams

michael 27 years ago
parent
commit
4df8c2e113
1 changed files with 640 additions and 250 deletions
  1. 640 250
      docs/ref.tex

+ 640 - 250
docs/ref.tex

@@ -33,7 +33,7 @@
 \input{syntax/diagram.tex}
 \input{syntax/diagram.tex}
 \latex{\usepackage{fpc}}
 \latex{\usepackage{fpc}}
 \latex{\usepackage{listings}\blankstringtrue%
 \latex{\usepackage{listings}\blankstringtrue%
-\selectlisting{fpc}\stringstyle{\ttfamily}\keywordstyle{\bfseries}
+\selectlisting{tp}\stringstyle{\ttfamily}\keywordstyle{\bfseries}
 \prelisting{\sffamily}}
 \prelisting{\sffamily}}
 \html{\input{fpc-html.tex}}
 \html{\input{fpc-html.tex}}
 \usepackage{fancyheadings}
 \usepackage{fancyheadings}
@@ -517,7 +517,7 @@ values \var{True} and \var{False}, as well as the \var{ByteBool},
 assigned to a \var{Boolean} type. Of course, any expression that resolves
 assigned to a \var{Boolean} type. Of course, any expression that resolves
 to a \var{boolean} value, can also be assigned to a boolean type.
 to a \var{boolean} value, can also be assigned to a boolean type.
 
 
-\begin{FPCltable}{lll}{Boolean types}{booleans}
+\begin{FPCltable}{lll}{Boolean types}{booleantypes}
 Name & Size & Ord(True) \\ hline
 Name & Size & Ord(True) \\ hline
 Boolean & 1 & 1 \\
 Boolean & 1 & 1 \\
 ByteBool & 1 & Any nonzero value \\
 ByteBool & 1 & Any nonzero value \\
@@ -1006,7 +1006,7 @@ Here is the type declaration for a file type:
 \input{syntax/typefil.syn}
 \input{syntax/typefil.syn}
 If no type identifier is given, then the file is an untyped file; it can be
 If no type identifier is given, then the file is an untyped file; it can be
 considered as equivalent to a file of bytes. Untyped files require special
 considered as equivalent to a file of bytes. Untyped files require special
-commands to act on them (see \seep{BlockRead}, \seep{BlockWrite}).
+commands to act on them (see \seep{Blockread}, \seep{Blockwrite}).
 
 
 The following declaration declares a file of records:
 The following declaration declares a file of records:
 \begin{listing}
 \begin{listing}
@@ -1360,7 +1360,7 @@ given.
 \section{Method invocation}
 \section{Method invocation}
 Methods are called just as normal procedures are called, only they have a 
 Methods are called just as normal procedures are called, only they have a 
 object instance identifier prepended to them
 object instance identifier prepended to them
-\seec{statements}.
+\seec{Statements}.
 
 
 To determine which method is called, it is necessary to know the type of
 To determine which method is called, it is necessary to know the type of
 method:
 method:
@@ -2038,9 +2038,9 @@ that contain integers or reals. There are 2 kinds of operators : Binary and
 unary arithmetic operators. 
 unary arithmetic operators. 
 
 
 Binary operators are listed in \seet{binaroperators}, unary operators are
 Binary operators are listed in \seet{binaroperators}, unary operators are
-listed in \seet{unaroperator}.
+listed in \seet{unaroperators}.
 
 
-\begin{FPCltable}{ll}{Binary arithmetic operators}{binaroperators.}
+\begin{FPCltable}{ll}{Binary arithmetic operators}{binaroperators}
 Operator & Operation \\ \hline
 Operator & Operation \\ \hline
 \var{+} & Addition\\    
 \var{+} & Addition\\    
 \var{-} & Subtraction\\
 \var{-} & Subtraction\\
@@ -2059,7 +2059,7 @@ then  the result is real.
 
 
 As an exception : division \var{/} results always in real values.
 As an exception : division \var{/} results always in real values.
 
 
-\begin{FPCltable}{ll}{Unary arithmetic operators}{unnaroperators.}
+\begin{FPCltable}{ll}{Unary arithmetic operators}{unaroperators}
 Operator & Operation \\ \hline
 Operator & Operation \\ \hline
 \var{+} & Sign identity\\    
 \var{+} & Sign identity\\    
 \var{-} & Sign inversion \\ \hline
 \var{-} & Sign inversion \\ \hline
@@ -2113,9 +2113,10 @@ Boolean operators can be considered logical operations on a type with 1 bit
 size. Therefore the \var{shl} and \var{shr} operations have little sense.
 size. Therefore the \var{shl} and \var{shr} operations have little sense.
 
 
 Boolean operators can only have boolean type operands, and the resulting
 Boolean operators can only have boolean type operands, and the resulting
-type is always boolean. The possible operators are listed in \seet{booleans}
+type is always boolean. The possible operators are listed in
+\seet{booleanoperators}
 
 
-\begin{FPCltable}{ll}{Boolean operators}{booleans}
+\begin{FPCltable}{ll}{Boolean operators}{booleanoperators}
 Operator & Operation \\ \hline
 Operator & Operation \\ \hline
 \var{not} & logical negation (unary) \\
 \var{not} & logical negation (unary) \\
 \var{and} & logical and \\
 \var{and} & logical and \\
@@ -2200,6 +2201,7 @@ ordinal type as the set type) is an element of the set which is the right
 operand, otherwise it returns \var{False}
 operand, otherwise it returns \var{False}
 
 
 \chapter{Statements}
 \chapter{Statements}
+\label{ch:Statements}
 
 
 The heart of each algorithm are the actions it takes. These actions are
 The heart of each algorithm are the actions it takes. These actions are
 contained in the statements of your program or unit. You can label your
 contained in the statements of your program or unit. You can label your
@@ -2324,7 +2326,7 @@ Conditional statements come in 2 flavours :
 
 
 Repetitive statements come in 3 flavours:
 Repetitive statements come in 3 flavours:
 
 
-\input{syntax/repetitive}
+\input{syntax/repetiti.syn}
 
 
 The following sections deal with each of these statements.
 The following sections deal with each of these statements.
 
 
@@ -2462,7 +2464,7 @@ else
    stat2
    stat2
 \end{listing}
 \end{listing}
 If it is this latter construct you want, you must explicitly put the
 If it is this latter construct you want, you must explicitly put the
-\var{begin} and \ver{end} keywords. When in doubt, add them, they don't
+\var{begin} and \var{end} keywords. When in doubt, add them, they don't
 hurt.
 hurt.
 
 
 The following is a valid statement:
 The following is a valid statement:
@@ -2475,61 +2477,120 @@ else
 
 
 \subsection{The \var{For..to/downto..do} statement}
 \subsection{The \var{For..to/downto..do} statement}
 
 
-\fpc supports the \var{For} loop construction. The prototype syntax is as
-follows:
+\fpc supports the \var{For} loop construction. A for loop is used in case
+one wants to calculated something a fixed number of times. 
+The prototype syntax is as follows:
 
 
 \input{syntax/for.syn}
 \input{syntax/for.syn}
 
 
-\var{Statement} can be a compound statement. In the first case, if
-\var{Lowerbound} is larger than \var{Upperbound} then \var{Statement} will
-never be executed. \var{Counter} must be an ordinal type, no other types can
-be used as counters in a loop.
+\var{Statement} can be a compound statement. 
+When this statement is encountered, the control variable is initialized with
+the initial value, and is compared with the final value.
+What happens next depends on whether \var{to} or \var{downto} is used:
+\begin{enumerate}
+\item In the case \var{To} is used, if the initial value larger than the final 
+value then \var{Statement} will never be executed. 
+\item In the case \var{DownTo} is used, if the initial value larger than the final 
+value then \var{Statement} will never be executed. 
+\end{enumerate}
+After this check, the statement after \var{Do} is executed. After the
+execution of the statement, the control variable is increased or decreased
+with 1, depending on whether \var{To} or \var{Downto} is used.
+
+The control variable must be an ordinal type, no other 
+types can be used as counters in a loop.
 
 
 {\em Remark:} Contrary to ANSI pascal specifications, \fpc first initializes
 {\em Remark:} Contrary to ANSI pascal specifications, \fpc first initializes
 the counter variable, and only then calculates the upper bound.
 the counter variable, and only then calculates the upper bound.
 
 
-
-
-\subsection{The \var{Repeat..until} statement}
-The prototype of the \var{Repeat..until} statement is
+The following are valid loops:
 \begin{listing}
 \begin{listing}
-Repeat
-  Statement1;
-  Statement2;
-Until Expression;
+For Day:=Monday to Friday do Work;
+For I:=100 downto 1 do
+  Writeln ('Counting down : ',i);
+For I:=1 to 7*dwarfs do KissDwarf(i); 
 \end{listing}
 \end{listing}
-This will execute \var{Statement1} etc. until \var{Expression} evaluates to
-\var{True}. Since \var{Expression} is evaluated {\em after} the execution of the
+
+\subsection{The \var{Repeat..until} statement}
+
+The \var{repeat} statement is used to execute a statement until a certain
+condition is reached. The statement will be executed at least once.
+The prototype syntax of the \var{Repeat..until} statement is
+
+\input{syntax/repeat.syn}
+
+This will execute the statements between \var{repeat} and {until} up to
+the moment when \var{Expression} evaluates to \var{True}. 
+Since the \var{expression} is evaluated {\em after} the execution of the
 statements, they are executed at least once.
 statements, they are executed at least once.
 
 
-Be aware of the fact that the boolean expressions \var{Expression1} and
-\var{Expression2} will be short-cut evaluated. (Meaning that the evaluation
-will be stopped at the point where the outcome is known with certainty)
+Be aware of the fact that the boolean expression \var{Expression} will be 
+short-cut evaluated. (Meaning that the evaluation will be stopped at the 
+point where the outcome is known with certainty)
 
 
-\subsection{The \var{While..do} statement}
-The prototype of the \var{While..do} statement is
+The following are valid \var{repeat} statements
 \begin{listing}
 \begin{listing}
-While Expression Do
-  Statement;
+repeat
+  Writeln ('I =',i);
+  I:=I+2;
+until I>100;
+
+repeat
+ X:=X/2
+until x<10e-3
 \end{listing}
 \end{listing}
+
+\subsection{The \var{While..do} statement}
+
+A \var{while} statement is used to execute a statement as long as a certain
+condition holds. This may imply that the statement is never executed.  
+The prototype syntax of the \var{While..do} statement is
+
+\input{syntax/while.syn}
+
 This will execute \var{Statement} as long as \var{Expression} evaluates to
 This will execute \var{Statement} as long as \var{Expression} evaluates to
 \var{True}. Since \var{Expression} is evaluated {\em before} the execution
 \var{True}. Since \var{Expression} is evaluated {\em before} the execution
 of \var{Statement}, it is possible that \var{Statement} isn't executed at
 of \var{Statement}, it is possible that \var{Statement} isn't executed at
-all.
+all. \var{Statement} can be a compound statement.
+
+Be aware of the fact that the boolean expression \var{Expression} will be 
+short-cut evaluated. (Meaning that the evaluation will be stopped at the 
+point where the outcome is known with certainty)
 
 
-\var{Statement} can be a compound statement.
+The following are valid \var{while} statements:
+\begin{listing}
+I:=I+2;
+while i<=100 do
+  begin
+  Writeln ('I =',i);
+  I:=I+2;
+  end;
 
 
-Be aware of the fact that the boolean expressions \var{Expression1} and
-\var{Expression2} will be short-cut evaluated. (Meaning that the evaluation
-will be stopped at the point where the outcome is known with certainty)
+X:=X/2;
+while x>=10e-3 do
+  X:=X/2;
+\end{listing}
+They correspond to the example loops for the \var{repeat} statements.
 
 
 \subsection{The \var{With} statement}
 \subsection{The \var{With} statement}
+\label{se:With}
 
 
-The with statement serves to access the elements of a record\footnote{
+The \var{with} statement serves to access the elements of a record\footnote{
 The \var{with} statement does not work correctly when used with 
 The \var{with} statement does not work correctly when used with 
 objects or classes until version 0.99.6}
 objects or classes until version 0.99.6}
-, without
-having to specify the name of the record. Given the declaration:
+or object or class, without having to specify the name of the each time. 
+
+The syntax for a \var{with} statement is
+
+\input{syntax/with.syn}
+
+The variable reference must be a variable of a record, object or class type.
+In the \var{with} statement, any variable reference, or method reference is
+checked to see if it is a field or method of the record or object or class.
+If so, then that field is accessed, or that method is called.
+
+
+Given the declaration:
 \begin{listing}
 \begin{listing}
 Type Passenger = Record
 Type Passenger = Record
        Name : String[30];
        Name : String[30];
@@ -2552,175 +2613,80 @@ With TheCustomer do
   end;
   end;
 \end{listing}
 \end{listing}
 
 
-\subsection{Compound statements}
-Compound statements are a group of statements, separated by semicolons,
-that are surrounded by the keywords \var{Begin} and \var{End}. The
-Last statement doesn't need to be followed by a semicolon, although it is
-allowed.
-
-\subsection{Exceptions}
-
-As of version 0.99.7, \fpc supports exceptions. Exceptions provide a
-convenient way to program error and error-recovery mechanisms, and are
-closely related to classes. 
-
-Exception support is based on 3 constructs:
-\begin{description}
-\item [Raise\ ] statements. To raise an exeption. This is usually done to signal an
-error condition.
-\item [Try ... Except\ ] blocks. These block serve to catch exceptions
-raised within the scope of the block, and to provide exception-recovery 
-code.
-\item [Try ... Finally\ ] blocks. These block serve to force code to be
-executed irrespective of an exception occurrence or not. They generally
-serve to clean up memory or close files in case an exception occurs. 
-code.
-\end{description}
-
-The \var{raise} statement is as follows:
-\begin{listing}
-  Raise [ExceptionInstance [at Address]];
-\end{listing}
-This statement will raise an exception. If specified, \var{ExceptionInstance} 
-must be an initialized instance of a class, which is the raise type. If
-specified, \var{Address} must be an expression that returns an address.
-
-If \var{ExceptionInstance} is omitted, then the Current exception is
-re-raised. This construct can only be used in an exception handling
-block.
-
-As an example: The following division checks whether the denominator is
-zero, and if so, raises an exception of type \var{EDivException}
+The statement
 \begin{listing}
 \begin{listing}
-Type EDivException = Class(Exception);
-
-Function DoDiv (X,Y : Longint) : Integer;
-
-begin
-  If Y=0 then 
-    Raise EDivException.Create ('Division by Zero would occur');
-  Result:=X Div Y;
-end;
+With A,B,C,D do Statement;
 \end{listing}
 \end{listing}
-The class \var{Exception} is defined in the \file{Sysutils} unit of the rtl.
-
-An exception handling block is of the following form :
+is equivalent to
 \begin{listing}
 \begin{listing}
-  Try
-    ...Statement List...
-  Except
-    [On [E:] ExceptionClass do CompoundStatement;] 
-    [ Default exception handler]
-  end;
+With A do
+ With B do
+  With C do
+   With D do Statement;
 \end{listing}
 \end{listing}
-If an exception occurs during the execution of the \var{statement list}, the
-program flow fill be transferred to the except block. There, the type of the
-exception is checked, and if there is a \var{On ExcType} statement where
-\var{ExcType} matches the exception object type, or is a parent type of
-the exception object type, then the statements follwing the corresponding 
-\var{Do} will be executed. The first matching type is used. After the
-\var{Do} block was executed, the program continues after the \var{End}
-statement.
-
-The identifier \var{E} is optional, and declares an exception object. It
-can be used to manipulate the exception object in the exception handling 
-code. The scope of this declaration is the statement block foillowing the
-\var{Do} keyword.
-
-If none of the \var{On} handlers matches the exception object type, then the
-\var{Default exception handler} is executed. If no such default handler is 
-found, then the exception is automatically re-raised. This process allows
-to nest \var{try...except} blocks.
+This also is a clear example of the fact that the variables are tried {\em last
+to first}, i.e., when the compiler encounters a variable reference, it will
+first check if it is a field or method of the last variable. If not, then it
+will check the last-but-one, and so on.  
 
 
-As an example, given the previous declaration of the \var{DoDiv} function,
-consider the following
+The following example shows this;
 \begin{listing}
 \begin{listing}
-Try
-  Z:=DoDiv (X,Y);
-Except
-  On EDivException do Z:=0;
-end;
-\end{listing}
-If \var{Y} happens to be zero, then the DoDiv function code will raise an
-exception. When this happens, program flow is transferred to the except
-statement, where the Exception handler will set the value of \var{Z} to
-zero. If no exception is raised, then program flow continues past the last
-\var{end} statement.
-
-To allow error recovery, the \var{Try ... Finally} block is supported.
-A \var{Try...Finally} block ensures that the statements following the
-\var{Finally} keyword are guaranteed to be executed, even if an exception
-occurs.
+Program testw;
 
 
-A \var{Try..Finally} block has the following form:
+Type AR = record
+      X,Y : Longint;
+     end;
+     
+Var S,T : Ar;
 
 
-\begin{listing}
-  Try
-    ...Statement List...
-  Finally
-    [ Finally Statements ]
-  end;
+begin
+  S.X:=1;S.Y:=1;
+  T.X:=2;T.Y:=2;
+  With S,T do 
+    writeln (X,' ',Y);
+end.     
 \end{listing}
 \end{listing}
-If no exception occurs inside the \var{Statement List}, then the program
-runs as if the \var{Try}, \var{Finally} and \var{End} keywords were not
-present.
-
-If, however, an exception occurs, the program flow is immediatly
-transferred to the first statement of the \var{Finally statements}. 
-All statements of the \var{Finally Statements} will be executed, and then
-the exception will be automatically re-raised. Any statements between the
-place where the exception was raised and the first statement of the
-\var{Finally Statements} are skipped.
+The output of this program is
+\begin{verbatim}
+2 2
+\end{verbatim}
+Showing thus that the \var{X,Y} in the \var{writeln} statement match the 
+\var{T} record variable.
 
 
-As an example consider the following routine:
+\subsection{Exception Statements}
 
 
-\begin{listing}
-Procedure Doit (Name : string);
+As of version 0.99.7, \fpc supports exceptions. Exceptions provide a
+convenient way to program error and error-recovery mechanisms, and are
+closely related to classes. 
 
 
-Var F : Text;
+Exception support is explained in \seec{Exceptions}
 
 
-begin
-  Try
-    Assign (F,Name);
-    Rewrite (name);
+\chapter{Using functions and procedures}
 
 
-    ... File handling ...
+\fpc supports the use of functions and procedures, but with some extras:
+Function overloading is supported, as well as \var{Const} parameters and
+open arrays.
 
 
-  Finally
-    Close(F);
-  end;  
-\end{listing}
-If during the execution of the file handling an excption occurs, then
-program flow will continue at the \var{close(F)} statement, skipping any
-file operations that might follow between the place where the exception
-was raised, and the \var{Close} statement.
+{\em remark:} In many of the subsequent paragraphs the word \var{procedure} 
+and \var{function} will be used interchangeably. The statements made are
+valid for both, except when indicated otherwise.
 
 
-If no exception occurred, all file operations will be executed, and the file
-will be closed at the end.
+\section{Procedure declaration}
 
 
-It is possible to nest \var{Try...Except} blocks with \var{Try...Finally}
-blocks. Program flow will be done according to a \var{lifo} (last in, first
-out) principle: The code of the last encountered \var{Try...Except} or
- \var{Try...Finally} block will be executed first. If the exception is not
-caught, or it was a finally statement, program flow will we transferred to
-the last but-one block, {\em ad infinitum}.
+A procedure declaration defines an identifier and associates it with a
+block of code. The procedure can then be called with a procedure statement.
 
 
-If an exception occurs, and there is no exception handler present, then a
-runerror 217 will be generated. If you use the \file{sysutils} unit, a default
-handler is installed which ioll show the exception object message, and the
-address where the exception occurred, after which the program will exit with
-a \var{Halt} instruction.
+\input{syntax/procedur.syn}
 
 
-\section{Using functions and procedures}
-\fpc supports the use of functions and procedures, but with some extras:
-Function overloading is supported, as well as \var{Const} parameters and
-open arrays.
+\section{Function declaration}
+A function declaration defines an identifier and associates it with a
+block of code. The block of code will return a result.  
+The function can then be called inside an expression, or with a procedure 
+statement. 
 
 
-{\em remark:} In the subsequent paragraph the word \var{procedure} and
-\var{function} will be used interchangeably. The statements made are
-valid for both.
+\input{syntax/function.syn}
 
 
-\subsection{Function overloading}
+\section{Function overloading}
 Function overloading simply means that you can define the same function more
 Function overloading simply means that you can define the same function more
 than once, but each time with a different set of arguments.
 than once, but each time with a different set of arguments.
 
 
@@ -2744,7 +2710,7 @@ specified parameter list. If the compiler finds such a function, a call is
 inserted to that function. If no such function is found, a compiler error is
 inserted to that function. If no such function is found, a compiler error is
 generated.
 generated.
 
 
-\subsection{\var{Const} parameters}
+\section{\var{Const} parameters}
 In addition to \var{var} parameters and normal parameters (call by value,
 In addition to \var{var} parameters and normal parameters (call by value,
 call by reference), \fpc also supports \var{Const} parameters. You can
 call by reference), \fpc also supports \var{Const} parameters. You can
 specify a \var{Const} parameter as follows:
 specify a \var{Const} parameter as follows:
@@ -2758,7 +2724,7 @@ but you are not allowed to assign to it, this will result in a compiler error.
 The main use for this is reducing the stack size, hence improving
 The main use for this is reducing the stack size, hence improving
 performance.
 performance.
 
 
-\subsection{Open array parameters}
+\section{Open array parameters}
 \fpc supports the passing of open arrays, i.e. You can declare a procedure
 \fpc supports the passing of open arrays, i.e. You can declare a procedure
 with an array of unspecified length as a parameter, as in Delphi.
 with an array of unspecified length as a parameter, as in Delphi.
 
 
@@ -2775,66 +2741,15 @@ In a function or procedure, you can pass open arrays only to functions which
 are also declared with open arrays as parameters, {\em not} to functions or
 are also declared with open arrays as parameters, {\em not} to functions or
 procedures which accept arrays of fixed length.
 procedures which accept arrays of fixed length.
 
 
-\section{Using assembler in your code}
-
-\fpc supports the use of assembler in your code, but not inline
-assembler macros.  To have more information on the processor
-specific assembler syntax and its limitations, see the \progref.
-
-\subsection{ Assembler statements }
-
-The following is an example of assembler inclusion in your code.
-\begin{listing}
- ...
- Statements;
- ...
- Asm
-   your asm code here
-   ...
- end;
- ...
- Statements;
-\end{listing}
-
-The assembler instructions between the \var{Asm} and \var{end} keywords will
-be inserted in the assembler generated by the compiler.
-
-You can still use conditionals in your assembler, the compiler will
-recognise it, and treat it as any other conditionals.
-
-\emph{ Remark: } Before version 0.99.1, \fpc did not support
-reference to variables by their names in the assembler parts of your code.
-
-\subsection{ Assembler procedures and functions }
-
-Assembler procedures and functions are declared using the
-\var{Assembler} directive. The \var{Assembler} keyword is supported
-as of version 0.9.7. This permits the code generator to make a number
-of code generation optimizations.
-
-The code generator does not generate any stack frame (entry and exit
-code for the routine) if it contains no local variables and no
-parameters. In the case of functions, ordinal values must be returned
-in the accumulator. In the case of floating point values, these depend
-on the target processor and emulation options.
-
-\emph{ Remark: } Before version 0.99.1, \fpc did not support
-reference to variables by their names in the assembler parts of your code.
-
-\emph{ Remark: } From version 0.99.1 to 0.99.5 (\emph{excluding}
-FPC 0.99.5a), the \var{Assembler} directive did not have the
-same effect as in Turbo Pascal, so beware! The stack frame would be
-omitted if there were no local variables, in this case if the assembly
-routine had any parameters, they would be referenced directly via the stack
-pointer. This was \emph{ NOT} like Turbo Pascal where the stack frame is only
-omitted if there are no parameters \emph{ and } no local variables. As
-stated earlier, starting from version 0.99.5a, \fpc now has the same
-behaviour as Turbo Pascal.
-
 \section{Modifiers}
 \section{Modifiers}
+A function or procedure declaration can contain modifiers. Here we list the
+various possibilities:
+\input{syntax/modifiers.syn}
+
 \fpc doesn't support all Turbo Pascal modifiers, but
 \fpc doesn't support all Turbo Pascal modifiers, but
 does support a number of additional modifiers. They are used mainly for assembler and
 does support a number of additional modifiers. They are used mainly for assembler and
-reference to C object files.
+reference to C object files. More on the use of modifiers can be found in
+\progref.
 
 
 \subsection{Public}
 \subsection{Public}
 The \var{Public} keyword is used to declare a function globally in a unit.
 The \var{Public} keyword is used to declare a function globally in a unit.
@@ -3065,7 +2980,7 @@ end; ['register1','register2',...,'registern'];
 Where is register one of any of the available processor registers.
 Where is register one of any of the available processor registers.
 
 
 
 
-\subsection{Unsupported Turbo Pascal modifiers}
+\section{Unsupported Turbo Pascal modifiers}
 The modifiers that exist in Turbo pascal, but aren't supported by \fpc, are
 The modifiers that exist in Turbo pascal, but aren't supported by \fpc, are
 listed in \seet{Modifs}.
 listed in \seet{Modifs}.
 \begin{FPCltable}{lr}{Unsupported modifiers}{Modifs}
 \begin{FPCltable}{lr}{Unsupported modifiers}{Modifs}
@@ -3075,6 +2990,481 @@ Far & \fpc is a 32-bit compiler. \\
 %External & Replaced by \var{C} modifier. \\ \hline
 %External & Replaced by \var{C} modifier. \\ \hline
 \end{FPCltable}
 \end{FPCltable}
 
 
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Programs, Units, Blocks
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Programs, units, blocks}
+
+A Pascal program consists of modules called \var{units}. A unit can be used
+to group pieces of code together, or to give someone code without giving
+the sources. 
+
+Both programs and units consist of code blocks, which are mixtures of
+statements, procedures, and variable or type declarations.
+
+\section{Programs}
+A pascal program consists of the program header, followed possibly by a 
+'uses' clause, and a block.
+
+\input{syntax/program.syn}
+
+The program header is provided for backwards compatibility, nd is oignored
+by the compiler.
+
+The uses clause serves to identify all units that are needed by the program.
+The system unit doesn't have to be in this list, since it is always loaded
+by the compiler.
+
+The order in which the units appear is significant, it determines in
+which order they are initialized. Units are initialized in the same order
+as they appear in the uses clause. Identifiers are searched in the opposite
+order, i.e. when the compiler searches for an identifier, then it looks
+first in the last unit in the uses clause, then the last but one, and so on.
+
+This is important in case two units declare different types with the same 
+identifier.
+
+When the compiler looks for unit files, it adds the extension \file{.ppu}
+(\file{.ppw} for \windowsnt) to the name of the unit. On \linux, unit names
+are converted to all lowercase when looking for a unit.
+
+If a unit name is longer than 8 characters, the compiler will first look for
+a unit name with this length, and then it will truncate the name to 8
+characters and look for it again.
+
+\section{Units}
+
+A unit contains a set of declarations, procedures and functions that can be
+used by a program or another unit.
+
+The syntax for a unit is as follows:
+
+\input{syntax/unit.syn}
+
+The interface part declares all identifiers that must be exported from the
+unit. This can be constant, type or variable identifiers, and also procedure
+or function identifier declarations. Declarations inside the
+implementationpart are {\em not} accessible outside the unit. The
+implementation must contain a function declaration for each function or
+procedure that is declared in the interface part. If a function is declared
+in the interface part, but no declaration of that function is present in the 
+implementation section is present, then the compiler will give an error.
+
+When a program uses a unit (say \file{unitA}) and this units uses a second
+unit, say \file{unitB}, then the program depends indirectly also on
+\var{unitB}. This means that the compiler must have access to \file{unitB} when
+trying to compile the program. If the unit is not present at compile time,
+an error occurs.
+
+Note that the identifiers from a unit on which a program depends indirectly,
+are not accessible to the program. To have access to the identifiers of a
+unit, you must put that unit in the uses clause of the program or unit where
+you want to yuse the identifier.
+
+Units can be mutually dependent, that is, they can reference each other in
+their uses clauses. This is allowed, on the condition that at least one of
+the references is in the implementation section of the unit. This also holds
+for indirect mutually dependent units. 
+
+If it is possible to start from one interface uses clause of a unit, and to return
+there via uses clauses of interfaces only, then there is circular unit
+dependence, and the compiler will generate an error.
+
+As and example : the following is not allowed:
+\begin{listing}
+Unit UnitA;
+
+interface
+
+Uses UnitB;
+
+implementation
+end.
+
+Unit UnitB
+
+Uses UnitA;
+
+implementation 
+end.
+\end{listing}
+But this is allowed :
+\begin{listing}
+Unit UnitA;
+
+interface
+
+Uses UnitB;
+
+implementation
+end.
+
+Unit UnitB
+
+implementation 
+
+Uses UnitA;
+
+end.
+\end{listing}
+Because \file{UnitB} uses \file{UnitA} only in it's implentation section.
+
+In general, it is a bad idea to have circular unit dependencies, even if it is
+only in implementation sections.
+
+\section{Blocks}
+
+Units and programs are made of blocks. A block is made of declarations of 
+labels, constants, types variables and functions or procedures. Blocks can
+be nested in certain ways, i.e., a procedure or function declaration can
+have blocks in themselves.
+
+A block looks like the following:
+
+\input{syntax/block.syn}
+
+Labels that can be used to identify statements in a block are declared in
+the label declaration part of that block. Each label can only identify one
+statement.
+
+Constants that are to be used only in one block should be declared in that
+block's constant declaration part.
+
+Variables that are to be used only in one block should be declared in that
+block's constant declaration part.
+
+Types that are to be used only in one block should be declared in that
+block's constant declaration part.
+
+Lastly, functions and procedures that will be used in that block can be
+declared in the procedure/function declaration part.
+
+After the different declaration parts comes the statement part. This
+contains any actions that the block should execute.
+All identifiers declared before the statement part can be used in that 
+statement part.
+
+\section{Scope}
+
+Identifiers are valid from the point of their declaration until the end of
+the block in which the declaration occurred. The range where the identifier
+is known is the {\em scope} of the identifier. The exact scope of an
+identifier depends on the way it was defined.
+
+\subsection{Block scope}
+The {\em scope} of a variable declared in the declaration part of a block,
+is valid from the point of declaration until the end of the block.
+
+If a block contains a second block, in which the identfier is
+redeclared, then inside this block, the second declaration will be valid.
+Upon leaving the inner block, the first declaration is valid again.
+
+Consider the following example:
+\begin{listing}
+Program Demo;
+
+Var X : Real;
+{ X is real variable }
+Procedure NewDeclaration
+
+Var X : Integer;  { Redeclare X as integer}
+
+begin
+ // X:=1.234; {would give an error when trying to compile}
+ X:=10; { Correct assigment}
+end;
+
+{ From here on, X is Real again}
+begin
+ X:=2.468;
+end.
+\end{listing}
+In this example, inside the procedure, X denotes an integer variable.
+It has it's own storage space, independent of the variable \var{X} outside
+the procedure.
+
+\subsection{Record scope}
+
+The field identifiers inside a record definition are valid in the following
+places:
+\begin{enumerate}
+\item to the end of the record definition.
+\item field designators of a variable of the given record type.
+\item identifiers inside a \var{With} statement that operates on a variable
+of the given record type.
+\end{enumerate}
+
+\subsection{Class scope}
+A component identifier is valid in the following places:
+\begin{enumerate}
+\item From the point of declaration to the end of the class definition.
+\item In all descendent types of this class.
+\item In all method declaration blocks of this class and descendent classes.
+\item In a with statement that operators on a variable of the given class's
+definition.
+\end{enumerate}
+
+Note that method designators are also considered identifiers.
+
+\subsection{Unit scope}
+
+All identifiers in the interface part of a unit are valid from the point of
+declaration, until the end of the unit. Furthermore, the identifiers are
+known in programs or units that have the unit in their uses clause.
+Identifiers from indirectly dependent units are {\em not} available.
+
+Identifiers declared in the implementation part of a unit are valid from the
+point of declaration to the end of the unit.
+
+The system unit is automatically used in all units and programs. 
+It's identifiers are therefore always known, in each program or unit 
+you make.
+
+The rules of unit scope implie that you can redefine an identifier of a
+unit. To have access to an identifier of another unit that was redeclared in 
+the current unit, precede it with that other units name, as in the following
+example:
+
+\begin{listing}
+unit unitA;
+
+interface
+Type
+  MyType = Real;
+
+implementation
+end.
+
+Program prog;
+
+Uses UnitA;
+ 
+{ Redeclaration of MyType}
+Type MyType = Integer;
+
+Var A : Mytype;      { Will be Integer }
+    B : UnitA.MyType { Will be real }
+
+begin
+end.
+\end{listing}
+This is especially useful if you redeclare the system unit's identifiers.
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Exceptions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\chapter{Exceptions}
+\label{ch:Exceptions}
+
+As of version 0.99.7, \fpc supports exceptions. Exceptions provide a
+convenient way to program error and error-recovery mechanisms, and are
+closely related to classes. 
+
+Exception support is based on 3 constructs:
+\begin{description}
+\item [Raise\ ] statements. To raise an exeption. This is usually done to signal an
+error condition.
+\item [Try ... Except\ ] blocks. These block serve to catch exceptions
+raised within the scope of the block, and to provide exception-recovery 
+code.
+\item [Try ... Finally\ ] blocks. These block serve to force code to be
+executed irrespective of an exception occurrence or not. They generally
+serve to clean up memory or close files in case an exception occurs. 
+code.
+\end{description}
+
+The \var{raise} statement is as follows:
+\begin{listing}
+  Raise [ExceptionInstance [at Address]];
+\end{listing}
+This statement will raise an exception. If specified, \var{ExceptionInstance} 
+must be an initialized instance of a class, which is the raise type. If
+specified, \var{Address} must be an expression that returns an address.
+
+If \var{ExceptionInstance} is omitted, then the Current exception is
+re-raised. This construct can only be used in an exception handling
+block.
+
+As an example: The following division checks whether the denominator is
+zero, and if so, raises an exception of type \var{EDivException}
+\begin{listing}
+Type EDivException = Class(Exception);
+
+Function DoDiv (X,Y : Longint) : Integer;
+
+begin
+  If Y=0 then 
+    Raise EDivException.Create ('Division by Zero would occur');
+  Result:=X Div Y;
+end;
+\end{listing}
+The class \var{Exception} is defined in the \file{Sysutils} unit of the rtl.
+
+An exception handling block is of the following form :
+\begin{listing}
+  Try
+    ...Statement List...
+  Except
+    [On [E:] ExceptionClass do CompoundStatement;] 
+    [ Default exception handler]
+  end;
+\end{listing}
+If an exception occurs during the execution of the \var{statement list}, the
+program flow fill be transferred to the except block. There, the type of the
+exception is checked, and if there is a \var{On ExcType} statement where
+\var{ExcType} matches the exception object type, or is a parent type of
+the exception object type, then the statements follwing the corresponding 
+\var{Do} will be executed. The first matching type is used. After the
+\var{Do} block was executed, the program continues after the \var{End}
+statement.
+
+The identifier \var{E} is optional, and declares an exception object. It
+can be used to manipulate the exception object in the exception handling 
+code. The scope of this declaration is the statement block foillowing the
+\var{Do} keyword.
+
+If none of the \var{On} handlers matches the exception object type, then the
+\var{Default exception handler} is executed. If no such default handler is 
+found, then the exception is automatically re-raised. This process allows
+to nest \var{try...except} blocks.
+
+As an example, given the previous declaration of the \var{DoDiv} function,
+consider the following
+\begin{listing}
+Try
+  Z:=DoDiv (X,Y);
+Except
+  On EDivException do Z:=0;
+end;
+\end{listing}
+If \var{Y} happens to be zero, then the DoDiv function code will raise an
+exception. When this happens, program flow is transferred to the except
+statement, where the Exception handler will set the value of \var{Z} to
+zero. If no exception is raised, then program flow continues past the last
+\var{end} statement.
+
+To allow error recovery, the \var{Try ... Finally} block is supported.
+A \var{Try...Finally} block ensures that the statements following the
+\var{Finally} keyword are guaranteed to be executed, even if an exception
+occurs.
+
+A \var{Try..Finally} block has the following form:
+
+\begin{listing}
+  Try
+    ...Statement List...
+  Finally
+    [ Finally Statements ]
+  end;
+\end{listing}
+If no exception occurs inside the \var{Statement List}, then the program
+runs as if the \var{Try}, \var{Finally} and \var{End} keywords were not
+present.
+
+If, however, an exception occurs, the program flow is immediatly
+transferred to the first statement of the \var{Finally statements}. 
+All statements of the \var{Finally Statements} will be executed, and then
+the exception will be automatically re-raised. Any statements between the
+place where the exception was raised and the first statement of the
+\var{Finally Statements} are skipped.
+
+As an example consider the following routine:
+
+\begin{listing}
+Procedure Doit (Name : string);
+
+Var F : Text;
+
+begin
+  Try
+    Assign (F,Name);
+    Rewrite (name);
+
+    ... File handling ...
+
+  Finally
+    Close(F);
+  end;  
+\end{listing}
+If during the execution of the file handling an excption occurs, then
+program flow will continue at the \var{close(F)} statement, skipping any
+file operations that might follow between the place where the exception
+was raised, and the \var{Close} statement.
+
+If no exception occurred, all file operations will be executed, and the file
+will be closed at the end.
+
+It is possible to nest \var{Try...Except} blocks with \var{Try...Finally}
+blocks. Program flow will be done according to a \var{lifo} (last in, first
+out) principle: The code of the last encountered \var{Try...Except} or
+ \var{Try...Finally} block will be executed first. If the exception is not
+caught, or it was a finally statement, program flow will we transferred to
+the last but-one block, {\em ad infinitum}.
+
+If an exception occurs, and there is no exception handler present, then a
+runerror 217 will be generated. If you use the \file{sysutils} unit, a default
+handler is installed which ioll show the exception object message, and the
+address where the exception occurred, after which the program will exit with
+a \var{Halt} instruction.
+
+\chapter{Using assembler}
+
+\fpc supports the use of assembler in your code, but not inline
+assembler macros.  To have more information on the processor
+specific assembler syntax and its limitations, see the \progref.
+
+\section{Assembler statements }
+
+The following is an example of assembler inclusion in your code.
+\begin{listing}
+ ...
+ Statements;
+ ...
+ Asm
+   your asm code here
+   ...
+ end;
+ ...
+ Statements;
+\end{listing}
+
+The assembler instructions between the \var{Asm} and \var{end} keywords will
+be inserted in the assembler generated by the compiler.
+
+You can still use conditionals in your assembler, the compiler will
+recognise it, and treat it as any other conditionals.
+
+\emph{ Remark: } Before version 0.99.1, \fpc did not support
+reference to variables by their names in the assembler parts of your code.
+
+\section{Assembler procedures and functions}
+
+Assembler procedures and functions are declared using the
+\var{Assembler} directive. The \var{Assembler} keyword is supported
+as of version 0.9.7. This permits the code generator to make a number
+of code generation optimizations.
+
+The code generator does not generate any stack frame (entry and exit
+code for the routine) if it contains no local variables and no
+parameters. In the case of functions, ordinal values must be returned
+in the accumulator. In the case of floating point values, these depend
+on the target processor and emulation options.
+
+\emph{ Remark: } Before version 0.99.1, \fpc did not support
+reference to variables by their names in the assembler parts of your code.
+
+\emph{ Remark: } From version 0.99.1 to 0.99.5 (\emph{excluding}
+FPC 0.99.5a), the \var{Assembler} directive did not have the
+same effect as in Turbo Pascal, so beware! The stack frame would be
+omitted if there were no local variables, in this case if the assembly
+routine had any parameters, they would be referenced directly via the stack
+pointer. This was \emph{ NOT} like Turbo Pascal where the stack frame is only
+omitted if there are no parameters \emph{ and } no local variables. As
+stated earlier, starting from version 0.99.5a, \fpc now has the same
+behaviour as Turbo Pascal.
+
+
 %
 %
 % System unit reference guide.
 % System unit reference guide.
 %
 %