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

Построить распознаватель языка с помощью стека - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Страуструп, и траблы в среде программирования http://www.cyberforum.ru/cpp-beginners/thread649642.html
Всем добрых суток! Я начал изучение где-то 3 дня назад, 3 дня от компьютера не отхожу ,читаю, делаю записи в тетради. Мне это очень интересно, у меня много энтузиазма, поэтому не могу не задать тупой вопрос, на форуме мастеров. Начал читать - "C++ для чайников" - сразу понял ,что не мое, и старая литература. , потом "Дейтел - Как программировать на C++" - очень понравилось, 2 дня читал,...
C++ Что такое компилятор? и т.д Всем привет, может быть пост не в тему! Но очень хотелось бы знать, что такое компилятор, и как он работает, подробней узнать. Спасибо за ответ P.S я новичок :) http://www.cyberforum.ru/cpp-beginners/thread649634.html
Вычислить значение выражения, найти сумму ряда C++
ребята! до завтра решите задачу. пожалуйста. я ноль в программировании а)x = arccos(\sqrt{\beta }y - a) б)S = 4 + \sum_{i=1}^{50}{i}^{2} Добавлено через 2 часа 13 минут с этой тоже помогите пожалуйста
Составить алгоритм определения последовательности номеров удаляемых спортсменов C++
ребята! до завтра ришите задачу. пожалуйста. я ноль в программировании по кругу стоят N спортсменов с номерами от 1 до N. начиная с кокого-то человека,по кругу удаляется каждый k-ый спортсмен. после каждого удаления круг смыкается. составить алгоритм определения последовательности номеров удаляемых спортсменов.
C++ По введенному значению аргумента вычислить значение функции, заданной в виде графика http://www.cyberforum.ru/cpp-beginners/thread649609.html
Задание 1. Написать программу, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика. Параметр R вводится с клавиатуры. Задание 2. Вычислить и вывести на экран в виде таблицы значения функции, заданной графически ( см. задание 1 ), на интервале от xнач до xкон с шагом dx. Интервал и шаг задать таким образом, чтобы проверить все ветви программы. Таблицу...
C++ Что такое globalFix? Задача: ввести с клавиатуры строку символов, удалить из нее все гласные буквы, используя функции. Ниже приведено решение (не мое, взял у доброго человека), но мой компилятор (DevC++) спотыкается на строке if (i == (id - globalFix)) { , сообщение компилятора: `globalFix' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it... подробнее

Показать сообщение отдельно
accept
4837 / 3236 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.09.2012, 10:21     Построить распознаватель языка с помощью стека
попробовал префиксное решение - получается больше десяти строк (всякие просмотры стека, ещё проверки "а хватает ли в нём элементов для просмотра")

может, действительно, надо переводить в постфиксную запись

Добавлено через 5 часов 20 минут
длинная форма
C
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
#include <stdio.h>
 
int f(const char *p);
 
int main(void)
{
    const char *arr[] = {
        "A",
        "sA",
        "+AB",
        "*sA+sBsC",
        "AB",
        "s",
        "+A",
        "*sA+sB"
    };
    int i;
    
    for (i = 0; i < sizeof arr / sizeof arr[0]; i++)
        printf("%s %d\n", arr[i], f(arr[i]));
    return 0;
}
 
#include <string.h>
#include <ctype.h>
 
void push(int c);
int pop(void);
void clear(void);
int peek(int n);
int ssize(void);
 
/* 
  терминалы:
    A...Z    - переменная
    s        - операция корень (одноместная)
    + - * /  - одна из операций (двухместная)
  нетерминалы:
    '+'      - двухместная операция
    's'      - одноместная операция
    'A'      - операнд
 */
 
int f(const char *p)
{
    enum {
        START, /* начало/стек пуст */
        ANYOP, /* в стеке любая операция (одно- или двух-) */
        OP2A,  /* в стеке двухместная операция и операнд */
        A,     /* в стеке один операнд */
        END    /* выход при ошибке */
    } state;
    int c;
 
    clear();
    state = START;
    while ((c = *p) != '\0'
        && (state == START || state == ANYOP || state == OP2A)) {
        if (strchr("+-*/", c))
            push('+');
        else if (c == 's')
            push('s');
        else if (isupper(c))
            push('A');
        else
            state = END;
        if (state != END) {
            if (peek(1) == 'A') {
                while ((ssize() > 1 && peek(2) == 's')
                    || (ssize() > 2 && peek(2) == 'A' && peek(3) == '+')) {
                    if (peek(2) == 's') {
                        pop();
                        pop();
                        push('A');
                    } else {
                        pop();
                        pop();
                        pop();
                        push('A');
                    }
                }
            }
            if (peek(1) == '+' || peek(1) == 's')
                state = ANYOP;
            else if (peek(1) == 'A') {
                if (ssize() > 1 && peek(2) == '+')
                    state = OP2A;
                else
                    state = A;
            }
        }
        p++;
    }
    return c == '\0' && pop() == 'A' && ssize() == 0;
}
 
char stack[1000];
int spos = 0;
 
void push(int c)
{
    stack[spos++] = c;
}
 
int pop(void)
{
    return stack[--spos];
}
 
void clear(void)
{
    spos = 0;
}
 
int peek(int n)
{
    return stack[spos - n];
}
 
int ssize(void)
{
    return spos;
}
Код
[guest@localhost c]$ .ansi s.c -o s
[guest@localhost c]$ ./s
A 1
sA 1
+AB 1
*sA+sBsC 1
AB 0
s 0
+A 0
*sA+sB 0
[guest@localhost c]$
 
Текущее время: 19:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru