00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef Lex_H
00027 #define Lex_H
00028
00029 #include "Location.H"
00030 #include "ValExpr.H"
00031 #include <VestaSource.H>
00032 #include <iostream>
00033
00034
00035 extern Text fileName;
00036 extern ShortId shortId;
00037 extern int lineNumber;
00038 extern int charNumber;
00039
00040
00041
00042
00043 enum TokenClass
00044 { TkBinding, TkBool, TkDo, TkElse, TkErr, TkFalse, TkFiles,
00045 TkForeach, TkFrom, TkFunction, TkIf, TkIn, TkImport, TkInt,
00046 TkList, TkReturn, TkText, TkThen, TkTrue, TkType, TkValue,
00047
00048 TkId, TkNumber, TkString,
00049
00050 TkAnd, TkEqEq, TkNotEq, TkGreaterEq, TkImplies, TkLessEq, TkOr,
00051 TkPlusPlus,
00052
00053 TkBackSlash, TkBang, TkColon, TkComma, TkDollar, TkEqual, TkGreater,
00054 TkLess, TkMinus, TkPercent, TkPlus, TkQuery, TkSemicolon, TkSlash,
00055 TkStar, TkUnderscore,
00056
00057 TkLBrace, TkRBrace, TkLBracket, TkRBracket, TkLParen, TkRParen,
00058
00059 TkPragma,
00060
00061 TkEOF, TkIllegal };
00062
00063
00064 extern Text TokenNames[];
00065
00066 class Token {
00067 public:
00068 Token();
00069
00070 TokenClass tclass;
00071 Expr expr;
00072 SrcLoc *loc;
00073
00074 void Init(const Text& model, ShortId sid);
00075 void Next();
00076 void LexFlush();
00077
00078 void StartBytes() { length = 0; bytes[0] = 0; };
00079 void AppendChar(char c);
00080 void UnAppendChar() { length--; };
00081
00082 void EndBytes() { bytes[length] = 0; };
00083 char *Bytes() { return bytes; };
00084 Text AsText() { return Text(bytes); };
00085 int Length() { return length; };
00086
00087 void TokenAssign(Token& tk);
00088
00089 private:
00090 char *bytes;
00091 int bytesLength;
00092 int length;
00093
00094 void ScanIdNumber(char c);
00095 void ScanText();
00096 bool ScanPragma();
00097 void ScanComment(char c);
00098
00099 Token(const Token&);
00100 Token &operator=(const Token&);
00101 };
00102
00103 void LexInit();
00104
00105 #endif // Lex_H