home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol159 / meta4.met < prev    next >
Encoding:
Text File  |  1985-03-23  |  4.5 KB  |  230 lines

  1. .SYN COMPILE
  2. .FIELD VALUE 0 TYPE 3 ;
  3. .CONSTANT NAME 1 FIELD 3 CONSTANT 2
  4.         FUNC 4  UNDEFINED 0 AVAILFIELDS 5 ;
  5. .NAME NUMBER '0' ID '0' SAVEID '2' TEMP 'Z' STACK 'Y' UNSTACK '!' ;
  6. .FUNCTION IDNAME EXPRESSION TERM FACTOR
  7.     CONSTSIMP CONSTEXP CONSTTERM CONSTFAC
  8.     IDCONS ERRORMESSAGE CFAC CEXP IDNEW
  9.     CATNAME IDFIELD CHECKFRANGE PHRASE
  10.     ;
  11. RVALUE =
  12.     IDNAME &CATNAME (':' IDFIELD .CAT ('M' ID:VALUE)
  13.     / .EMP )
  14.     /CONSTSIMP
  15.         .CAT('N/' UNSTACK ' ')
  16.     / '+' EXPRESSION .CAT('!')
  17.     ;
  18. EXPRESSION = TERM $( '+'TERM .OUT('!+')
  19.         /'-' TERM .OUT('!-')
  20.     )
  21.     ;
  22. TERM = FACTOR
  23.     $('*' FACTOR .OUT('!*')
  24.     /'/''256' .OUT('HZ')
  25.     .OUT('!D')
  26.     .OUT('ZY')
  27.     /'%256'
  28.     .OUT('HY')
  29.     .OUT('N/''256*')
  30.     .OUT('!-')
  31.     )
  32.     ;
  33. FACTOR='(' EXPRESSION ')'
  34.     /CONSTSIMP .OUT('N/' UNSTACK 'Y')
  35.     /IDNAME &CATNAME (':' IDFIELD
  36.         .CAT('M'ID:VALUE)
  37.         /.EMP) .OUT('Y')
  38.     /'-'FACTOR .OUT('!Z')
  39.         .OUT('N/''0Y')
  40.         .OUT('Z-')
  41.     ;
  42. CATNAME = ID:VALUE=:STACK
  43.     .ACT('!L')    !ACTS AS A ONE BYTE MACRO
  44.     ;
  45. TOPLACE = IDNAME ID=:SAVEID
  46.     (':' IDFIELD .CAT( 'I'  ID:VALUE)
  47.     /.EMP )
  48.         SAVEID=:ID &CATNAME
  49.     ;
  50. DECLARE = '.FIELD' $ (IDNEW ID=:SAVEID
  51.     CONSTEXP  &CHECKFRANGE NUMBER=:SAVEID:VALUE
  52.         FIELD=:SAVEID:TYPE
  53.         )    ';'
  54.     /'.NAME' $ ( IDNEW ID=:SAVEID
  55.         CONSTEXP
  56.         UNSTACK=:SAVEID:VALUE
  57.         NAME=:SAVEID:TYPE
  58.     )        ';'
  59.     / '.CONSTANT' $ (IDNEW ID=:SAVEID
  60.         CONSTEXP
  61.         CONSTANT=:SAVEID:TYPE
  62.         UNSTACK=:SAVEID:VALUE
  63.     )        ';'
  64.     /'.FUNCTION' $ (IDNEW FUNC=:ID:TYPE)
  65.     ';'
  66.     ;
  67. CONSTEXP = CONSTTERM $( '+' CONSTTERM .ACT('!+')
  68.     /'-' CONSTTERM .ACT('!-')
  69.     )
  70.     ;
  71. CONSTTERM = CONSTFAC $( '*' CONSTFAC .ACT ('!*')
  72.     )
  73.     ;
  74. CONSTSIMP = .NUM NUMBER=:STACK
  75.     /IDCONS ID:VALUE=:STACK
  76.     /.STR "'" .ACT ('N/0SY')    !VALUE IS FIRST CHARACTER
  77.     /'.X' .HEXNUM ]NUMBER
  78.     ;
  79. CONSTFAC =
  80.     CONSTSIMP
  81.     /'-' CONSTFAC .ACT('!Z' 'N/0Y' 'Z-')
  82.     /'(' CONSTEXP ')'
  83.     ;
  84. IDTYPE = .ACT ('LI'    !IS IT AN ID?
  85.         'F/' *1 !NO, RETURN
  86.         'ME'    !DEFINE OR FIND
  87.         '0M3Y' 'Z='    !ID TYPE==TEMP?
  88.         'L' 'R'    !TAKE AND RETURN
  89.         '.' *1    !NOW ACCEPT OR REWIND INPUT
  90.         'L'  'Z9' )
  91.     ;
  92. IDNAME = .PREP NAME=:TEMP IDTYPE
  93.     ;
  94. IDFIELD = .PREP FIELD=:TEMP IDTYPE
  95.     ;
  96. IDFUNC = .PREP FUNC =: TEMP IDTYPE
  97.     ;
  98. IDCONS = .PREP CONSTANT=:TEMP IDTYPE
  99.     ;
  100. IDNEW = .PREP UNDEFINED=:TEMP IDTYPE
  101.     ;
  102. CHECKFRANGE = .IF( NUMBER<=AVAILFIELDS)
  103.     .RETURN
  104.     .ELSE
  105.         .ERMS( NUMBER ' IS TOO BIG FOR A FIELD')
  106.     .END
  107.     ;
  108. AOUT = '*1' .OUT('U')
  109.     / '*2' .OUT ( 'V' )
  110.     / '*' .OUT ( 'C' )
  111.     /( .STR "'"/.STR'"') .OUT ( 'P' * )
  112.     /RVALUE .OUT('C')
  113.     /'.H' RVALUE .OUT('H')
  114.     /'.' .OUT('XN')
  115.     ;
  116. NOTSYN = ( '.OUT' '(' $ AOUT ')'
  117.     / '.LAB'  .OUT ( 'P... ') AOUT
  118.     )
  119.     .OUT ( 'O' )
  120.     / '.ACT' '(' $(
  121.         ( .STR "'" / .STR '"' ) .ACT ('C')
  122.             ('*1' .ACT('U')
  123.             /'*2' .ACT ('V')
  124.             /.EMP)
  125.             .ACT('O')
  126.         / .STR '!'
  127.         ) ')'
  128.     /']' RVALUE .OUT('Y')
  129.     / RVALUE '=:' TOPLACE .OUT()
  130.     /'.IF' '(' CEXP ')' .OUT('F/' *1) $ NOTSYN
  131.         ('.ELSE' .OUT ('J/'*2)  .LAB*1 .OUT('S')  $NOTSYN '.END' .LAB*2
  132.         /'.END'    .LAB*1 .OUT('S')  )
  133.     /'.CAT'
  134.         '(' $AOUT ')'
  135.     /'.CONDLAB'
  136.         ('*1' .OUT ('UY')
  137.         .OUT ('0=')
  138.         .OUT ('T/' *1)
  139.         .OUT ('P... ')
  140.         .OUT ('U')
  141.     /'*2' .OUT('VY')
  142.         .OUT('0=')
  143.         .OUT('T/' *1)
  144.         .OUT('P... ')
  145.         .OUT('V')
  146.     )
  147.     .OUT('O')
  148.     .OUT('S')    !!! NOTE SIDE EFFECT !!!
  149.     .LAB *1
  150.     /ERRORMESSAGE
  151.     /'.ERROR' .OUT('SF')
  152.     /'.SUCCEED' .OUT('S')
  153.     /'.FAIL' .OUT('SF')
  154.     / '&' IDFUNC .OUT ( 'G' * )
  155.     /'.RETURN' .OUT ( 'R' )
  156.     /.STR '!'
  157.     /'.WHILE' .LAB *1
  158.         '(' CEXP ')' .OUT ('F/' *2)
  159.         $NOTSYN
  160.         '.ENDWHILE'
  161.             .OUT('J/' *1)
  162.             .LAB *2
  163.     ;
  164. CRIGHT=
  165.     '==' .OUT ('Y')
  166.     RVALUE .OUT('=')
  167.     /'!=' .OUT('Y')
  168.     RVALUE .OUT('=') .OUT ('SC')
  169.     /'<=' .OUT('Y')
  170.     RVALUE .OUT('<') .OUT ('SC')
  171.     /'>=' .OUT('Y')
  172.     RVALUE .OUT('>') .OUT('SC')
  173.     /'<' .OUT('Y')
  174.     RVALUE .OUT('>')
  175.     /'>' .OUT ('Y')
  176.     RVALUE .OUT('<')
  177.     ;
  178. CTERM = CFAC $( '.ANDIF' .OUT('F/' *2) CFAC)
  179.     .CONDLAB *2
  180.     ;
  181. CFAC = RVALUE CRIGHT
  182.     /'.NOT' CFAC .OUT('SC')
  183.     /'(' CEXP ')'
  184.     /'&' IDNEW .OUT('G' *)
  185.     ;
  186. CEXP = CTERM $( '.ORIF' .OUT('T/' *1) CTERM)
  187.     .CONDLAB *1
  188.     ;
  189. ERRORMESSAGE = '.ERMS' '(' .OUT('T/'*1) $AOUT
  190.     ')' .OUT('XO') .LAB *1
  191.  
  192.  
  193.     ;
  194. SYN = (  IDNEW .OUT ('G' *)
  195.     / .STR "'"  .OUT ( 'LM'  * ) .OUT ( 'L' )
  196.     /'.ID'  .OUT ( 'LI' )
  197.         .OUT ( 'F/' *1 ) .OUT ( 'L' ) .OUT ( 'ME' ) .LAB *1
  198.     /'.NUM' .OUT ( 'LN' ) .OUT ( 'L' )
  199.     /'.STR' (.STR "'" / .STR '"' ) .OUT ( 'LQ' * ) .OUT ( 'L' )
  200.     /'.EMP' .OUT ( 'S' )
  201.     /'$'    .LAB *1 SYN .OUT('T/' *1) .OUT('S')
  202.     /'(' PHRASE ')'
  203.     /'.HEXNUM' .OUT('LH') .OUT('L')
  204.     )
  205.     (ERRORMESSAGE
  206.     /.EMP)
  207.  
  208.  
  209.     ;
  210. SEQ = SYN .OUT ('F/' *1)
  211.     $ ( SYN .OUT ( 'X' ) / NOTSYN )
  212.     .LAB *1
  213.     ;
  214. ALTS = SEQ $('/' .OUT ('T/'*1) SEQ)
  215.     .CONDLAB *1
  216.     ;
  217. PHRASE = '.PREP' $NOTSYN ALTS
  218.     /ALTS
  219.     /NOTSYN $NOTSYN
  220.  
  221.     ;
  222. STATEMENT = .ID .LAB * '=' PHRASE ';' .OUT ( 'R' )
  223.     (.STR '!' /.EMP)
  224.  
  225.     ;
  226. COMPILE = '.SYN'  .ID  .OUT('S')
  227.     .OUT ( 'XM;' ) .OUT ('G' *) .OUT('E')
  228.     .ACT('XM;') $ DECLARE   $ STATEMENT
  229.     ;
  230.