Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
 Аватар для Серега19
4 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 38

Таблица идентификаторов, лексический анализатор, удаление комментариев из текста программы

02.04.2011, 19:08. Показов 7177. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые программисты! Я в С++ Builder новенький, и то это громко сказано, поэтому обращаюсь к Вам за помощью. Мне на понедельник задали сделать три программы в форме ООП, но поскольку я в программировании зеро, я прошу помощи у Вас.

Программа №1 "Построение таблиц идентификаторов".
Задание: сделать программу, которая при вводе с клавиатури идентификатора, а все идентификаторы находятся в текстовом файле, производила построение, поиск и вывод на элементе Panel1 пути поиска и вывода вводимого нами идентификатора.
Идентификаторы, которые в файле: As, bd, er1, gj2, ak2, rtp1, aa, df, cv, as1, ffh23, js, lg2, jg2, er3, ad1, fas, qa1, dw1, xc4, aa2, as3, fr, gh45, ffh22, jos, ee1, ks2, nh6, lg1, eea, bad, add, off, case, read, readln. Идентификаторы в файле написаны в столбик.
Элементы:
1). Memo1 - в нем должно отображаться список идентификаторов, которые находятся в файле
2). Panel1 - на нем должно отображаться путь вывода идентификата
3). Button2 - для поиска введеного идентификатора в Edit1
4). Edit1 - сюда вводим идентификатор для поиска

Программа №2 "Лексический анализатор".
Задание: сделать программу, которая по входному коду, который находится в текстовом файле, построила таблицу лексем.
Код программы:
Pascal
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
procedure Slow;
var
i, j, k : Integer;
begin
for i := 1 to N do
for j := 1 to N do
for k := 1 to N do   
end;
procedure Fast;
var
i, j : Integer;
begin
for i := 1 to N do
for j := 1 to N do
Slow; 
end;
procedure RunBoth;
begin
Fast;
end;
procedure CountDown(N : Integer);
begin
if (N<=0) then exit;
CountDown(N-l) ;
end;
function Locateltem(target : Integer) : Integer;
var
i : Integer;
begin
for i := 1 to N do
if (Value[i] = target) then 
begin
Result := i;
break;
end;
end;
end;
Элементы:
1). StringGrid1 - 3 колонки, в которых написано: Лексема, Тип лексемы, Значение
2). Button1 - нажав которую будет построена таблица
Подсказки преподавателя:
Лексема Тип лексемы Значение
procedure ключевое слово X1
Slow идентификатор Slow:1
; специальный символ S1
1 целочисловая константа 1

Программа №3 "Удаление комментариев из текста программы"
Задание: сделать программу, которая будет удалять комментарии вида "//", "/* */" из кода программы, который находится в текстовом файле.
Элементы:
1). Memo1 - сдесь будет показываться код с комментариями
2). Memo2 - сдесь будет показываться код уже без комментариев
3). Button1 - загрузить код в Memo1
4). Button2 - убрать комментарии, показать текст в Memo2 и записать в файл.

Помогите пожалуйста кто чем может. От этих программ зависит мое будущее обучение в ВУЗе ((( Наперед, спасибо за помощь!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2011, 19:08
Ответы с готовыми решениями:

Лексический анализатор. Вывести типы констант, идентификаторов и специальных знаков
Существует код лексического анализатора, но ответ выдает в не совсем корректной форме Вот код: #include &quot;stdafx.h&quot; #include...

Лексический анализатор текста
Разработать лексический анализатор, который реализует конечный автомат для поиска во входном потоке бинарных векторов с нечетным числом...

Удаление из текста программы комментариев с использованием списков
Здравствуйте, уважаемые программисты! Я в С++ только недавно, в программировании совсем ничего еще не смыслю, поэтому обращаюсь к Вам за...

22
 Аватар для Серега19
4 / 0 / 0
Регистрация: 17.12.2010
Сообщений: 38
04.04.2011, 22:18  [ТС]
Студворк — интернет-сервис помощи студентам
Щас попробую сделать. Если что, то обращусь за помощью.

Добавлено через 2 часа 43 минуты
Вопрос к программе с удалением комментариев. А что нужно записать, чтобы пустая строка, которая возникла после удаления комментария, удалялась тоже?
0
Тутошний я
 Аватар для Grey
2147 / 1202 / 225
Регистрация: 03.11.2009
Сообщений: 4,424
Записей в блоге: 2
05.04.2011, 18:49
Если ты уверен, что после комментария не будет кода, нужно заменить строки
C++
1
2
      a.Delete(t,i+2-t);
      d=d-(i+2-t);
на
C++
1
2
      a.Delete(t,i+4-t);
      d=d-(i+4-t);
Так мы удаляем вместе с символом переноса строки.
1
 Аватар для MrAndrey_ka
79 / 79 / 20
Регистрация: 13.05.2009
Сообщений: 537
Записей в блоге: 1
05.04.2011, 20:17
ниже код лексического анализатора, правда он будет помоощнее того что требуется тебе, и каменты он принимает С++ а не паскаля, но переделать его будет просто

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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
//---------------------------------------------------------------------------
 
#ifndef CompilH
#define CompilH
#include <Classes.hpp>
#pragma hdrstop
//---------------------------------------------------------------------------
 
 
enum TLexemType  {ltEqual,ltLess,ltGreater,ltLessOrEqual,ltGreaterOrEqual,ltNotEqual,     //5  logic
                  ltPlus,ltMinus,ltOr,ltXor,                                              //9  matematic
                  ltAsterisk,ltSlash,ltDiv,ltMod,ltAnd,                                   //14 matematic
                  ltNot,
                  ltPrisv,
                  ltCap,
                  ltLeftBracket,ltRightBracket,                                           //19
                  ltSin,ltCos,ltLn,                                                       //22 встроенные функции
                  ltIdentifier,
                  ltNumber,ltNumber16,
                  ltStroka,
                  ltEndOP,
                  ltTint,ltTfloat,ltTbool,ltTstr,ltTchar,                                 //30 типы
                  ltEnd};
 
struct TLexem{
TLexemType Type;
int Pos;
int Len;};
 
class TLexicalAnalyzer
{public:
int FIndex;
TLexicalAnalyzer();
~TLexicalAnalyzer(void);
inline void Next(){if(FIndex<FLexemeList->Count)FIndex++;}
inline void Prev(){if(FIndex>1)FIndex--;}
inline TLexem* Lexeme(int ind){
return (TLexem*)FLexemeList->Items[ind];}
TLexem *Lexeme(){return Lexeme(FIndex);};
inline int CountLexem(){return FLexemeList->Count;};
__property String Str={read=S,write=SetS};
__property TList *ErrAn={read=LErr};
private:
String S;
int P;
void SetS(String Expr);
void Stroka();
void Number16();
void Number();
void Word();
bool isDigit(char ch);
bool isLetter(char ch);
void SkipWhiteSpace();
void ExtractLexeme();
void PutLexeme(TLexemType LexType,int Pos,int Lex);
inline void tHrow(int c,String s)
       {//new TMyEx(c,s.c_str(),NULL,&P,sizeof(P));
       LErr->Add(new TMyEx(c,s.c_str(),NULL,&P,sizeof(P)));};
TList *FLexemeList,*LErr;};
 
 
TLexicalAnalyzer::TLexicalAnalyzer()
{FLexemeList= new TList;
LErr= new TList;
};//---------------------------------------------------------------------------
 
TLexicalAnalyzer::~TLexicalAnalyzer(void)
{for(int i=0;i<FLexemeList->Count;i++)
   delete FLexemeList->Items[i];
for(int i=0;i<LErr->Count;i++)
   delete (TMyEx*)LErr->Items[i];
delete FLexemeList;
delete LErr;
};//---------------------------------------------------------------------------
 
void TLexicalAnalyzer::SetS(String Expr)
{if(S==Expr)return;
for(int i=0;i<LErr->Count;i++)
   delete (TMyEx*)LErr->Items[i];
LErr->Clear();
for(int i=0;i<FLexemeList->Count;i++)
   delete FLexemeList->Items[i];
FLexemeList->Clear();
P=1;
S=Expr;
while(P<=S.Length())
       {SkipWhiteSpace();
       ExtractLexeme();}
PutLexeme(ltEnd,P,0);}//---------------------------------------------------------------------------
 
// Пропускает пробелы, символы табуляции, комментарии и перводы строки,
// которые могут находиться в начале и в конце строки и между лексемами
void TLexicalAnalyzer::SkipWhiteSpace(){
while (P<=S.Length()&&(S[P]==' '||S[P]=='\t'||S[P]=='\r'||S[P]=='\n'||S[P]=='/'))
  if(S[P]=='/'&&P<S.Length())
        {if(S[P+1]=='*')
            {int y=S.SubString(P,S.Length()-P).Pos("*/");
            P=+2;
            if(y==0)tHrow(2,"Незавершённый комментарий");
            P+=y-1;}
        else if(S[P+1]=='/')
                {int y=S.SubString(P,S.Length()-P).Pos("\n");
                if(y==0)P=S.Length()+1;
                P+=y;}
             else return;}
  else P++;
};//---------------------------------------------------------------------------
 
// Функция выделяет одну лексему и помещает её в список
void TLexicalAnalyzer::ExtractLexeme(){
if(P>S.Length()) return;
if(isDigit(S[P])||(S[P]==DecimalSeparator&&P<S.Length()&&isDigit(S[P+1])))
  Number();
else
  if(isLetter(S[P]))
    Word();
  else
    switch(S[P]){
  case'"':Stroka();
        break;
  case'(':
        PutLexeme(ltLeftBracket,P++,1);
        break;
  case')':
        PutLexeme(ltRightBracket,P++,1);
        break;
  case'*':
        PutLexeme(ltAsterisk,P++,1);
        break;
  case'+':
        PutLexeme(ltPlus,P++,1);
        break;
  case'-':
        PutLexeme(ltMinus,P++,1);
        break;
  case'/':
        PutLexeme(ltSlash,P++,1);
        break;
  case'<':
        if(P<S.Length()&&S[P+1]=='=')
           {PutLexeme(ltLessOrEqual,P,2);
           P+=2;}
        else if(P<S.Length()&&S[P+1]=='>')
                {PutLexeme(ltNotEqual,P,2);
                P+=2;}
             else
                PutLexeme(ltLess,P++,1);
        break;
  case'=':PutLexeme(ltEqual,P++,2);
        break;
  case':':if(P<S.Length()&&S[P+1]=='=')
            {PutLexeme(ltPrisv,P,2);
            P+=2;
            break;}
  case'>':
        if(P<S.Length()&&S[P+1]=='=')
           {PutLexeme(ltGreaterOrEqual,P,2);
           P+=2;}
        else
           PutLexeme(ltGreater,P++,1);
        break;
  case'^':
        PutLexeme(ltCap,P++,1);
        break;
  case';':
        PutLexeme(ltEndOP,P++,1);
        break;
  default:
        tHrow(1,"Некорректный символ");
        P++;}
};//---------------------------------------------------------------------------
 
void TLexicalAnalyzer::PutLexeme(TLexemType LexType,int Pos,int Lex){
TLexem *NL=new TLexem;
NL->Type=LexType;
NL->Pos=Pos;
NL->Len=Lex;
FLexemeList->Add(NL);
};//---------------------------------------------------------------------------
 
bool TLexicalAnalyzer::isDigit(char ch){
return ch>='0'&&ch<='9';};
//---------------------------------------------------------------------------
 
bool TLexicalAnalyzer::isLetter(char ch){
return ch=='_'||(ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')
        ||(ch>='А'&&ch<='Я')||(ch>='а'&&ch<='я');};
//---------------------------------------------------------------------------
 
void TLexicalAnalyzer::Stroka(){
int InitPos=P;
do{P++;
if(S[P]=='"'&&P<S.Length()&&S[P+1]=='"')P+=2;}
while(P<S.Length()&&S[P]!='"');
PutLexeme(ltStroka,InitPos,++P-InitPos);
};//---------------------------------------------------------------------------
 
void TLexicalAnalyzer::Number(){
int InitPos=P;
do{P++;}
while(P<=S.Length()&&isDigit(S[P]));
if(P<=S.Length()&&S[P]=='х'&&P-InitPos==1&&S[P-1]=='0')
    {P=InitPos;
    Number16();
    return;}
if(P<=S.Length()&&S[P]==DecimalSeparator)
    {if(++P>S.Length()||!isDigit(S[P]))
        P--;
    else
        do{P++;}
        while(P<=S.Length()&&isDigit(S[P]));}
if(P<=S.Length()&&UpCase(S[P])=='E')
    {int RollBackPos=P++;
    if(P>S.Length())
       P=RollBackPos;
    else
       {if(S[P]=='+'||S[P]=='-')P++;
            if(P>S.Length()||!isDigit(S[P]))
                P=RollBackPos;
            else
                do{P++;}
                while(P<=S.Length()&&isDigit(S[P]));}}
PutLexeme(ltNumber,InitPos,P-InitPos);
};//---------------------------------------------------------------------------
 
void TLexicalAnalyzer::Number16(){
int InitPos=P++;
do{P++;}
while(P<=S.Length()&&isDigit(S[P]&&S[P]<'A'&&S[P]>'C'));
PutLexeme(ltNumber16,InitPos,P-InitPos);
};//---------------------------------------------------------------------------
 
void TLexicalAnalyzer::Word(){
int InitPos=P++;
while(P<=S.Length()&&(isLetter(S[P])||isDigit(S[P])))P++;
String ID=S.SubString(InitPos,P-InitPos).UpperCase();
if(ID.AnsiCompare("INT")==0)
   PutLexeme(ltTint,InitPos,ID.Length());
else
if(ID.AnsiCompare("FLOAT")==0)
   PutLexeme(ltTfloat,InitPos,ID.Length());
else
if(ID.AnsiCompare("STRING")==0)
   PutLexeme(ltTstr,InitPos,ID.Length());
else
if(ID.AnsiCompare("CHAR")==0)
   PutLexeme(ltTchar,InitPos,ID.Length());
else
if(ID.AnsiCompare("BOOL")==0)
   PutLexeme(ltTbool,InitPos,ID.Length());
else
if(ID.AnsiCompare("OR")==0)
   PutLexeme(ltOr,InitPos,ID.Length());
else
   if(ID.AnsiCompare("XOR")==0)
      PutLexeme(ltXor,InitPos,ID.Length());
   else
      if(ID.AnsiCompare("DIV")==0)
         PutLexeme(ltDiv,InitPos,ID.Length());
      else
         if(ID.AnsiCompare("MOD")==0)
            PutLexeme(ltMod,InitPos,ID.Length());
         else
            if(ID.AnsiCompare("AND")==0)
               PutLexeme(ltAnd,InitPos,ID.Length());
            else
              if(ID.AnsiCompare("NOT")==0)
                 PutLexeme(ltNot,InitPos,ID.Length());
              else
                 if(ID.AnsiCompare("SIN")==0)
                    PutLexeme(ltSin,InitPos,ID.Length());
                 else
                    if(ID.AnsiCompare("COS")==0)
                       PutLexeme(ltCos,InitPos,ID.Length());
                    else
                       if(ID.AnsiCompare("LN")==0)
                          PutLexeme(ltLn,InitPos,ID.Length());
                       else
                          PutLexeme(ltIdentifier,InitPos,ID.Length());
};//---------------------------------------------------------------------------
пользоваться так:

C++
1
2
3
4
5
TLexicalAnalyzer L;
L-> Str=<код>;
for(i=0;i<L.CountLexem();i++)
   {TLexem *f=L.Lexeme(i);
....
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2011, 20:17

Удаление комментариев из текста программы с использованием STL, ошибка при выполнении
Здравствуйте решал задачу с использованием STL из книги Страуструпа 6.22 возникла проблема программа вылетает, помогите пожалуйста...

Написать лексический анализатор для программы на Pascal
Всем привет, нужна помощь Нужно, чтобы программа, считывающая файл построчно, на выходе давала два файла: таблицу лексем(идентификатор,...

Лексический анализ. Таблицы идентификаторов
Таблица идентификаторов строится лексическим анализатором или другим? таблица констант, точно лексическим, а как с переменными быть не...

Удаление комментариев из текста
вот написал прогу, которая убирает комментарий из текста в стиле /*... */ но есть 1 но, если в 1 строке несколько комментариев, то она...

Удаление из текста комментариев и тегов summary
Исходный текст представляет описание класса на C#. Напишите процедуру, удаляющую из этого текста теги summary и комментарии. Для...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru