FLUID '(PromptString!* !*Break);

%   Error-print is called when the major loop returns a NIL. 
 
SYMBOLIC PROCEDURE ERROR!-PRINT; 
  <<PRIN2 "ERROR in grammar, current token is "; 
    PRIN2 !#TOK!#; PRIN2 " and stack is "; 
    PRIN2 !#STACK!#; TERPRI() >>; 
 
% The following errs out if its argument is NIL

SYMBOLIC PROCEDURE FAIL!-NOT U;
IF U then T
 else begin scalar Promptstring!*;
       PRIN2T "FAIL-NOT called in a concatenation";
       ERROR!-PRINT();
       PromptString!*:="Mini-Error>";
       U:=ContinuableERROR(997,"Failure scanning a concatenation",'(QUOTE T));
       IF U AND SCAN!-TERM() THEN RETURN T;
       return begin scalar !*Break;
           return Error(997, "Could not Recover from FAIL-NOT");
       end;
      end;

%   Invoke starts execution of a previously defined grammar. 

SYMBOLIC PROCEDURE INVOKE U; 
 BEGIN SCALAR X,PromptString!*;
    PromptString!*:=Concat(Id2String U,">");
    !#IDTYPE!# := 0;
    !#NUMTYPE!# := 2;
    !#STRTYPE!# := 1;
    FLAG (GET (U, 'KEYS), 'KEY); 
    DIPBLD (GET (U, 'DIPS)); 
    !#RTNOW!# := GET (U, 'RTS); 
    !#GTNOW!# := GET (U, 'GTS); 
    !#DIP!# := !#KEY!# := !#RT!# := !#GT!# := !#GENLABLIST!# := NIL; 
 L: !#STACK!# := NIL; 
    NEXT!-TOK(); 
    X := APPLY (U, NIL); 
    IF NULL X THEN 
    << ERROR!-PRINT(); 
       IF SCAN!-TERM() THEN <<PRIN2 ("Resuming scan"); TERPRI(); GOTO L>> >>; 
    REMFLAG (GET (U, 'KEYS), 'KEY) 
 END; 

