正则表达式模式检查器(无法弄清楚我的代码出了什么问题)

我还要为大学做额外的功课。该任务是一台有限机器,可以检查行是否与正则表达式匹配。我在大学的服务器上测试了我的代码,这引发了以下问题,我的代码给出了不必要的输出。我找不到此问题的来源。

我的正则表达式是:^ [^#]-?(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;
}