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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.10.2018, 16:53   #21
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Так в этой теме уже все разжевано.
Ну я бы так не сказал.

Написать лексический анализ это значит проверить входной поток на корректность правил и получить на выходе синтаксическое дерево.

Вначале вы должны получить список или массив тегов. А далее рекурсией строим дерево.

Примерно вот так вот. Тут я для каждого правила создаю свою структуру. Для каждой ветки правила(подправила) заводу константу для kind и переменную.

Код:
const ekTrue=1;
const ekFalse=2;
const ekAnd=3;
const ekOr =4;
const ekNot=5;

struc
{
string name;
int kind;
char* teg;
void* oper;
void* expr;
} Expr;

const okExpr=1;
const okComma=2;

struc
{
string name;
int kind;
char* teg;
void* oper;
void* expr;
} Oper;


// Опережающее объявление (Forward). Не знаю как в Си.
Expr* GetExpr();
Oper* GetOper();

//---------
bool IsTeg(char* Teg)
{
if (TegIndex>TegCount) return false
else
return strcmp(TegList[TegIndex],Teg);
}

char* ReadTeg()
{
if (TegIndex>TegCount) return ''
else
{
Char* Result=TegList[TegIndex];
TegIndex=TegIndex++;
return result;
}
}

char* TryReadTeg(char* Teg)
{
if (IsTeg(Teg)) return ReadTeg()
  else Error('Не найдено слово:', Teg);
return NULL;
}

Expr* GetExpr()
{
if nError>0  retutn NULL; // если есть ошибки, то выходим

Expr* result=new(Expr);
Expr->name='Выражение';

if (IsTeg('True'))
{
Expr->Teg=ReadTeg();
result->kind=ekTrue;
} else
if (IsTeg('False'))
{
Expr->Teg=ReadTeg();
result->kind=ekFalse;
} else
if (IsTeg('And'))
{
Expr->Teg=ReadTeg();
TryReadTeg('(');
result->kind=ekAnd;
result->Oper=GetOper();
TryReadTeg(')');
} else
if (IsTeg('Or'))
{
Expr->Teg=ReadTeg();
TryReadTeg('(');
result->kind=ekOr;
result->Oper=GetOper();
TryReadTeg(')');
} else
if (IsTeg('Not'))
{
Expr->Teg=ReadTeg();
TryReadTeg('(');
result->kind=ekNot;
result->Oper=GetExpr();
TryReadTeg(')');
} 

return result;
}


Oper* GetOper()
{
if nError>0  retutn NULL; // если есть ошибки, то выходим

Oper* result=new(Oper);
Oper->name='Операторы';
result->kind=okExper;
result->Exper=GetExper();
if (IsTeg(','))
{
Expr->Teg=TryReadTeg(',');
result->Oper=GetOper();
result->kind=okComma;
} 
return result;
}
А далее, для проверки, при помощи обхода дерева, делаете вывод дерева или вычисляете выражение.

PS. Код, примерный. Могут быть ошибки не доработки, да и вообще это скорее псевдокод нежели Си.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 22.10.2018 в 17:00.
Pavia вне форума Ответить с цитированием
Старый 22.10.2018, 21:01   #22
Алексей9912
Пользователь
 
Регистрация: 30.09.2018
Сообщений: 30
По умолчанию

спасибо за код!
Алексей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