home *** CD-ROM | disk | FTP | other *** search
/ BBS in a Box 3 / BBS in a box - Trilogy III.iso / Files / Prog / B-C / C++Source Code Fmtr Folder / Src / CScanner.h < prev    next >
Encoding:
C/C++ Source or Header  |  1992-04-27  |  4.5 KB  |  246 lines  |  [TEXT/MPS ]

  1. #ifndef __CSCANNER__
  2. #define __CSCANNER__    1
  3.  
  4. /*
  5. ** CScanner.h
  6. */
  7.  
  8. #ifndef __SYNTACTIC__
  9. #include "Syntactic.h"
  10. #endif
  11.  
  12. #ifndef __STDIO__
  13. #include <stdio.h>
  14. #endif
  15.  
  16. #ifndef __TYPES__
  17. #include <types.h>
  18. #endif
  19.  
  20.  
  21. #pragma segment CScanner
  22.  
  23.  
  24. /*
  25. ** Define the types of items returned by the scanner
  26. */
  27. //ƒ-
  28. enum {
  29.       kSLex_EOF        = kSLex
  30.     , kSLex_Id        = kSLex+256            // Identifier
  31.     , kSLex_ParsedId                    // The "id" has been parsed.
  32.     , kSLex_Value            // Some other value: string, number, etc
  33.  
  34.     , kSLex_Op                // Operators with minor types
  35.     , kSLex_OpFirst    = kSLex_Op
  36.     ,    kSLex_OpAssign
  37.     ,    kSLex_OpAssignMul
  38.     ,    kSLex_OpAssignDiv
  39.     ,    kSLex_OpAssignMod
  40.     ,    kSLex_OpAssignAdd
  41.     ,    kSLex_OpAssignSub
  42.     ,    kSLex_OpAssignRSh
  43.     ,    kSLex_OpAssignLSh
  44.     ,    kSLex_OpAssignBAnd
  45.     ,    kSLex_OpAssignBXor
  46.     ,    kSLex_OpAssignBOr
  47.     ,    kSLex_OpClassStar        // "::*"
  48.     ,    kSLex_OpQuestion
  49.     ,    kSLex_OpLOr
  50.     ,    kSLex_OpLAnd
  51.     ,    kSLex_OpLNot
  52.     ,    kSLex_OpBOr
  53.     ,    kSLex_OpBXor
  54.     ,    kSLex_OpBAnd
  55.     ,    kSLex_OpBNot
  56.     ,    kSLex_OpEQ
  57.     ,    kSLex_OpNE
  58.     ,    kSLex_OpLT
  59.     ,    kSLex_OpGT
  60.     ,    kSLex_OpLE
  61.     ,    kSLex_OpGE
  62.     ,    kSLex_OpLSh
  63.     ,    kSLex_OpRSh
  64.     ,    kSLex_OpAdd
  65.     ,    kSLex_OpSub
  66.     ,    kSLex_OpMul
  67.     ,    kSLex_OpDiv
  68.     ,    kSLex_OpMod
  69.     ,    kSLex_OpDotStar
  70.     ,    kSLex_OpPointerStar
  71.     ,    kSLex_OpPlusPlus
  72.     ,    kSLex_OpMinusMinus
  73.     ,    kSLex_OpDot
  74.     ,    kSLex_OpPointer
  75.  
  76.     , kSLex_OpLast            // Beyond the end.
  77.  
  78.     , kSLex_LParen
  79.     , kSLex_RParen
  80.     , kSLex_LBrace
  81.     , kSLex_RBrace
  82.     , kSLex_LCurly
  83.     , kSLex_RCurly
  84.     , kSLex_Colon
  85.     , kSLex_ClassColon        // "::"
  86.     , kSLex_SemiColon
  87.     , kSLex_Comma
  88.     , kSLex_Ellipsis        // "..."
  89.  
  90.     , kSLex_Comment
  91.     ,    kSLex_CommentFormatOff    // Turn off formatting
  92.     ,    kSLex_CommentFormatOn    // Turn on formatting
  93.     , kSLex_NewLine
  94.     , kSLex_Null            // Continuation line
  95.  
  96.     , kSLex_PoundLine
  97.     ,    kSLex_PoundIf
  98.     ,    kSLex_PoundElif
  99.     ,    kSLex_PoundElse
  100.     ,    kSLex_PoundEndIf
  101.  
  102.     , kSLex_ReservedWordFirst
  103.     , kSLex_Break            // "break", "return", and "goto"
  104.     ,    kSLex_BreakBreak        // Minor values when Type() == kSLex_Break
  105.     ,    kSLex_BreakContinue
  106.     ,    kSLex_BreakReturn
  107.     ,    kSLex_BreakGoto
  108.     , kSLex_Case
  109.     , kSLex_Default
  110.     , kSLex_Decl            // Declaration word: long, unsigned, const, ...
  111.     ,    kSLex_DeclConst            // Minor type of special interest
  112.     ,    kSLex_DeclVolatile
  113.     ,    kSLex_DeclOperator        // operators, "[]" and "()" allowed after this
  114.     , kSLex_Do
  115.     , kSLex_Else
  116.     , kSLex_For
  117.     , kSLex_If
  118.     , kSLex_Struct            // struct, union, enum, class, and template
  119.     ,    kSLex_StructStruct
  120.     ,    kSLex_StructUnion
  121.     ,    kSLex_StructEnum
  122.     ,    kSLex_StructClass
  123.     ,    kSLex_StructTemplate
  124.     , kSLex_Switch
  125.     , kSLex_While
  126.     , kSLex_Public            // public, private, and protected
  127.     ,    kSLex_PublicPublic
  128.     ,    kSLex_PublicPrivate
  129.     ,    kSLex_PublicProtected
  130.     
  131.     , kSLex_ReservedWordLast    // The last reserved word
  132.  
  133.     , kSLex_Last            // Last lexical token value
  134.     //ƒ+
  135. };
  136.  
  137.  
  138.  
  139. //µ class CScanner
  140. class CScanner : public SingleObject {
  141. public:
  142.     short ICScanner();
  143.  
  144.     void ScanThis(const char *aBuffer, size_t length);
  145.     // Scans the entire buffer of text, yielding a pile of tokens for
  146.     // later use
  147.  
  148.  
  149.     Syntactic *NextToken();
  150.     /*
  151.     ** Return the next token in the input stream.  Returns an EOF token
  152.     ** when no more tokens are available.
  153.     */
  154.  
  155.     int NextChar();
  156.     void PushBack();
  157.     // Character eaters
  158.  
  159.  
  160.     Boolean IsEOF() const;
  161.  
  162.  
  163.     const unsigned char *Text() const;
  164.     // Access to the buffer from outside the scanner proper
  165.  
  166.     size_t LineNumber() const;
  167.     size_t CharPos() const;
  168.     size_t TokenLength() const;
  169.     /*
  170.     ** Return the line number and character position of the most recently
  171.     ** scanned token
  172.     */
  173.  
  174.  
  175. private:
  176.     const unsigned char *fBuffer;
  177.     const unsigned char *fBufferEnd;
  178.     const unsigned char *fBufferStart;
  179.     const unsigned char *fLastTokenStart;
  180. };
  181.  
  182.  
  183. //µ   CScanner::ScanThis
  184. #pragma segment CScanner
  185. inline void CScanner::ScanThis(const char *aBuffer, size_t length)
  186. {
  187.     fBuffer = (const unsigned char *)aBuffer;
  188.     fBufferEnd = fBuffer + length;
  189.     fLastTokenStart = fBuffer;
  190.     fBufferStart = fBuffer;
  191. }
  192.  
  193.  
  194. //µ   CScanner::NextChar
  195. #pragma segment CScanner
  196. inline int CScanner::NextChar()
  197. {
  198.     return ((fBuffer < fBufferEnd) ? *fBuffer++ : EOF);
  199. }
  200.  
  201.  
  202. //µ   CScanner::PushBack
  203. #pragma segment CScanner
  204. inline void CScanner::PushBack()
  205. {
  206.     --fBuffer;
  207. }
  208.  
  209.  
  210. //µ   CScanner::IsEOF
  211. #pragma segment CScanner
  212. inline Boolean CScanner::IsEOF() const
  213. {
  214.     return (fBuffer >= fBufferEnd);
  215. }
  216.  
  217.  
  218. //µ   CScanner::Text
  219. #pragma segment CScanner
  220. inline const unsigned char *CScanner::Text() const
  221. {
  222.     return (fLastTokenStart);
  223. }
  224.  
  225.  
  226. //µ   CScanner::CharPos
  227. #pragma segment CScanner
  228. inline size_t CScanner::CharPos() const
  229. {
  230.     return (fLastTokenStart - fBufferStart);
  231. }
  232.  
  233.  
  234. //µ   CScanner::TokenLength
  235. #pragma segment CScanner
  236. inline size_t CScanner::TokenLength() const
  237. {
  238.     return (fBuffer - fLastTokenStart);
  239. }
  240.  
  241.  
  242.  
  243. #endif
  244.  
  245.  
  246.