| home | contents | previous | next page | send comment | send link | add bookmark |

scanner.h

/*
**  scanner.h
**
**  class declarations for a C/C++ lexical analyzer 
**
**  By: Stephen R. Schmitt
*/

#ifndef SCANNER_H
#define SCANNER_H

typedef enum
{
    COMMENT, ERR_TOKEN, END_OF_FILE,
    ASM, AUTO,
    BOOL, BREAK,
    CASE, CATCH, CHAR, CLASS, CONST, CONST_CAST, CONTINUE,
    DEFAULT, DELETE, DO, DOUBLE, DYNAMIC_CAST,
    ELSE, ENUM,  EXPLICIT, EXTERN,
    FALSE, FLOAT, FOR, FRIEND,
    GOTO,
    IF, INLINE, INT, INTERRUPT,
    LONG,
    MUTABLE, 
    NAMESPACE, NEW,
    OPERATOR,
    PRIVATE, PUBLIC, PROTECTED,
    REGISTER, REINTERPRET_CAST, RETURN,
    SHORT, SIGNED, SIZEOF, STATIC, STATIC_CAST, STRUCT, SWITCH,
    TEMPLATE, THIS, THROW, TRUE, TRY, TYPEDEF, TYPEID, TYPENAME,
    UNION, UNSIGNED, USING,
    VIRTUAL, VOID, VOLATILE,
    WHILE,
    ID_TOKEN, INT_TOKEN, HEX_TOKEN, OCT_TOKEN, REAL_TOKEN,
    CHR_TOKEN, STR_TOKEN,
    ASSIGN, ARROW, PERIOD, COMMA, COLON, COLON_COLON,
    SEMICOLON, QUESTION, DOUBLE_POUND,
    PLUS, MINUS, TIMES, DIV, MOD, INCR, DECR,
    PLUS_EQ, MINUS_EQ, TIMES_EQ, DIV_EQ, MOD_EQ,
    AND_BITS, OR_BITS, XOR_BITS, COMP_BITS,
    RT_SHIFT_BITS, LF_SHIFT_BITS,
    AND_EQ, OR_EQ, XOR_EQ, RT_SHIFT_EQ, LF_SHIFT_EQ,
    EQ, NE, GT, GE, LT, LE, AND, OR, NOT,
    RT_PAREN, LF_PAREN, RT_BRACKET, LF_BRACKET,
    RT_BRACE, LF_BRACE,
    PP_DEFINE,
    PP_ELIF, PP_ELSE, PP_ENDIF, PP_ERROR,
    PP_IF, PP_IFDEF, PP_IFNDEF, PP_INCLUDE,
    PP_PRAGMA,
    PP_SLASH,
    PP_UNDEF
}
TOKEN_CODE;

typedef struct
{
    char       *lxm;
    TOKEN_CODE  tkn;
}
LEX_TABLE;

class scanner
{
public:
    TOKEN_CODE  code;                   // current token
    TOKEN_CODE  previous;               // prior token
    int         on_line;                // source line of token
    char        lexeme[80];             // token string

    void get_token();
    void start( char *s ){ i_src = 0; line_count = 1; source = s; }

private:
    char *source;                       // text from source file
    long i_src;                         // current location in source
    char curr_ch;                       // current char in source text
    char next_ch;                       // next char in source text
    int  line_count;                    // current line in source
    long i_lex;                         // current location in token lexeme

    char advance();
    void get_word();
    void get_string();
    void get_character();
    void get_number();
    void get_preprocessor();
    void get_filename();
    void get_special();
    void get_special_eof();
    void get_special_eq();
    void get_special_colon();
    void get_special_not();
    void get_special_plus();
    void get_special_minus();
    void get_special_times();
    void get_special_div();
    void get_special_mod();
    void get_special_right();
    void get_special_left();
    void get_special_and();
    void get_special_or();
    void get_special_xor();
    void get_special_pound();
    void get_special_quote();
 
    TOKEN_CODE find( LEX_TABLE [], char *, int );
};

#endif

| home | contents | previous | next page | send comment | send link | add bookmark |

Copyright © 2004, Stephen R. Schmitt