上图是编译原理课件上的示例,我对前两行实在不解,遂改写为如下版本
#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。