home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l200 / 6.ddi / TRAN / ATBLS1.C < prev    next >
Encoding:
C/C++ Source or Header  |  1986-09-23  |  7.0 KB  |  244 lines

  1. /*
  2.         atbls1 -- Administrative module, Tables
  3.         
  4.         Copyright (c) 1983 by James F. Gimpel
  5.         Copyright (c) 1983 by JMI Software Consultants, Inc.
  6.  
  7.         atbls1.c and atbls2.c contain tables of keywords and operators
  8.         that will enable a user to add custom functions
  9.         and statements and modify the meaning of operators.
  10. */
  11. #include "at.h"
  12. #include "ppd.h"
  13. #include "par.h"
  14.  
  15. #define FUNC(result,params) result|tf_BFUN|((params)<<DT_SHIFT)
  16. #define FUNCLP(result,params) FUNC(result,params)|tf_LPAR
  17.  
  18.  
  19. GLOBAL TOKEN par_line = 0;
  20.  
  21. /*    kword_tbl :
  22.     The following table contains all keywords (reserved words) other
  23.     than statement names and operators
  24.  
  25.     It is headed by two definitions used to prepare function-type
  26.     entries in the table. FUNC(result,params) defines a function
  27.     returning a certain type (result) with a particular optional
  28.     paramater list (params). The second form, FUNCLP(), insists
  29.     that the keyword be followed by a Left Parenthesis. This is 
  30.     the form used for most function keywords in most versions of BASIC.
  31. */
  32.  
  33.  
  34. GLOBAL STRTOK kword_tbl[] =
  35.         {
  36.         /* This table must be kept in sorted order */
  37.         "ABS",        FUNCLP(dt_DBL, par_D),    NO,
  38.         "AND",        op_AND,    NO,
  39.         "APPEND",    t_APP,    NO,
  40.         "AS",        t_AS,    NO,
  41.         "ASC",        FUNCLP(dt_INT, par_S),    YES,
  42.         "ATN",        FUNCLP(dt_DBL, par_D),    NO,
  43.         "BASE",        t_BASE,    NO,
  44.         "BY",         t_STEP,    NO,
  45.         "CDBL",        tf_CAST|dt_DBL,    NO,
  46.         "CHR$",        FUNCLP(dt_STR, par_TI),    NO,
  47.         "CINT",        FUNCLP(dt_INT, par_D),    YES,
  48.         "COS",        FUNCLP(dt_DBL, par_D),    NO,
  49.         "CSNG",        tf_CAST|dt_FLOAT,    NO,
  50.         "CSRLIN",    FUNC(dt_INT, par_NARG),    NO,
  51.         "CVD",        FUNCLP(dt_DBL, par_S),    NO,
  52.         "CVI",        FUNCLP(dt_INT, par_S),    NO,
  53.         "CVS",        FUNCLP(dt_FLOAT, par_S),    NO,
  54.         "DATE$",    FUNC(dt_STR, par_TNARG),    NO,
  55.         "ELSE",        t_ELSE,    NO,
  56.         "END",        t_END,    NO,
  57.         "EOF",        FUNCLP(dt_BOOL, par_I),    NO,
  58.         "EQV",        op_EQV,    NO,
  59.         "ERL",        FUNC(dt_INT, par_NARG),    NO,
  60.         "ERR",        FUNC(dt_INT, par_NARG),    NO,
  61.         "ERROR",    t_ERROR,    NO,
  62.         "EXP",        FUNCLP(dt_DBL, par_D),    YES,
  63.         "FIX",        FUNCLP(dt_DBL, par_D),    NO,
  64.         "FN",         t_UFN|tf_PART,    NO,
  65.         "FOR",        t_FOR,    NO,
  66.         "FRE",        FUNC(dt_DBL, par_OPT),    NO,
  67.         "GOSUB",    t_GOSUB,    NO,
  68.         "GOTO",        t_GOTO,    NO,
  69.         "HEX$",        FUNCLP(dt_STR, par_TD),    NO,
  70.         "IMP",        op_IMP,    NO,
  71.         "INKEY$",    FUNCLP(dt_STR, par_TNARG),    NO,
  72.         "INP",        FUNCLP(dt_INT,par_BU),    NO,
  73.         "INPUT",    t_INPUT,    NO,
  74.         "INPUT$",    FUNCLP(dt_STR,par_INP),    YES,
  75.         "INSTR",    FUNCLP(dt_INT, par_INSTR),    YES,
  76.         "INT",        FUNCLP(dt_DBL, par_D),    NO,
  77.         "LEFT$",    FUNCLP(dt_STR, par_TSI),    YES,
  78.         "LEN",        FUNCLP(dt_INT, par_S),    NO,
  79.         "LOC",        FUNCLP(dt_INT, par_I),    YES,
  80.         "LOF",        FUNCLP(dt_DBL, par_I),    YES,
  81.         "LOG",        FUNCLP(dt_DBL, par_D),    YES,
  82.         "LPOS",        FUNCLP(dt_INT, par_I),    NO,
  83.         "MID$",        FUNCLP(dt_STR,par_MID),    YES,
  84.         "MKD$",        FUNCLP(dt_STR, par_TD),    NO,
  85.         "MKI$",        FUNCLP(dt_STR, par_TI),    NO,
  86.         "MKS$",        FUNCLP(dt_STR, par_TD),    NO,
  87.         "MOD",        op_MOD,    NO,
  88.         "NEXT",        t_NEXT,    NO,
  89.         "NOT",        op_NOT,    NO,
  90.         "OCT$",        FUNCLP(dt_STR, par_TD),    NO,
  91.         "OR",        op_OR,    NO,
  92.         "OUTPUT",    t_OUT,    NO,
  93.         "PEEK",        FUNCLP(dt_INT, par_BU),    NO,
  94.         "POS",        FUNCLP(dt_INT, par_OPT),    NO,
  95.         "REM",        t_REM, NO,
  96.         "RIGHT$",    FUNCLP(dt_STR, par_TSI),    YES,
  97.         "RND",        FUNC(dt_DBL, par_RND),  NO,
  98.         "SGN",        FUNCLP(dt_DBL, par_D),    NO,
  99.         "SIN",        FUNCLP(dt_DBL, par_D),    NO,
  100.         "SPACE$",    FUNCLP(dt_STR, par_TI),    NO,
  101.         "SPC",        t_SPC,    NO,
  102.         "SQR",        FUNCLP(dt_DBL, par_D),    YES,
  103.         "STEP",        t_STEP,    NO,
  104.         "STR$",        FUNCLP(dt_STR, par_TD),    NO,
  105.         "STRING$",    FUNCLP(dt_STR, par_STR),    NO,
  106.         "TAB",        t_TAB,    NO,
  107.         "TAN",        FUNCLP(dt_DBL, par_D),    NO,
  108.         "THEN",        t_THEN,    NO,
  109.         "TIME$",    FUNC(dt_STR, par_TNARG),    NO,
  110.         "TIMER",    FUNC(dt_DBL, par_NARG),    NO,
  111.         "TO",        t_TO,    NO,
  112.         "USING",    t_USING,    NO,
  113.         "USR",        tf_PART|FUNC(dt_INT,par_FUSR),    YES,
  114.         "VAL",        FUNCLP(dt_DBL, par_S),    NO,
  115.         "VARPTR",    FUNCLP(dt_INT, par_VPTR),    NO,
  116.         "XOR",        op_XOR,    NO,
  117.         };
  118.  
  119. GLOBAL int num_kword = sizeof(kword_tbl)/sizeof(STRTOK);
  120.  
  121. /*    Statement Keyword Table --
  122.  
  123.     All statement types appear in the table below except for
  124.     a LET-less assignment.
  125.  
  126. */
  127.  
  128. GLOBAL STRTOK
  129.     stmt_key[] =
  130.     {
  131.     /* This table must be kept in sorted order */
  132.     "BEEP",            stf_GENERIC|par_NARG,    NO,
  133.     "CALL",            st_CALL,    NO,
  134.     "CHAIN",        stf_GENERIC|par_XS,    YES,
  135.     "CLEAR",        stf_GENERIC|par_CLEAR,    YES,
  136.     "CLOSE",        stf_GENERIC|par_BINF,    NO,
  137.     "CLS",            stf_GENERIC|par_NARG,    NO,
  138.     "COLOR",        stf_GENERIC|par_3OINT,    NO,
  139.     "COMMON",        st_COMMON,    NO,
  140.     "CVMODE",        stf_GENERIC|par_XS,    YES,
  141.     "DATA",            st_DATA,    NO,
  142.     "DATE$",        stf_GENERIC|par_DATE,    YES,
  143.     "DEF",            st_DEF,    NO,
  144.     "DEFDBL",        st_DDBL,    NO,
  145.     "DEFINT",        st_DINT,    NO,
  146.     "DEFSNG",        st_DSNG,    NO,
  147.     "DEFSTR",        st_DSTR,    NO,
  148.     "DIM",            st_DIM,    NO,
  149.     "ELSE",            st_ELSE,    NO,
  150.     "END",            st_END,    NO,
  151.     "ERASE",        st_ERASE,    NO,
  152.     "ERROR",        stf_GENERIC|par_XI,    YES,
  153.     "FIELD",        st_FIELD,    YES,
  154.     "FILES",        stf_GENERIC|par_SOPT,    NO,
  155.     "FOR",            st_FOR,    NO,
  156.     "GET",            stf_GENERIC|par_GET,    YES,
  157.     "GOSUB",        st_GOSUB,    NO,
  158.     "GOTO",            st_GOTO,    NO,
  159.     "IF",            st_IF,    NO,
  160.     "INPUT",        st_INPUT,    YES,
  161.     "KILL",            stf_GENERIC|par_XS,    YES,
  162.     "LET",            st_LET,    NO,
  163.     "LINE",            st_LINE,    YES,
  164.     "LOCATE",        stf_GENERIC|par_5OINT,    YES,
  165.     "LOCK",            stf_GENERIC|par_LOCK,    YES,
  166.     "LPRINT",        st_LPRINT,    YES,
  167.     "LSET",            stf_GENERIC|par_LSET,    NO,
  168.     "MID$",            stf_GENERIC|par_MDST,    YES,
  169.     "NAME",            stf_GENERIC|par_NAME,    YES,
  170.     "NEW",            st_END,    NO,
  171.     "NEXT",            st_NEXT,    NO,
  172.     "ON",            st_ON,    NO,
  173.     "OPEN",            stf_GENERIC|par_OPEN,    YES,
  174.     "OPTION",        st_OPTION,    NO,
  175.     "OUT",            stf_GENERIC|par_XUI,    NO,
  176.     "POKE",            stf_GENERIC|par_BXUI,    NO,
  177.     "PRINT",        st_PRINT,    YES,
  178.     "PRINT@",        st_PRAT,    YES,
  179.     "PUT",            stf_GENERIC|par_GET,    YES,
  180.     "RANDOMIZE",    stf_GENERIC|par_RAN,    NO,
  181.     "READ",            st_READ,    YES,
  182.     "REM",            st_REM,    NO,
  183.     "RESET",        stf_GENERIC|par_NARG,    NO,
  184.     "RESTORE",        stf_GENERIC|par_X1OINT,    NO,
  185.     "RESUME",        st_RESUME,    NO,
  186.     "RETURN",        st_RET,    NO,
  187.     "RSET",            stf_GENERIC|par_LSET,    NO,
  188.     "RUN",            st_RUN, YES,
  189.     "SHELL",        stf_GENERIC|par_SHELL,    NO,
  190.     "SPOOL",        stf_GENERIC|par_NARG,    NO,
  191.     "STOP",            stf_GENERIC|par_LNUM,    NO,
  192.     "SWAP",            st_SWAP,    NO,
  193.     "SYSTEM",        st_END,                    NO,
  194.     "TIME$",        stf_GENERIC|par_DATE,    YES,
  195.     "TROFF",        stf_GENERIC|par_NARG,    NO,
  196.     "TRON",            stf_GENERIC|par_NARG,    NO,
  197.     "UNLOCK",        stf_GENERIC|par_UNLK,    YES,
  198.     "WAIT",            stf_GENERIC|par_WAIT,    NO,
  199.     "WEND",            st_WEND,    NO,
  200.     "WHILE",        st_WHILE,    NO,
  201.     "WIDTH",        stf_GENERIC|par_WIDTH,    YES,
  202.     "WRITE",        st_WRITE,    YES,
  203.     } ;
  204.  
  205. GLOBAL int num_stmt_key = sizeof(stmt_key) / sizeof(STRTOK);
  206.  
  207. /*    DEF Extensions -- If the statement is DEF we must then
  208.     examine this table.
  209. */
  210.  
  211. GLOBAL STRTOK def_ext[] =
  212.     {
  213.     "SEG",    stf_GENERIC|tf_PART|par_SEG,    YES,
  214.     "USR",    stf_GENERIC|tf_PART|par_USR,    YES,
  215.     };
  216.  
  217. GLOBAL int num_dext = sizeof(def_ext) / sizeof(STRTOK);
  218.  
  219.  
  220.  
  221. /*    Special but unreserved Identifiers. Eg.
  222.  
  223.     RUN file[,R]
  224.  
  225.     where R must be recognized but not reserved.
  226. */
  227.  
  228. GLOBAL STRTOK id_tbl[] =
  229.     {
  230.     "APPEND",    TAPP,    NO,
  231.     "AS",        TAS,    NO,
  232.     "FOR",        TFOR,    NO,
  233.     "INPUT",    TINP,    NO,
  234.     "LEN",        TLEN,    NO,
  235.     "OUTPUT",    TOUT,    NO,
  236.     "R",        TR,    NO,
  237.     "READ",        TRD,    NO,
  238.     "TO",        TTO,    NO,
  239.     "WAIT",        TWT,    NO,
  240.     "WIDTH",    TWID,    NO,
  241.     };
  242.  
  243. GLOBAL int num_id = sizeof(id_tbl)/sizeof(STRTOK);
  244.