📄 lex.h
字号:
/*
* file: lex.h
* func: The source file of lexical parser.
*/
#if _MSC_VER >1200 /* msvc6 or later */
#pragma once
#endif
#ifndef __LEX_H_
#define __LEX_H_
#include <string>
#include <fstream>
#include "cmd.h"
#include "types.h"
using std::string;
using std::ifstream;
#define MAXTOKENLEN 57
#define MAXDIGITLEN 7
class Lex
{
public: // data
enum tokentype{ENDOFFILE=-1,END=0,ID=257,ASC,NUM,
LEFT,RIGHT,NONASSOC,TYPE,TOKEN,START,UNION,PREC,
EXCEPT,PURE_PARSER,ERROR,
MARK,LCURL,RCURL,DLDL,DLS};
uint32 lineno; //当前正处理行号
uint32 nerror; //error count;
string strval; //当前识别出的符号的字符串值
sint32 numval; //当前识别出的符号的数值值.
// 调用 unlex() 时用于暂存当前值.
string unstrval;
sint32 untoken;
sint32 unnumval;
Bool ungetflag;
ifstream pf; //当前正在扫描处理的源文件(ParseFile).
string pfname; //源文件名(ParseFileName)
sint32 la; //向前查看符号(lookahead)
public: // function
/// 得到源文件名称.
Lex(const string &ifname);
/// 词法扫描器主程序,返回识别出的记号标识.
sint32 lex();
inline
sint32 gettoken()
{
return (la=lex());
}
inline
Void ungettoken()
{
ungetflag=True;
untoken=la;
unstrval=strval;
unnumval=numval;
}
/// 清除无用的 /* ... */ 注释及空格,制表符等信息,返回下一个有效字符.
sint32 eatup_white_comment();
string read_Identifier();
sint32 eatup_string();
private: // data
enum errortype{UNKNOWN,UNTERMINATED_COMMENT,UNTERMINATED_STRING,
OUT_OF_RANGE,MUST_KEYWORD,LITERAL_ERROR,ESCAPE_ERROR,
LACK_QUOTE,PERCENT_ERROR,UNKNOWN_LITERAL};
string errorstring;
private: // function
/// 显示who所代表的错误信息.
Void showErr(errortype who);
};
#endif//__LEX_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -