编译原理 | 直接编码的词法分析器

ICS · 25 天前 · 78 人浏览

2025-03-24T08:29:37.png

上图是编译原理课件上的示例,我对前两行实在不解,遂改写为如下版本

#include <bits/stdc++.h>
using namespace std;

int main() {
    char buf[] = "bababb#";
    char* ptr = buf;
    
    while (*ptr != '#') {
        l0: 
        // while (*ptr == 'b') ptr++;  // state 0
        switch (*ptr) {
            case 'a': ptr++; goto l1;
            case 'b': ptr++; goto l0;
        l1: 
            // while (*ptr == 'a') ptr++;  // state 1
            switch (*ptr) {
            case 'a': ptr++; goto l1;
            case 'b': ptr++;
                switch (*ptr) {  // state 2
                    case 'a': goto l1;
                    case 'b': ptr++;
                        switch (*ptr) {  // state3
                            case 'a': goto l1;
                            case 'b': goto l0;
                            case '#': cout << "yes" << endl;
                                return 0;
                            default: break;
                        }
                        default: break;
                }
                default: break;
            }
        default: break;  // 遇到非法字符
        }
    }
    cout << "no" << endl;
}  // 看实例运行

我认为,编写这种自动机识别程序时,每碰到一个状态,就写一个switch,每个switch最好都标记一个记号,每个case 之后最好加上goto。

compile
Theme Jasmine by Kent Liao