⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lex.h

📁 编译原理中的First集与 Follow集生成程序
💻 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 + -