home *** CD-ROM | disk | FTP | other *** search
- #ifndef __CSCANNER__
- #define __CSCANNER__ 1
-
- /*
- ** CScanner.h
- */
-
- #ifndef __SYNTACTIC__
- #include "Syntactic.h"
- #endif
-
- #ifndef __STDIO__
- #include <stdio.h>
- #endif
-
- #ifndef __TYPES__
- #include <types.h>
- #endif
-
-
- #pragma segment CScanner
-
-
- /*
- ** Define the types of items returned by the scanner
- */
- //ƒ-
- enum {
- kSLex_EOF = kSLex
- , kSLex_Id = kSLex+256 // Identifier
- , kSLex_ParsedId // The "id" has been parsed.
- , kSLex_Value // Some other value: string, number, etc
-
- , kSLex_Op // Operators with minor types
- , kSLex_OpFirst = kSLex_Op
- , kSLex_OpAssign
- , kSLex_OpAssignMul
- , kSLex_OpAssignDiv
- , kSLex_OpAssignMod
- , kSLex_OpAssignAdd
- , kSLex_OpAssignSub
- , kSLex_OpAssignRSh
- , kSLex_OpAssignLSh
- , kSLex_OpAssignBAnd
- , kSLex_OpAssignBXor
- , kSLex_OpAssignBOr
- , kSLex_OpClassStar // "::*"
- , kSLex_OpQuestion
- , kSLex_OpLOr
- , kSLex_OpLAnd
- , kSLex_OpLNot
- , kSLex_OpBOr
- , kSLex_OpBXor
- , kSLex_OpBAnd
- , kSLex_OpBNot
- , kSLex_OpEQ
- , kSLex_OpNE
- , kSLex_OpLT
- , kSLex_OpGT
- , kSLex_OpLE
- , kSLex_OpGE
- , kSLex_OpLSh
- , kSLex_OpRSh
- , kSLex_OpAdd
- , kSLex_OpSub
- , kSLex_OpMul
- , kSLex_OpDiv
- , kSLex_OpMod
- , kSLex_OpDotStar
- , kSLex_OpPointerStar
- , kSLex_OpPlusPlus
- , kSLex_OpMinusMinus
- , kSLex_OpDot
- , kSLex_OpPointer
-
- , kSLex_OpLast // Beyond the end.
-
- , kSLex_LParen
- , kSLex_RParen
- , kSLex_LBrace
- , kSLex_RBrace
- , kSLex_LCurly
- , kSLex_RCurly
- , kSLex_Colon
- , kSLex_ClassColon // "::"
- , kSLex_SemiColon
- , kSLex_Comma
- , kSLex_Ellipsis // "..."
-
- , kSLex_Comment
- , kSLex_CommentFormatOff // Turn off formatting
- , kSLex_CommentFormatOn // Turn on formatting
- , kSLex_NewLine
- , kSLex_Null // Continuation line
-
- , kSLex_PoundLine
- , kSLex_PoundIf
- , kSLex_PoundElif
- , kSLex_PoundElse
- , kSLex_PoundEndIf
-
- , kSLex_ReservedWordFirst
- , kSLex_Break // "break", "return", and "goto"
- , kSLex_BreakBreak // Minor values when Type() == kSLex_Break
- , kSLex_BreakContinue
- , kSLex_BreakReturn
- , kSLex_BreakGoto
- , kSLex_Case
- , kSLex_Default
- , kSLex_Decl // Declaration word: long, unsigned, const, ...
- , kSLex_DeclConst // Minor type of special interest
- , kSLex_DeclVolatile
- , kSLex_DeclOperator // operators, "[]" and "()" allowed after this
- , kSLex_Do
- , kSLex_Else
- , kSLex_For
- , kSLex_If
- , kSLex_Struct // struct, union, enum, class, and template
- , kSLex_StructStruct
- , kSLex_StructUnion
- , kSLex_StructEnum
- , kSLex_StructClass
- , kSLex_StructTemplate
- , kSLex_Switch
- , kSLex_While
- , kSLex_Public // public, private, and protected
- , kSLex_PublicPublic
- , kSLex_PublicPrivate
- , kSLex_PublicProtected
-
- , kSLex_ReservedWordLast // The last reserved word
-
- , kSLex_Last // Last lexical token value
- //ƒ+
- };
-
-
-
- //µ class CScanner
- class CScanner : public SingleObject {
- public:
- short ICScanner();
-
- void ScanThis(const char *aBuffer, size_t length);
- // Scans the entire buffer of text, yielding a pile of tokens for
- // later use
-
-
- Syntactic *NextToken();
- /*
- ** Return the next token in the input stream. Returns an EOF token
- ** when no more tokens are available.
- */
-
- int NextChar();
- void PushBack();
- // Character eaters
-
-
- Boolean IsEOF() const;
-
-
- const unsigned char *Text() const;
- // Access to the buffer from outside the scanner proper
-
- size_t LineNumber() const;
- size_t CharPos() const;
- size_t TokenLength() const;
- /*
- ** Return the line number and character position of the most recently
- ** scanned token
- */
-
-
- private:
- const unsigned char *fBuffer;
- const unsigned char *fBufferEnd;
- const unsigned char *fBufferStart;
- const unsigned char *fLastTokenStart;
- };
-
-
- //µ CScanner::ScanThis
- #pragma segment CScanner
- inline void CScanner::ScanThis(const char *aBuffer, size_t length)
- {
- fBuffer = (const unsigned char *)aBuffer;
- fBufferEnd = fBuffer + length;
- fLastTokenStart = fBuffer;
- fBufferStart = fBuffer;
- }
-
-
- //µ CScanner::NextChar
- #pragma segment CScanner
- inline int CScanner::NextChar()
- {
- return ((fBuffer < fBufferEnd) ? *fBuffer++ : EOF);
- }
-
-
- //µ CScanner::PushBack
- #pragma segment CScanner
- inline void CScanner::PushBack()
- {
- --fBuffer;
- }
-
-
- //µ CScanner::IsEOF
- #pragma segment CScanner
- inline Boolean CScanner::IsEOF() const
- {
- return (fBuffer >= fBufferEnd);
- }
-
-
- //µ CScanner::Text
- #pragma segment CScanner
- inline const unsigned char *CScanner::Text() const
- {
- return (fLastTokenStart);
- }
-
-
- //µ CScanner::CharPos
- #pragma segment CScanner
- inline size_t CScanner::CharPos() const
- {
- return (fLastTokenStart - fBufferStart);
- }
-
-
- //µ CScanner::TokenLength
- #pragma segment CScanner
- inline size_t CScanner::TokenLength() const
- {
- return (fBuffer - fLastTokenStart);
- }
-
-
-
- #endif
-
-
-