/ 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 *));