META II, being a translator writing system could be defined in itself. The extended version of META II used at Atlas was:
.SYNTAX PROGRAM
PROGRAM=('.INIT' $(.ID [* *T] '=' .NUMBER[* %] /
.STRING [ 'LBST' *T *P * *P %] )
'.INITEND' / .EMPTY )
'.SYNTAX' .ID ['CLL' *T * % 'FIN' %]
$ST '.END' [ '&' *T '&' %] ;
ST = .ID [* *T ':' %] '=' EXP ';' ['R' %] ;
EXP = ALT $( '/' ['BT' *T *1 %] ALT) [*1 *T ':' %] ;
ALT = ITEM [ 'BF' *T *1 %] $ (ITEM [ 'BE' %]) [ *1 *T ':' %] ;
ITEM = .ID ['CLL' *T * %] /
.STRING ['TST' *T *P * *P %] /
'..' .STRING ['ANYSTR' *T *P * *P %] /
'.NOT' ITEM ['BF' *T *1 % 'SETF' % 'BR' *T *2 % ] '.BUT'
[ *1 *T ':' %] ITEM [*2 *T ':' % ] /
'.' .ID [* %] /
'(' EXP ')' /
'$' [*1 *T ':' %] ITEM ['BT' *T *1 % 'SET' %] /
'[.' [ 'STTYP' %] $ OUTITM '.]' [ 'FITYP' %] /
'[' $ OUTITM ']'
OUTITM = '*' (.NUMBER ('+' ['LABPLS' *T * %] / '..' ['LABLST' *T * %]
/ .EMPTY [ 'GN' *T * %] /
'P' ['PRIM' %] /
'T' ['TAB' %] /
'B' ['CIB' %] /
'->' .NUMBER ['INTO' *T * %] /
'<-' .NUMBER ['FROM' *T * % ] /
.EMPTY [ 'CI' % ] ) /
'%' [ 'OUT' % ] /
.STRING ['CL' *T *P * *P %] ;
.END
The definitions of the routines called are:
Some of these just used by FOREST
The original Schorre recogniser for META II was:
.SYNTAX PROGRAM
PROGRAM = '.SYNTAX' .ID $ST '.END' ;
ST = .ID '=' EX1 ';' ;
EX1 = EX2 $('/' EX2) ;
EX2 = (EX3/OUTPUT)$(EX3/OUTPUT);
EX3 = .ID/.STRING/'.ID'/'.NUMBER'/'.STRING'/
'('EX1')'/'.EMPTY'/'$'EX3;
OUTPUT = '.OUT' '('$OUT1')';
OUT1 = '*1'/'*2'/'*3'/'*'/.STRING;
.END
META II defined in itself was something like:
.SYNTAX PROGRAM
PROGRAM = '.SYNTAX' .ID .OUT('CLL ' * ';FIN;') $ST '.END' ;
ST = .ID .OUT(* ':') '=' EX1 ';' .OUT('R;');
EX1 = EX2 $('/' .OUT('BT' *1';')EX2) .OUT(*1 ':');
EX2 = (EX3 .OUT('BF' *1 ';')/OUTPUT)$(EX3 .OUT('BE;')/OUTPUT) .OUT(*1':');
EX3 = .ID .OUT('CLL ' * ';')/
.STRING .OUT('TST ' *3 * *3 ';')/
'.ID' .OUT('ID;')/
'.NUMBER' .OUT('NUM;')/
'.STRING' .OUT('SR;')/
'('EX1')'/'.EMPTY' .OUT('SET;')/
'$' .OUT(*1':') EX3 .OUT('BT ' *1 '; SET ;';
OUTPUT = '.OUT' '('$OUT1')' .OUT('OUT;');
OUT1 = '*1' .OUT('GN1;')/
'*2' .OUT('GN2;')/
'*3' .OUT('PRIME;')/
'*' .OUT('CI;')/
.STRING .OUT('CL ' *3 * *3 ';');
.END
The definitions of the routines to be handcode are: