我还要为大学做额外的功课。该任务是一台有限机器,可以检查行是否与正则表达式匹配。我在大学的服务器上测试了我的代码,这引发了以下问题,我的代码给出了不必要的输出。我找不到此问题的来源。
我的正则表达式是:^ [^#]-?(0x)* [0-9] + V6。+ [a-z] +。+ mmese(B | a) 这是我的代码:
#include <iostream>
#include <cstring>
using namespace std;
enum states {s0, nhash, tie, null, nullx, numq, num, V, V6, all, abc, all2, mmese};
bool isnum(char c){
string numbers("123456789");
for(int i = 0; i < 9; i++){
if(numbers[i] == c) return true;
}return false;
}
bool islet(char c){
string abc("abcdefghijklmnopqrstuvwxyz");
for(int i = 0; i < 26; i++){
if(abc[i] == c) return true;
}return false;
}
bool itsamatch(const char *line, int size) {
int n = size;
int i = 0;
states state = s0;
while(i != n) {
switch(state) {
case s0:
if(line[i] != '#'){
//cout << line[i];
state = nhash;
i++;
}else return false;
break;
case nhash:
if(line[i] == '-' || isnum(line[i])){
//cout << line[i];
state = tie;
i++;
}else if(line[i] == '0'){
//cout << line[i];
state = null;
i++;
}else if(isnum(line[i])){
state = num;
i++;
}else return false;
break;
case tie:
if(line[i] == '0'){
//cout << line[i];
state = null;
i++;
} else return false;
break;
case null:
if(line[i] == 'x') {
//cout << line[i];
state = nullx;
i++;
}else if(isnum(line[i])) {
//cout << line[i];
state = num;
i++;
}else return false;
break;
case nullx:
if(line[i] == '0') {
//cout << line[i];
state = numq;
i++;
}else if(isnum(line[i])) {
//cout << line[i];
state = num;
i++;
}else return false;
break;
case numq:
if(isnum(line[i])){
//cout << line[i];
state = num;
i++;
} else if(line[i] == 'x'){
//cout << line[i];
state = nullx;
i++;
}else return false;
break;
case num:
if(isnum(line[i]) || line[i] == '0'){
//cout << line[i];
state = num;
i++;
}else if(line[i] == 'V'){
//cout << line[i];
state = V;
i++;
}else return false;
break;
case V:
if(line[i] == '6'){
//cout << line[i];
state = V6;
i++;
}else return false;
break;
case V6:
if(line[i] == '\\' && line[i+1] == 'n' ) return false;
else{
//cout << line[i];
state = all;
i++;
}break;
case all:
if(islet(line[i])){
//cout << line[i];
state = abc;
i++;
}else{
//cout << line[i];
state = all;
i++;
}break;
case abc:
if(islet(line[i]) || !islet(line[i])){
if(line[i] == '\\' && line[i+1] == 'n') return false;
//cout << line[i];
state = all2;
i++;
}else if(line[i-1] == 'm' && line[i] == 'm' && line[i+1] == 'm' && line[i+2] == 'e' && line[i+3] == 's' && line[i+4] == 'e'){
//cout << line[i] << line[i+1] << line[i+2] << line[i+3] << line[i+4];
state = mmese;
i+=5;
}else return false;
break;
case all2:
if(line[i] == 'm' && line[i+1] == 'm' && line[i+2] == 'e' && line[i+3] == 's' && line[i+4] == 'e'){
//cout << line[i] << line[i+1] << line[i+2] << line[i+3] << line[i+4];
state = mmese;
i+=5;
}else{
//cout << line[i];
state = all2;
i++;
}break;
case mmese:
//cout << line[i];
return line[i] == 'a' || line[i] == 'B';
}
}
return false;
}
int main() {
int matched = 0;
int rows = 0;
string str;
while (getline(cin, str)){
const char *line = str.c_str();
int length = strlen(line);
rows++;
if(itsamatch(line, length))
matched++;
}
cout << oct << rows << '/' << oct << matched << endl;
return 0;
}