singlepost

задание по рекурсии << На главную или назад  

Путём долгих мучений я вникла в задание.

Задание: Построить синтаксический анализатор для понятия "скобки".

скобки::=А | скобка скобки
скобка::=( B скобки)

То есть возможны корректные варианты:
A
(BA)
(BA)A
и всевозможное чередование этих трёх выражений.

некорректные выражения таковы:

1. Пусто
2. присутствуют лишнме символы – Z!345c и тд
3. Спереди строки не могут стоять – B и закрывающая скобка ')'
4. Когда конструкция незакончена – ( или (B
5. Потеря части – (B)

получился такой текст: помогите его отредактировать и дополнить. Так чтобы программа анализировала символы из файла и выводила результат в другой файл. результат – это правильные последовательности + ошибки.
Да, ещё я попыталась сделать чтобы программа будущая игнорировала пробелы и переходы на новую строку.

очень надеюсь на вашу помощь с текстом программы.

#include <iostream.h>
#include <stdio.h>
#include conio.h>

void Error(int N)

{ switch (N)//переключатель ошибок (надо как то реализовать вывод ошибок в файл)
{
case 1;
cout<<"nycTo"<<endl;
case 2;
cout<<"HedonycTumblU cumBoJl"<<endl;
case 3;
cout<<"CnepeDu He mogeT 6blTb: ),B"<<endl;
case 4;
cout<<"HeT Круглой скобки"<<endl;
case 5;
cout<<"nocJle kpyrJlou cko6ku Het B"<<endl;
case 6;
cout<<"notep9 4actu – (B)"<<endl; //также ещё другие подобные некорректные ситуации

}
}

Fsteam F;//Входной файл из которого всё читается
int Round () //фунцкция анализа скобок

{
char S; F>>S; int D=0; int k
if(F eof())
{
Error(z);
cout<<"BHytPu ()";
}
else
{
if(S=='(') D=1;
else
if(S=='B') D=1;
else
if(S=='A') D=1;
else
if(S==')') D=1; //не знаю как это записать. надо как то поместить сюда Error

}
return D;
}

int Bracket()//функция запуска
{
char S; F>>S; int D=0
switch (S)
{
case 'A': case '(' ; D=Round(); break;
case '(' ; D=Round(); break;
}
default; Error()
}

void main()
{
F open();
char S; F.sets(skipws)//пропуск пробелов и переходов
F>>S;
if(F.eof( ) ) Error()
else
{
F.seekg(ios::beg);
D=Bracket();
if(D) cout<<"A";

}
}

66 ответов в теме “задание по рекурсии”

  1. 5
    Денис Лисов ответил:

    Александр, посмотрите
    //ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D1%8...
    Здесь используется, кажется, не совсем это, но очень похоже.

  2. 4
    Денис Лисов ответил:

    Для начала отловите все опечатки. Перечитайте еще пару раз программу. Например:
    #include conio.h> – не хватает <
    Fsteam F; – fstream пишется с маленькой буквы
    char S; F>>S; int D=0; int k – не хватает ; в конце
    и им подобные.
    Потом, в выражении switch после case ставятся не ";", а ":". А еще там необходим break.

    И да, один полезный совет. Не пишите вывод своей программы так, как сейчас. Потратьте лишних полчаса со словарем и пишите по-английски. Поверьте, это много лучше "как бы почти русских" символов.

  3. 3
    Александр Лищенер ответил:

    Я вообще не понял, что за запись
    >> скобки::= А| скобка скобки
    объясните, пожалуйста)

  4. 2
    Алексей Злобин ответил:

    Оксана, мы тут не философы, мы тупые инженеры.
    Опиши в чём _именно_ проблема. Шанс получить осмысленную реакцию на экран неформатированного, путанногои некомпилирующегося кода с комментарием "очень надеюсь на вашу помощь с текстом программы" очень и очень малы.

  5. 1
    Леонид Максимов ответил:

    >> скобки::=А | скобка скобки
    >> скобка::=( B скобки)

    >> То есть возможны корректные варианты:
    >> A
    >> (BA)
    >> (BA)A
    >> и всевозможное чередование этих трёх выражений.

    ваше заключение не верно:
    (BA) не удовлетворяет определению "скобки".
    (B(BA)A)A удволетворяет определению "скобки".

    >> попыталась сделать чтобы программа будущая игнорировала пробелы и переходы на новую строку.

    игнорирование переводов строк – спорный момент. чем последовательности разделяются в файле?

    ЗЫ: дочитаю новости – может напишу что-нибудь еще по этому поводу.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.