DEFINITION MODULE PPExpr;

	(********************************************************)
	(*							*)
	(*	   Expression handler for preprocessor		*)
	(*							*)
	(*  Programmer:		P. Moylan			*)
	(*  Last edited:	2 August 1994			*)
	(*  Status:		Working				*)
	(*							*)
	(********************************************************)

(************************************************************************)
(* This module evaluates expressions consisting of alphanumeric symbols	*)
(* connected by the operators:						*)
(*	|   logical OR		&   logical AND		~   logical NOT	*)
(*	=   string equality	<>  string inequality	()  parentheses	*)
(* An expression consisting of one operand and no operators is		*)
(* string-valued.  Any other expression has a Boolean result.  When a	*)
(* string operand is used with any of the logical operators (including	*)
(* parentheses) the string "T" is evaluated as TRUE, and anything else	*)
(* is evaluated as FALSE.  When a Boolean is stored as a string, TRUE	*)
(* is stored as "T" and FALSE is stored as "F".				*)
(*									*)
(* A string operand can consist of up to 32 characters, each of which	*)
(* is a letter or digit.  Leading digits are legal.  The case of a	*)
(* letter is significant.  When a value is assigned to a string operand	*)
(* via procedure DefineSymbol, that operand becomes a variable, and	*)
(* subsequent references to it will return the assigned value.  Any	*)
(* other alphanumeric string will be considered to be a string literal.	*)
(*									*)
(* An expression may not contain embedded spaces.  (This restriction	*)
(* is imposed because this module is used in an application where the	*)
(* space character is needed as an expression terminator.)		*)
(************************************************************************)

PROCEDURE DefineSymbol (VAR (*IN*) symbol: ARRAY OF CHAR;
					value: ARRAY OF CHAR);

    (* Stores "value" as the value of variable "symbol".  The variable	*)
    (* might or might not already exist in the symbol table.		*)

PROCEDURE DumpSymbolTable;

    (* Writes the current contents of the symbol table to the screen. *)

(************************************************************************)
(* In each of the following procedures, Place is updated on exit so	*)
(* that Line[Place] is the first non-alphanumeric character found.	*)
(************************************************************************)

PROCEDURE Id (VAR (*IN*) Buffer: ARRAY OF CHAR;
		VAR (*INOUT*) Place: CARDINAL;
		VAR (*OUT*) result: ARRAY OF CHAR);

    (* Picks up an alphanumeric string starting at Buffer[Place]. *)

PROCEDURE Expr (VAR (*IN*) Buffer: ARRAY OF CHAR;
		VAR (*INOUT*) Place: CARDINAL): BOOLEAN;

    (* Evaluates a Boolean expression starting at Buffer[Place]. *)

PROCEDURE StringExpr (VAR (*IN*) Buffer: ARRAY OF CHAR;
		VAR (*INOUT*) Place: CARDINAL;
		VAR (*OUT*) result: ARRAY OF CHAR);

    (* Evaluates a string-valued expression starting at Buffer[Place]. *)

END PPExpr.
