Путём долгих мучений я вникла в задание.
Задание: Построить синтаксический анализатор для понятия "скобки".
скобки::=А | скобка скобки
скобка::=( 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";
}
}
18 февраля 2010 в 0:03
Александр, посмотрите
//ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D1%8...
Здесь используется, кажется, не совсем это, но очень похоже.
18 февраля 2010 в 0:02
Для начала отловите все опечатки. Перечитайте еще пару раз программу. Например:
#include conio.h> – не хватает <
Fsteam F; – fstream пишется с маленькой буквы
char S; F>>S; int D=0; int k – не хватает ; в конце
и им подобные.
Потом, в выражении switch после case ставятся не ";", а ":". А еще там необходим break.
И да, один полезный совет. Не пишите вывод своей программы так, как сейчас. Потратьте лишних полчаса со словарем и пишите по-английски. Поверьте, это много лучше "как бы почти русских" символов.
18 февраля 2010 в 0:01
Я вообще не понял, что за запись
>> скобки::= А| скобка скобки
объясните, пожалуйста)
17 февраля 2010 в 23:05
Оксана, мы тут не философы, мы тупые инженеры.
Опиши в чём _именно_ проблема. Шанс получить осмысленную реакцию на экран неформатированного, путанногои некомпилирующегося кода с комментарием "очень надеюсь на вашу помощь с текстом программы" очень и очень малы.
17 февраля 2010 в 22:02
>> скобки::=А | скобка скобки
>> скобка::=( B скобки)
>> То есть возможны корректные варианты:
>> A
>> (BA)
>> (BA)A
>> и всевозможное чередование этих трёх выражений.
ваше заключение не верно:
(BA) не удовлетворяет определению "скобки".
(B(BA)A)A удволетворяет определению "скобки".
>> попыталась сделать чтобы программа будущая игнорировала пробелы и переходы на новую строку.
игнорирование переводов строк – спорный момент. чем последовательности разделяются в файле?
ЗЫ: дочитаю новости – может напишу что-нибудь еще по этому поводу.