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

📄 lex.cpp

📁 简单的pascal词法分析器
💻 CPP
字号:
#include <iostream>
#include <fstream>
#include <cctype>
#include <string>
#include <vector>
#include "lex.h"

using namespace std;

int iskey(const string);
vector<NODE>::size_type find_table(const string);

vector<NODE> id_table;
string strbuf;
size_t line = 1;

int token(std::ifstream & in, TOKE & toke)
{
    int ch;
    bool state = true;
    string str;

    while (state)
    {
        state = false;
        ch = in.get();

        if (ch == EOF)
        {
            toke.num = -1;
            //toke.pos = -1;
            toke.line = line;
            return 0;
        }
        else if (isalpha(ch) || ch == '_')
        {
            str.append(1 , tolower(ch));
            while (true)
            {
                if ((ch = in.get()) != EOF)
                {
                    if (isalnum(ch)  || ch == '_')
                        str.append(1 , tolower(ch));
                    else
                    {
                        in.unget();
                        break;
                    }
                }
                else
                    break;
            }
            int n = iskey(str);
            if (n != 0)
            {
                toke.num = n;
                //toke.pos = -1;
                toke.line = line;
            }
            else
            {
                toke.num = ID;
                toke.pos = find_table(str);
                toke.line = line;
            }
        }
        else if (isdigit(ch))
        {
            str.append(1 , ch);
            while (true)
            {
                if ((ch = in.get()) != EOF)
                {
                    if (isdigit(ch))
                        str.append(1 , ch);
                    else
                    {
                        in.unget();
                        break;
                    }
                }
                else
                    break;
            }
            toke.num = INT;
            toke.pos = find_table(str);
            toke.line = line;
        }
        else if (ch == '<')
        {
            ch = in.get();
            if (ch == '=')
            {
                toke.num = LE;
                //toke.pos = -1;
                toke.line = line;
            }
            else if (ch == '>')
            {
                toke.num = NE;
                //toke.pos = -1;
                toke.line = line;
            }
            else
            {
                toke.num = LT;
                //toke.pos = -1;
                toke.line = line;
                in.unget();
            }
        }
        else if (ch == '=')
        {
            toke.num = EQ;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == '>')
        {
            if (( ch = in.get()) == '=')
            {
                toke.num = GE;
                //toke.pos = -1;
                toke.line = line;
            }
            else
            {
                toke.num = GT;
                //toke.pos = -1;
                toke.line = line;
                in.unget();
            }
        }
        else if (ch == ':')
        {
            if ((ch = in.get()) == '=')
            {
                toke.num = EVALUATE;
                //toke.pos = -1;
                toke.line = line;
            }
            else
            {
                toke.num = CLN;
                //toke.pos = -1;
                toke.line = line;
                in.unget();
            }
        }
        else if (ch == '+')
        {
            toke.num = ADD;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == '-')
        {
            toke.num = SUB;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == '*')
        {
            toke.num = MUL;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == '/')
        {
            if ((ch = in.get()) == '/')
            {
                while ((ch = in.get()) != '\n')
                {
                    if (ch == EOF )
                        return 0;
                }
                state = true;
                ++line;
            }
            else
            {
                toke.num = DIV;
                //toke.pos = -1;
                toke.line = line;
                in.unget();
            }
        }
        else if (ch == ',')
        {
            toke.num = COMMA;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == ';')
        {
            toke.num = SEMICOLON;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == '.')
        {
            if ((ch = in.get()) == '.')
            {
                toke.num = SPOINTS;
                //toke.pos = -1;
                toke.line = line;
            }
            else
            {
                toke.num = PERIOD;
                //toke.pos = -1;
                toke.line = line;
                in.unget();
            }
        }
        else if (ch == '(')
        {
            toke.num = LBRACE;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == ')')
        {
            toke.num = RBRACE;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == '[')
        {
            toke.num = LBRACKTE;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == ']')
        {
            toke.num = RBRACKTE;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == '\'')
        {
            toke.num = SQUOTES;
            //toke.pos = -1;
            toke.line = line;
            while (true)
            {
                ch = in.get();
                if (ch == '\\')
                {
                    str.append(1 , ch);
                    str.append(1 , in.get());
                }
                else if (ch == '\'')
                    break;
                else if (ch == '\n')
                {
                    toke.num = 2; //2 字符串缺少单引号
                    //toke.pos = -1;
                    toke.line = line;
                    ++line;
                    return -1;
                }
                else
                    str.append(1 , ch);
            }
        }
        else if (ch == '^')
        {
            toke.num = POINTER;
            //toke.pos = -1;
            toke.line = line;
        }
        else if (ch == '{')
        {
            while ((ch = in.get()) != '}')
            {
                if (ch == EOF )
                {
                    toke.num = 3; //3  注释缺少右括号
                    //toke.pos = -1;
                    toke.line = line;
                    return -1;
                }
                else if (ch == '\n')
                    ++line;
            }
            state = true;
        }
        else if (isspace(ch))
        {
            if (ch == '\n')
                ++line;
            state = true;
        }
        else
        {
            toke.num = 1; // 闈炴硶瀛楃

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -