Форум программистов, компьютерный форум CyberForum.ru

Лексический анализ строки. Помочь переделать под автомат - C++

Восстановить пароль Регистрация
 
Валентин^_^
10 / 10 / 2
Регистрация: 15.10.2009
Сообщений: 119
16.10.2012, 21:50     Лексический анализ строки. Помочь переделать под автомат #1
Добрый вечер!

Помогите плиз написать лексический анализатор строки. Сделать автомат... используя матрицу переходов, некий двумерный массив.

Условия для поиска подстрок:
Нечетное кол-во 1 между 0
Четное кол-во 0 между 1
Две 11 подряд

Написал (код ниже) как должно примерно выглядеть. Тупо прошелся по строке, выводя лексемы.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <clocale>
#include <iostream>
 
using namespace std;
 
char *parse(char *str_input, unsigned int &i, char *leksema_output);
 
int main()
{
    setlocale(LC_ALL, "russian");
 
    const int N = 100;
 
    unsigned int i = 0;
    char in_str[N];
    char *leksema = NULL;
 
    cout << "Введите строку из 0 и 1. Длина строки не должна превышать " << N << " символов.\nМожно прекратить ввод строки посредством ввода символа +." << endl;
 
    int j = 0;
    do
    {
        cin >> in_str[j];
        if( in_str[j] == '+' )
        {
            in_str[j] = '\0';
            break;
        }
        j++;
    }
    while( j < N);
 
    cout << endl << "Исходная строка: " << in_str << endl;
 
    cout << endl << "Результат лексического анализа строки: " << endl;
    while(leksema = parse(in_str, i, leksema))
    {
        cout << leksema << endl;
        delete [] leksema;
    }
 
    cout << endl;
    system("PAUSE");
    return 0;
}
 
char *parse(char *str_input, unsigned int &i, char *leksema_output)
{
    int cnt;
    if( str_input[i] == '1' )
    {
        i++;
        {
            while( str_input[i] == '0' && str_input[i] != '\0' )
            {
                cnt++;
                i++;
            }
            if( cnt % 2 == 0 && str_input[i] == '1' )
            {
                leksema_output = new char[3];
                leksema_output[0] = 'A';
                if(cnt == 0) leksema_output[1] = '0';
                else if(cnt == 2) leksema_output[1] = '2';
                else if(cnt == 4) leksema_output[1] = '4';
                else if(cnt == 6) leksema_output[1] = '6';
                else if(cnt == 8) leksema_output[1] = '8';
                else leksema_output[1] = '+';
                leksema_output[2] = '\0';
                i++;
                return leksema_output;
            }
            else
            {
                leksema_output = new char[3];
                leksema_output[0] = 'E';
                leksema_output[1] = 'R';
                leksema_output[2] = '\0';
                return leksema_output;
            }
        }
    }
    else if( str_input[i] == '0' )
    {
        i++;
        {
            while( str_input[i] == '1' && str_input[i] != '\0' )
            {
                cnt++;
                i++;
            }
            if( cnt % 2 == 1 && str_input[i] == '0' )
            {
                leksema_output = new char[3];
                leksema_output[0] = 'B';
                if(cnt == 1) leksema_output[1] = '1';
                else if(cnt == 3) leksema_output[1] = '3';
                else if(cnt == 5) leksema_output[1] = '5';
                else if(cnt == 7) leksema_output[1] = '7';
                else if(cnt == 9) leksema_output[1] = '9';
                else leksema_output[1] = '+';
                leksema_output[2] = '\0';
                i++;
                return leksema_output;
            }
            else
            {
                leksema_output = new char[3];
                leksema_output[0] = 'E';
                leksema_output[1] = 'R';
                leksema_output[2] = '\0';
                return leksema_output;
            }
        }
    }
    else if( str_input[i] != '\0' && str_input[i + 1] != '\0' )
    {
        i++;
        leksema_output = new char[3];
        leksema_output[0] = 'E';
        leksema_output[1] = 'R';
        leksema_output[2] = '\0';
        return leksema_output;
    }
}
Пример строки: 010100111
На выходе лексемы: B1, A2, A0 соответствуют подстрокам 010, 1001, 11

А вот с автоматом затык.. никак не составить матрицу переходов.

Добавлено через 22 часа 45 минут
АП

ну так что, народ, поможете?)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2012, 21:50     Лексический анализ строки. Помочь переделать под автомат
Посмотрите здесь:

C++ СТРОКИ! поиск и вывод файла. Помочь оптимизировать...
лексический анализ..... C++
C++ лексический анализ
C++ лексический анализ дубль 2
Лексический и синтаксический анализ текста C++
C++ Лексический и синтаксический анализ текста
C++ Лексический анализ. Таблицы идентификаторов
C++ Провести лексический анализ заданного фрагмента и составить кодировочную таблицу

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 11:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru