Lexer.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef KLEE_EXPR_LEXER_H
00011 #define KLEE_EXPR_LEXER_H
00012
00013 #include <string>
00014
00015 namespace llvm {
00016 class MemoryBuffer;
00017 }
00018
00019 namespace klee {
00020 namespace expr {
00021 struct Token {
00022 enum Kind {
00023 At,
00024 Arrow,
00025 Colon,
00026 Comma,
00027 Comment,
00028 EndOfFile,
00029 Equals,
00030 Identifier,
00031 KWFalse,
00032 KWQuery,
00033 KWReserved,
00034 KWTrue,
00035 KWWidth,
00036 LBrace,
00037 LParen,
00038 LSquare,
00039 Number,
00040 RBrace,
00041 RParen,
00042 RSquare,
00043 Semicolon,
00044 Unknown
00045 };
00046
00047 Kind kind;
00048 const char *start;
00049 unsigned length;
00050 unsigned line;
00051 unsigned column;
00052
00053
00055 const char *getKindName() const;
00056
00059 std::string getString() const { return std::string(start, length); }
00060
00062 bool isKeyword() const {
00063 return kind >= KWFalse && kind <= KWTrue;
00064 }
00065
00066
00067 void dump();
00068 };
00069
00071 class Lexer {
00072 const char *BufferPos;
00073 const char *BufferEnd;
00074 unsigned LineNumber;
00075 unsigned ColumnNumber;
00076
00078 int GetNextChar();
00079
00083 int PeekNextChar();
00084
00087 Token &SetTokenKind(Token &Result, Token::Kind k);
00088
00092 Token &SetIdentifierTokenKind(Token &Result);
00093
00094 void SkipToEndOfLine();
00095
00097 Token &LexNumber(Token &Result);
00098
00100 Token &LexIdentifier(Token &Result);
00101
00102 public:
00103 explicit Lexer(const llvm::MemoryBuffer *_buf);
00104 ~Lexer();
00105
00109 Token &Lex(Token &Result);
00110 };
00111 }
00112 }
00113
00114 #endif