The MINI translator writing system
----------------------------------
MINI processes a BNF-like form into a set of LISP functions, one for each
production, operating on a stack and token-stream. They call each other,
and a set of support routines and built-in recognizers. MINI uses a stack;
the user can access sub-trees on the stack, replacing them by other trees
built from these sub-trees. Primitive recognizers their recognized token
on this stack.
==================== Load mini by doing LOAD MINI; in RLISP.
==================== The translator is defined by MINI 'rootname;
MINI 'FOO;
FOO: ID '!- ID +(SUB #2 #1) .(PRINT #1) ;
FIN
defines a complete one rule translator, which recognizes two identifiers
separated by a minus sign (each ID pushes the recognized identifier onto
the stack). The +() expression replaces the top 2 elements on the stack
(#2 pops the first ID pushed onto the stack, while #1 pops the other) with
a LISP statement. The .() expression POPs and prints it.
See also <griss.mini> for demo0.MIN to demo3.MIN
============Run the Grammer by calling INVOKE 'FOO; % i.e. the rootname
============Built In Recognizers: ID, NUM, STR, ANYTOKEN
============Brief list of the operators
' Used to designate a terminal symbol (i.e. 'WHILE, 'DO, '!=)
Identifier Specifies a nonterminal
( ) Used for grouping (i.e. (FOO BAR) requires rule FOO to parse
followed immediately by BAR)
< > Optional parse, if it fails then continue (i.e. <FOO> tries
to parse FOO)
/ Optional rules (i.e. FOO / BAR allows either FOO or BAR to
parse, with FOO tested first)
STMT[ANYTOKEN]* Parse any number of STMT separated by ANYTOKEN,
create a list and push onto the stack (i.e. ID[,]* will parse a
number of IDentifiers separated by commas, like in an argument
list)
##n Reference the nth stack location (n must be an integer)
#n Pop the nth stack location (n must be an integer)
+(STMT) Push the unevaluated (STMT) onto the stack
.(SEXPR) Evaluate the SEXPR and ignore the result
=(SEXPR) Evaluate the SEXPR and test if result non-NIL
+.(SEXPR) Evaluate the SEXPR and push the result on the stack
@ANYTOKEN Specifies a statement terminator, used in the error
recovery mechanism to search for when an error occurs;
like 'ANYTOKEN, but causes NEXT!-TOK to not scan ahead
so .(NEXT!-TOK) may be needed
@@ANYTOKEN Specifies a grammer terminator, used in the error
recovery mechanism to search for when an error occurs;
like @ANYTOKEN; fatal exit in Error Recovery
$integer Generates a unique label
================== Pattern MATCHER
In addition to BNF -like rules that define procedures on 0 arguments (which
scan tokens by calls on NEXT!-TOK() and operate on the stack, MINI also
includes a simple TREE pattern matcher and syntax to define
PatternProcedures that accept and return a single argument, trying a series
of patterns until one succeeds.
E.g. template -> replacement
PATTERN = (PLUS2 &1 0) -> 0,
(PLUS2 &1 &1) -> (LIST 'TIMES2 2 &1),
&1 -> &1;
defines a pattern with 3 rules. &n is used to indicate a matched sub-tree
in both the template and replacement. A repeated &n as in the second rule
requires EQUAL sub-trees.