Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> strtok+Лекс-ий анализатор, Срочно нужна Ваша помощь 
:(
    Опции темы
SectoR
Дата 8.3.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



Добрый день программисты!
Итак, проблема в следующем...

С помощью strtok мы определяем какие символы могут
быть признаками начала или конца слова
(в принципе можно определять только символы конца лексемы).

При
char in[100]="int x=2;" - входная цепочка
программа работает правильно.

Но нужно, чтобы работало и при int x=2,y=4,z=5 и т.д. до символа ;


Пожалуйста подскажите, как strtok'ом разделить входную цепочку, а
точнее составить универсальный алгоритм вызова проверяющих функций:

void typescan(char *lex); - проверяет тип данных
void varscan(char *lex); - проверяет переменные
void digitscan(char *lex); - проверяет значения переменных

Походу нужно использовать следующую конструкцию:
Код

char *lex; lex=strtok(in," =,;");
  while (lex != NULL)
  {
   printf("lex=%s ", lex);

   /* что то делать */
   
   lex=strtok(NULL, " =,;");
  }


Вообщем надеюсь на Вашу профессиональную помощь!

Исходник:
Код

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

void main(int x);
void typescan(char *lex);
void varscan(char *lex);
void digitscan(char *lex);

char in[100]="int x=2;";
char out[100]="";


void main(int x)
{
  printf("%s\n", in);

  char *lex; lex=strtok(in," ");
  printf("lex:%s ", lex);
  typescan(lex);

  lex=strtok(NULL,"=");
  printf("lex:%s ", lex);
  varscan(lex);

  lex=strtok(NULL,";");
  printf("lex:%s ", lex);
  digitscan(lex);


  printf("\n\n%s", out);
  getch();
}

void typescan(char *lex)
{
  if ( strcmp(lex,"int")==0 ) strcat(out,"<1>");
  else if( strcmp(lex,"float")==0 ) strcat(out,"<2>");
  else if( strcmp(lex,"char")==0 ) strcat(out,"<3>");
  else { printf("\n Neverniy type of data!"); getch(); exit(1); }
}


void varscan(char *lex)
{
  int lexsz=strlen(lex);

  if( isalpha(lex[0])==0 && lex[0]!='_' )
  { printf("\n Nevernoe name of variable!"); getch(); exit(1); }

  for(int i=1; i<lexsz; i++)
  if( isalpha(lex[i])==0 && isdigit(lex[i])==0 && lex[i]!='_' )
  { printf("\n Nevernoe name of variable!"); getch(); exit(1); }
  else ;
  strcat(out, "<variable>" );
}


void digitscan(char *lex)
{
  int lexsz=strlen(lex);

  if( lex[0]!='+' && lex[0]!='-' && isdigit(lex[0])==0 )
  { printf("\n Nevernoe znachenie peremennoi!"); getch(); exit(1); }

  for(int i=1; i<lexsz; i++)
  if( isdigit(lex[i])==0 )
  { printf("\n Nevernoe znachenie peremennoi!"); getch(); exit(1); }
  else ;
  strcat(out, "<digit>" );
}

PM   Вверх
Бонифаций
Дата 9.3.2006, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 1
Всего: 40



если вам нужно что-то сложнее strok, возьмите lex/flex ине мучайтесь.


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
SectoR
Дата 9.3.2006, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 5.10.2005

Репутация: нет
Всего: нет



Мне известно про lex'ы и flex'ы, но нужно бы без них и без исп-я регулярных выражений...
Спустя сутки я решил проблему - тема закрыта!
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0426 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.