home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / fed0217s.zip / include / parser.h < prev    next >
C/C++ Source or Header  |  2000-12-13  |  4KB  |  167 lines

  1. /*
  2. ** Module   :PARSER.H
  3. ** Abstract :Syntax highlighting parsers
  4. **
  5. ** Copyright (C) Sergey I. Yevtushenko
  6. **
  7. ** Log: Tue  11/03/1997       Created
  8. */
  9.  
  10. #include <common.h>
  11. #include <_ctype.h>
  12. #include <dict.h>
  13.  
  14. #ifndef  __PARSER_H
  15. #define  __PARSER_H
  16.  
  17. #define ST_INITIAL      0
  18. #define ST_QUOTE1       1
  19. #define ST_QUOTE2       2
  20. #define ST_COMMENT      3
  21. #define ST_COMMENT2     4
  22. #define ST_STR_PHP1     5
  23. #define ST_STR_PHP2     6
  24. #define ST_COMMENT_PHP  7
  25. #define ST_PHP_START    ST_QUOTE2
  26. #define ST_PHP_END      ST_COMMENT_PHP
  27.  
  28. //-----------------------------------------
  29. // Basic Parser class
  30. //-----------------------------------------
  31.  
  32. struct RegRecord;
  33.  
  34. class Parser
  35. {
  36.         static char def_tbl[256];
  37.         static int tbl_ready;
  38.         static Dictionary* pKeywords;
  39.         static Dictionary* pParsers;
  40.  
  41.     public:
  42.         int tok_len;
  43.         int color;
  44.         int state;
  45.         int preserve_case;
  46.         int mask;
  47.         char *tok;
  48.         char *old_tok;
  49.         char *cvt_tbl;
  50.  
  51.         Parser();
  52.  
  53.         virtual void reset(char *tok, int initial_state);
  54.  
  55.         virtual int next_token();
  56.         int is_kwd();
  57.         void SetXlat(char *t)   { cvt_tbl = t;}
  58.  
  59.         // Parser collection API
  60.  
  61.         static void RegParser(RegRecord*);      //Used by automated registration
  62.         static Parser* GenParser(int i);        //Generate parser by HI_* key
  63.         static Parser* GenParser(char*);        //Generate parser by name
  64.         static int     Count();                 //Number of registered parsers
  65.         static char*   Name (int iNdx, int iHint = 0);  //Name by ordinal
  66.         static char*   NameByKey(int key, int iHint = 0);   //Name by HI_* key
  67.         static int     Index(char* key);        //HI_* key by name
  68.         static int     Type(int);               //HI_* key by ordinal
  69.         static int     GuessType(char *name);
  70. };
  71.  
  72. //-----------------------------------------
  73. // Individual registrator
  74. //-----------------------------------------
  75.  
  76. typedef Parser* (*PFactory)();
  77.  
  78. struct RegRecord
  79. {
  80.     char* cName;
  81.     char* cHName;
  82.     int   iType;
  83.     PFactory pGen;
  84. };
  85.  
  86. template <class T> class RegParser:public RegRecord
  87. {
  88.     public:
  89.  
  90.         static Parser* Gen()    { return new T;}
  91.  
  92.         RegParser(char* n, char* h, int t)
  93.         {
  94.             cName  = n;
  95.             cHName = h;
  96.             iType  = t;
  97.             pGen  =  Gen;
  98.  
  99.             Parser::RegParser(this);
  100.         }
  101. };
  102.  
  103. //-----------------------------------------
  104. // Classes for particular types of syntax
  105. //-----------------------------------------
  106.  
  107. class Parser_CPP:public Parser
  108. {
  109.     public:
  110.         Parser_CPP() { preserve_case = 1; mask = MASK_CPP;}
  111.         virtual int next_token();
  112. };
  113.  
  114. class Parser_REXX:public Parser
  115. {
  116.     public:
  117.         Parser_REXX() { preserve_case = 0; mask = MASK_REXX;}
  118.         virtual int next_token();
  119. };
  120.  
  121. class Parser_PAS:public Parser
  122. {
  123.     public:
  124.         Parser_PAS() { preserve_case = 0; mask = MASK_PAS;}
  125.         virtual int next_token();
  126. };
  127.  
  128. class Parser_ASM:public Parser
  129. {
  130.     public:
  131.         Parser_ASM() { preserve_case = 0; mask = MASK_ASM;}
  132.         virtual int next_token();
  133. };
  134.  
  135. class Parser_MAKE:public Parser
  136. {
  137.     public:
  138.         Parser_MAKE() { preserve_case = 0; mask = MASK_MAKE;}
  139.         virtual int next_token();
  140. };
  141.  
  142. class Parser_PL:public Parser
  143. {
  144.     public:
  145.         Parser_PL() { preserve_case = 1; mask = MASK_PL;}
  146.         virtual int next_token();
  147. };
  148.  
  149. class Parser_HTML:public Parser
  150. {
  151.     public:
  152.         Parser_HTML() { preserve_case = 0; mask = MASK_HTML;}
  153.         virtual int next_token();
  154. };
  155.  
  156. class Parser_MAIL:public Parser
  157. {
  158.         char *line_start;
  159.     public:
  160.         Parser_MAIL():line_start(0) { preserve_case = 0; mask = MASK_MAIL;}
  161.         virtual int next_token();
  162.         virtual void reset(char *tok, int initial_state);
  163. };
  164.  
  165. #endif //__PARSER_H
  166.  
  167.