Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.10.2018, 11:09   #1
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
По умолчанию синтаксический анализатор на си

здравствуйте!
у меня такая задача: нужно составить синтаксический анализатор на си.
вот условие:
Вывести значение логического выражения, заданного в виде строки S. Выражение определяется следующим образом ("T" - True, "F" - False):
<выражение> ::= T | F | And(<операнды>) | Or(<операнды>) | Not(<выражение>)
<операнды> ::= <выражение> | <выражение>,<операнды>

я вообще не понимаю, что мне надо сделать. подкиньте идейку хотя бы, что это, как это, и с чем его едят, и пните в правильном направлении, пожалуйста. буду благодарен
Алексей9912 вне форума Ответить с цитированием
Старый 01.10.2018, 11:15   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Так все ж написано, что надо сделать. Если не знаете, что такое синтаксический анализатор, то хоть в вики сходите. Какое слово в задании вам не понятно?
p51x вне форума Ответить с цитированием
Старый 01.10.2018, 12:34   #3
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
По умолчанию

например, непонятно, что это за вертикальные линии.
и если операнды могут содержать выражение, то всё выражение получается "бесконечным"?
мне кажется, я задаю слишком тупые вопросы, но приведите, пожалуйста, хоть пример такого выражения
Алексей9912 вне форума Ответить с цитированием
Старый 01.10.2018, 12:44   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от Алексей9912 Посмотреть сообщение
например, непонятно, что это за вертикальные линии.
А что вертикальная линия делает в Си? А если чуть голову включить: "выражение это истина ЧТО_ТО_НЕПОНЯТНОЕ ложь"... Что же вместо ЧТО_ТО_НЕПОНЯТНОЕ вставить?..

https://en.wikipedia.org/wiki/Backus%E2%80%93Naur_form

Цитата:
Сообщение от Алексей9912 Посмотреть сообщение
и если операнды могут содержать выражение, то всё выражение получается "бесконечным"?
5 + (4 - 1) тоже операнд содержит выражение. Оно бесконечное?
p51x вне форума Ответить с цитированием
Старый 01.10.2018, 13:01   #5
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
По умолчанию

то есть выражение для анализа может выглядеть в пяти ипостасях?
T
F
And(x-y= 0)
Or(x-y= 0)
Not(х-у= 0)

допустим так. я все правильно понимаю?
Алексей9912 вне форума Ответить с цитированием
Старый 01.10.2018, 13:07   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Не совсем. Вы вики прочитали? С T, F все просто, а дальше And(<операнды>) = And(выражение, выражение) и т.д. Формально, Not(Or(And(T, F), Or(Not(F), And(T, F)))) вполне себе выражение.

Последний раз редактировалось p51x; 01.10.2018 в 13:18.
p51x вне форума Ответить с цитированием
Старый 01.10.2018, 13:15   #7
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
По умолчанию

спасибо за помощь
Алексей9912 вне форума Ответить с цитированием
Старый 22.10.2018, 12:32   #8
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
Вопрос

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int check(char c, char che[]);
char* is_par(char* c);
char* is_enum(char* c);
void is_log(char* c);


int main()
{
    char* c = (char*)malloc(100 * sizeof(char));
    fgets(c, 100, stdin);
    is_log(c);
    return 0;
}


int check(char c, char che[]) {
    int l = strlen(che);
    int n = 0;
    for (int i = 0; i < l; i++) {
        if (c == che[i]) {
            n++;
            break;
        }
    }
    return n;
}  /*проверка вхождения символа в массив*/

char* is_par(char* c) {
    int par = 0;
    if (*(c + 1) == '(') {
            par++;
            c += 2;
            is_enum(c);
        }
    if (*(c + 1) == ')') par--;
    c += 2;
    return c;
} /*проверка и подсчет скобок*/

char* is_enum(char* c) {
    while (isalnum(*c)) c++;
    char operations[] = "+-/*%", comp[] = "<>=!";
    if ((check(*c, operations)) || ((check(*c, comp) && *(c + 1) == '='))) {
            is_par(c);
            printf("Expressions arranged correctly");
    }
    is_log(c);
    return c;
} /*проверка выражений*/


void is_log(char* c) {
    if (check(*c, "TtFf")) {
        printf("Expression arranged correctly");
    } else if (check(*c, "Aa") && check(*(c + 1), "Nn") && check(*(c + 2), "Dd")) {
        c += 3;
        is_enum(c);
    } else if (check(*c, "Nn") && check(*(c + 1), "Oo") && check(*(c + 2), "Tt")) {
        c += 3;
        is_enum(c);
    } else if (check(*c, "Oo") && check(*(c + 1), "Rr")) {
        c += 2;
        is_enum(c);
    }
    return;
}
вот я написал код этого анализатора. программа не работает абсолютно. если только на самом начальном этапе. подскажите, пожалуйста, что тут неправильно?
Алексей9912 вне форума Ответить с цитированием
Старый 22.10.2018, 12:51   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Так какая переменная дает ответ на задание? Где результат то?

А по коду куча вопросов... Например, вы отдаете в is_enum следующий за AND|OR|NOT символ - он же скобка и вы его просто пропускаете, т.е. выражение And))(())(* вполне пройдет.
p51x вне форума Ответить с цитированием
Старый 22.10.2018, 13:06   #10
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
По умолчанию

в случае с T и F ответ выводится сразу же через printf. в остальных случаях... действительно, какого-то четкого ответа нет. я понимаю, что к моему коду много вопросов, но это все, на что моих мозгов хватило. подкиньте, пожалуйста, идейку в правильном направлении. было бы прекрасно, если бы подкинули еще и правильную функцию. хотя бы одну из
Алексей9912 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтаксический анализатор Battori JavaScript, Ajax 3 15.03.2018 10:57
Синтаксический анализатор Arturko Помощь студентам 62 14.06.2012 18:54
синтаксический анализатор(LL) Legato Общие вопросы Delphi 2 25.12.2011 18:29
Синтаксический анализатор Lisёноk Помощь студентам 2 12.12.2011 09:51
Синтаксический анализатор Lifefine Общие вопросы Delphi 3 09.10.2010 19:42