Pascal 词法分析器 简易实现

    科技2025-09-03  18

    全局变量和过程: ch 字符变量,存放最新读入的源程序字符

    strToken 字符数组,存放构成单词符号的字符串

    GetChar 子程序过程,把下一个字符读入到ch中

    GetBC 子程序过程,跳过空白符,直至ch中读到非空白符

    Concat 子程序,把ch中的字符连接到strToken

    IsLetter和IsDigit 布尔函数,判断ch中字符是否为字母和数字

    Reverse 整型函数,对于strToken中的字符串查找保留字表,若它是保留字则给出它的编码,否则回送0

    Retract 子程序,把搜索指针回调一个字符位置

    InsertId 整型函数,将strToken中的标识符插入符号表,返回符号表指针

    InsertConst 整型函数过程,将strToken中的常数插入常数表,返回常数表指针

    各种单词符号对应的种别编码

    单词符号种别编码单词符号种别编码program1;17const2,18var3=19procedure4<>20begin5<21end6<=22if7>23then8>=24else9+25while10-26do11*27call12/28read13(29write14)30odd15id31:=16integer32

    代码节选

    void Analysis(int &code) { for (int i = 0; i < 20; i++) strToken[i] = '\0'; GetChar(); row++; GetBC(); if (IsLetter()) { while (IsLetter() || IsDigit()) { Concat(); GetChar(); row++; } Retract(); row--; code = Reverse(); } else if (IsDigit()) { while (IsDigit()) { Concat(); GetChar(); row++; } Retract(); row--; code = 32; } else if (ch == ':') { Concat(); GetChar(); row++; if (ch == '=') { Concat(); code = 16; } else { Retract(); row--; code = 0; } } else if (ch == ';') { Concat(); code = 17; } else if (ch == ',') { Concat(); code = 18; } else if (ch == '=') { Concat(); code = 19; } else if (ch == '<>') { Concat(); code = 20; } else if (ch == '<') { Concat(); code = 21; } else if (ch == '<=') { Concat(); code = 22; } else if (ch == '>') { Concat(); code = 23; } else if (ch == '>=') { Concat(); code = 24; } else if (ch == '+') { Concat(); code = 25; } else if (ch == '-') { Concat(); code = 26; } else if (ch == '*') { Concat(); code = 27; } else if (ch == '/') { Concat(); code = 28; } else if (ch == '(') { Concat(); code = 29; } else if (ch == ')') { Concat(); code = 30; } else if (ch == '\n' || ch == '\0') { line++; row = 0; code = -1; } else code = 0; sp = -1; }
    Processed: 0.016, SQL: 8