Advertisement
Guest User

Untitled

a guest
Jun 15th, 2010
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.58 KB | None | 0 0
  1. FILE *fp; //указатель на файл
  2.  
  3.     lex *f_lex=NULL, *l_lex=NULL, *t_lex=NULL;
  4.     lex *f_prog=NULL, *l_prog=NULL, *t_prog=NULL;
  5.     lex *f_id=NULL, *l_id=NULL, *t_id=NULL;
  6.  
  7.  
  8. HWND hLogin, hStatic;
  9.  
  10. BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
  11.  
  12. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
  13. {
  14.     return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
  15. }
  16.  
  17. BOOL CALLBACK DlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  18. {
  19.     //открываем файл для чтения
  20.     if((fp=fopen("lex.txt", "r"))==NULL)
  21.         MessageBox(hWnd, TEXT("Файл лексем не найден."), TEXT("Ошибка"), MB_OK | MB_ICONSTOP);
  22.  
  23.     //пока не достигнут конец файла
  24.     while(feof(fp)==0)
  25.     {
  26.         //считываем из файла символ, тип и подтип
  27.         fscanf(fp,"%s %d %d\n",&str,&t1,&t2);
  28.         t_lex=new lex; //создаем структуру символов
  29.         strcpy(t_lex->name, str); //сохраняем название символа
  30.         t_lex->t1=t1; //сохраняем тип символа
  31.         t_lex->t2=t2; //сохраняем подтип символа
  32.         if(f_lex==NULL) //если список пуст
  33.         {   //считаем текущий символ началом и концом списка
  34.             f_lex=t_lex;
  35.             l_lex=t_lex;
  36.             t_lex->next=NULL;
  37.         }
  38.         else
  39.         { //если нет, то записываем текущий символ в следующую ячейку списка
  40.             l_lex->next=t_lex;
  41.             t_lex->next=NULL;
  42.             l_lex=t_lex;
  43.         }
  44.     }
  45.     fclose(fp); //закрываем файл
  46.  
  47.  
  48.  
  49.     switch(message)
  50.     {
  51.         case WM_CLOSE:
  52.             EndDialog(hWnd, 0);
  53.             return TRUE;
  54.  
  55.         case WM_INITDIALOG:
  56.             hLogin = GetDlgItem(hWnd, IDC_EDIT1);
  57.             hStatic = GetDlgItem(hWnd, IDC_EDIT3);
  58.             return TRUE;
  59.  
  60.         //case WM_RBUTTONDOWN:
  61.         //  SetWindowText(hStatic, TEXT("Нажата правая кнопка мыши"));
  62.         //  return TRUE;
  63.  
  64.         case WM_COMMAND:
  65.             if(LOWORD(wParam) == IDC_ENTRY)
  66.             {
  67.                 GetWindowText(hLogin, str, 32);
  68.  
  69.                 if(lstrlen(str) == 0 )
  70.                     MessageBox(hWnd, TEXT("Не введено имя файла."), TEXT("Ошибка"), MB_OK | MB_ICONSTOP);
  71.                
  72.                 if((fp=fopen(str, "r"))==NULL)
  73.                     MessageBox(hWnd, TEXT("Файл с заданным именем не найден."), TEXT("Ошибка"), MB_OK | MB_ICONSTOP);
  74.                
  75.                 /*else
  76.                 {
  77.                     wsprintf(text, TEXT("Логин: %s\n"), str);
  78.                     MessageBox(hWnd, text, TEXT("Авторизация"), MB_OK | MB_ICONINFORMATION);
  79.                 }*/
  80.  
  81.  
  82.  
  83.  
  84.  
  85.     //пока не достигнут конец файла
  86.     while(feof(fp)==0)
  87.     {
  88.         c=fgetc(fp); //считываем символ из файла и преобразовываем его в int
  89.  
  90.         switch(c)
  91.         {
  92.             //при считывании пробела, переноса строки и табуляции
  93.         case ' ':
  94.         case '\n': 
  95.         case '\t':
  96.             buf[i]='\0'; //записываем в буфер признак конца строки
  97.             t_prog=new lex;
  98.             strcpy(t_prog->name, buf);
  99.             t_prog->t1=9;
  100.             t_prog->t2=0;
  101.             // если считывается число, то даем ему соответствующий номер типа
  102.             if(atoi(t_prog->name)!=0) {
  103.                 if ( strpbrk(t_prog->name, "89") == NULL )
  104.                     t_prog->t1=8;
  105.             }
  106.             t_lex=f_lex;       
  107.             while(t_lex!=NULL)     
  108.             {
  109.                 // проверяем есть ли такой символ в словаре
  110.                 if (strcmp(t_lex->name,t_prog->name)==0)
  111.                 {
  112.                     t_prog->t1=t_lex->t1;
  113.                     t_prog->t2=t_lex->t2;
  114.                 }
  115.                 t_lex=t_lex->next;
  116.             }
  117.             //формируем список
  118.             if(f_prog==NULL)
  119.             {
  120.                 f_prog=t_prog;
  121.                 l_prog=t_prog;
  122.                 t_prog->next=NULL;
  123.             }
  124.             else
  125.             {
  126.                 l_prog->next=t_prog;
  127.                 t_prog->next=NULL;
  128.                 l_prog=t_prog;
  129.             }
  130.  
  131.             if(t_prog->t1==9)//если найден новый идентификатор
  132.             {
  133.                 if(f_id==NULL)//если таблица идентификаторов пуста
  134.                 {
  135.                     f_id=new lex;//создаем структуру идентификаторов
  136. //копируем текущее имя идентификатора
  137.                     strcpy(f_id->name, t_prog->name);                                  
  138.                     f_id->t2=id;//присваиваем ему номер подтипа
  139.                     l_id=f_id;//устанавливаем начало на конец списка
  140.                     f_id->next=NULL;
  141.                     id++;//увеличиваем счётчик подтипов на 1
  142.                     cout<<"\nNew symbols:  "<<f_id->name;
  143.                 }
  144.                 else//если таблица идентификаторов не пуста
  145.                 {
  146.                     t_id=f_id;
  147.                     while(t_id!=NULL)//пока не достигнут конец списка
  148.                     {
  149.                     //проверяем есть ли уже такой идентификатор в списке
  150. //Если есть, то даем ему соответствующий номер подтипа
  151.                         if (strcmp(t_id->name,t_prog->name)==0)
  152.                         {
  153.                             t_prog->t2=t_id->t2;
  154.                             x=1;
  155.                             break;
  156.                         }
  157.                         t_id=t_id->next;
  158.                     }
  159.                     if(x==0)
  160.                     {   //если такого идентификатора в списке нет
  161.                         t_id=new lex;//то создаем структуру для нового
  162.                         strcpy(t_id->name, t_prog->name);
  163. //присваиваем идентификатору номер подтипа
  164.                         t_id->t2=id;                                               
  165.                         t_prog->t2=t_id->t2;
  166.                         l_id->next=t_id;
  167.                         l_id=t_id;
  168.                         l_id->next=NULL;
  169.                         id++;//увеличиваем счётчик подтипов на 1
  170.                         cout<<"  "<<t_id->name;
  171.                     }
  172.                 }
  173.             }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement