Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > strtok+Лекс-ий анализатор


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

С помощью 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>" );
}

Автор: Бонифаций 9.3.2006, 00:13
если вам нужно что-то сложнее strok, возьмите lex/flex ине мучайтесь.

Автор: SectoR 9.3.2006, 20:23
Мне известно про lex'ы и flex'ы, но нужно бы без них и без исп-я регулярных выражений...
Спустя сутки я решил проблему - тема закрыта!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)