/ comphdr.h
comphdr.h
1 //KRC COMPILER HEADER FILE 2 3 //---------------------------------------------------------------------- 4 //The KRC system is Copyright (c) D. A. Turner 1981 5 //All rights reserved. It is distributed as free software under the 6 //terms in the file "COPYING", which is included in the distribution. 7 //---------------------------------------------------------------------- 8 9 //LEX ANALYSER MANIFESTS 10 #define TOKEN LIST // in-core tokens can be CONSes 11 #define IDENT (TOKEN)0 12 #define CONST (TOKEN)1 13 #define EOL (TOKEN)'\n' 14 #define BADTOKEN (TOKEN)256 15 #define PLUSPLUS_SY (TOKEN)257 16 #define GE_SY (TOKEN)258 17 #define LE_SY (TOKEN)259 18 #define NE_SY (TOKEN)260 19 #define EQ_SY (TOKEN)261 20 #define DOTDOT_SY (TOKEN)262 21 #define BACKARROW_SY (TOKEN)263 22 #define DASHDASH_SY (TOKEN)264 23 #define STARSTAR_SY (TOKEN)265 24 #define ENDSTREAMCH (TOKEN)EOF //-1 25 26 //LEX ANALYSER GLOBALS 27 extern LIST TOKENS, THE_CONST; // BASES 28 extern ATOM THE_ID; // BASES 29 extern WORD THE_NUM, THE_DECIMALS; // DECIMALS are never used 30 extern WORD EXPFLAG, ERRORFLAG, EQNFLAG; 31 extern TOKEN MISSEDTOK; 32 extern WORD CASECONV(WORD CH); 33 extern WORD COMMENTFLAG; 34 // SUPPRESSPROMPTS(); //EMAS COMMAND 35 extern LIST FILECOMMANDS; 36 extern BOOL LEGACY; 37 extern void WRITETOKEN(TOKEN T); 38 39 // KRC EXPRESSION REPRESENTATIONS 40 // THE INTERNAL REPRESENTATIONS OF EXPRESSIONS IS AS FOLLOWS 41 // EXP::= ID|CONST|APPLN|OTHER 42 // ID::= ATOM 43 // CONST::= NUM|CONS(QUOTE,ATOM)|NIL 44 // APPLN::= CONS(EXP,EXP) 45 // OTHER::= CONS(OPERATOR,OPERANDS) 46 // NOTE THAT THE INTERNAL FORM OF ZF EXESSIONS IS CONS(ZF_OP,BODY) :- 47 // BODY::= CONS(EXP,NIL) | CONS(QUALIFIER,BODY) 48 // QUALIFIER::= EXP | CONS(GENERATOR,CONS(ID,EXP)) 49 50 // OPERATOR VALUES: 51 typedef enum { 52 // QUASI OPERATORS 53 ALPHA=-2, INDIR=-1, QUOTE=0, 54 // INFIX OPERATORS 55 COLON_OP=1, APPEND_OP=2, LISTDIFF_OP=3, OR_OP=4, AND_OP=5, 56 // SUBGROUP: RELATIONAL OPERATORS 57 GR_OP=6, GE_OP=7, NE_OP=8, EQ_OP=9, LE_OP=10, LS_OP=11, 58 PLUS_OP=12,MINUS_OP=13,TIMES_OP=14,DIV_OP=15,REM_OP=16, 59 EXP_OP=17,DOT_OP=18, 60 // OTHER OPERATORS 61 DOTDOT_OP=19, COMMADOTDOT_OP=20, ZF_OP=21, GENERATOR=22, 62 LENGTH_OP=23, NEG_OP=24, NOT_OP=25, 63 QUOTE_OP=26 //USED TO CONVERT AN INFIX INTO A FUNCTION 64 } OPERATOR; 65 66 //INTERNAL REPRESENTATION OF KRC EQUATIONS 67 //VAL FIELD OF ATOM ::= CONS(CONS(NARGS,COMMENT),LISTOF(EQN)) 68 // COMMENT ::= NIL | CONS(ATOM,COMMENT) 69 // EQN ::= CONS(LHS,CODE) 70 //(IF NARGS=0 THERE IS ONLY ONE EQUATION IN THE LIST AND ITS LHS FIELD 71 // IS USED TO REMEMBER THE VALUE OF THE VARIABLE) 72 // LHS ::= ID | CONS(LHS,FORMAL) 73 // FORMAL ::= ID | CONST | CONS(COLON_OP,CONS(FORMAL,FORMAL)) 74 // CODE ::= INSTR* 75 // INSTR ::= LOAD_C <ID|CONST|MONOP> | 76 // LOADARG_C INT | 77 // APPLY_C | 78 // APPLYINFIX_C DIOP | 79 // IF_C | 80 // FORMLIST_C INT | 81 // MATCH_C INT CONST 82 // MATCHARG_C INT INT | 83 // MATCHPAIR_C INT | 84 // STOP_C | 85 // LINENO_C INT | 86 // CONTINUE.INFIX_C DIOP | 87 // CONT.GENERATOR_C INT| 88 // FORMZF_C INT| 89 // CALL_C BCPL_FN 90 91 //INSTRUCTION CODES 92 typedef enum { 93 LOAD_C=0, LOADARG_C=1, APPLY_C=2, APPLYINFIX_C=3, 94 IF_C=4, FORMLIST_C=5, MATCH_C=6, MATCHARG_C=7, 95 MATCHPAIR_C=8, STOP_C=9, LINENO_C=10, CALL_C=11, 96 CONTINUE_INFIX_C=12, FORMZF_C=13, CONT_GENERATOR_C=14, 97 //THE LINENO COMMAND HAS NO EFFECT AT EXECUTION TIME, IT IS USED 98 //TO GIVE AN EQUATION A NON STANDARD LINE NUMBER FOR INSERTION 99 //PURPOSES 100 } INSTRUCTION; 101 102 //EXTERNAL SYNTAX FOR KRC EXPRESSIONS AND EQUATIONS 103 // EQUATION ::= LHS=EXP | LHS=EXP,EXP 104 // LHS ::= ID FORMAL* 105 // FORMAL ::= ID | CONST | (PATTERN) | [PATTERN-LIST?] 106 // PATTERN ::= FORMAL:PATTERN | FORMAL 107 // EXP ::= PREFIX EXP | EXP INFIX EXP | SIMPLE SIMPLE* 108 // SIMPLE ::= ID | CONST | (EXP) | [EXP-LIST?] | [EXP..EXP] | [EXP..] | 109 // [EXP,EXP..EXP] | [EXP,EXP..] | {EXP;QUALIFIERS} 110 // QUALIFIERS ::= QUALIFIER | QUALIFIER;QUALIFIERS 111 // QUALIFIER ::= EXP | NAME-LIST<-EXP 112 // CONST ::= INT | "STRING" 113 114 // PREFIX AND INFIX OPERATORS, IN ORDER OF INCREASING BINDING POWER: 115 116 // (PREFIX) (INFIX) (REMARKS) 117 // : ++ -- right associative 118 // | 119 // & 120 // \ 121 // > >= == \= <= < continued relations allowed 122 // + - left associative 123 // - 124 // * / % left associative 125 // ** . (** is right associative) 126 // # 127 //Notes - "%" is remainder operator, "." is functional composition and "#" takes the length of lists 128 129 //COMPILER GLOBALS 130 131 // DEFINED IN KRC_LEX 132 extern void READLINE(void); 133 extern BOOL HAVE(TOKEN); 134 extern WORD HAVEID(void); 135 extern void SYNTAX(void); 136 extern void CHECK(TOKEN); 137 extern WORD HAVECONST(void); 138 extern WORD HAVENUM(void); 139 extern void SYNTAX_ERROR(char *); 140 141 // DEFINED IN KRC_COMPILER 142 extern void INIT_CODEV(void); 143 extern LIST EQUATION(void); 144 extern LIST PROFILE(LIST); 145 extern void PRINTEXP(LIST, WORD); 146 extern LIST EXP(void); 147 extern void REMOVELINENO(LIST); 148 extern WORD ISID(LIST); 149 extern VOID DISPLAY(ATOM ID, BOOL WITHNOS, BOOL DOUBLESPACING); 150 extern VOID DISPLAYEQN(ATOM ID, WORD NARGS, LIST EQN); 151 extern VOID DISPLAYRHS(LIST LHS,WORD NARGS, LIST CODE); 152 153 //DEFINED IN KRC_REDUCER 154 extern void PRINTATOM(ATOM A, WORD FORMAT); 155 156 //OTHERS 157 extern void (*TRUEWRCH)(WORD C); 158 extern LIST TRUTH, FALSITY, INFINITY, LASTLHS; //BASES 159 160 // GC helpers 161 extern VOID COMPILER_BASES(VOID (*F)(LIST *)); 162 extern VOID REDUCER_BASES(VOID (*F)(LIST *));