Идеология использования функции UniversalScanner довольно сложна, ее трудно прочувствовать с первого взгляда. В качестве примера я приведу две программки – сканирование строки с использованием этой функции (с выделением и показом лексем) и сканирование (то-есть чтение) файла.

 

А) «Сканирование» строки –

 

 

    #include <stdio.h>

    #include <stdlib.h>

 

    #include <datamem.h>

    #include <memodyn.h>

    #include <newdtmem.h>

 

    void F(struct ListP *P)

    {

    char S[100];

    printf("**************************");

    printf("\n");

 

    READonPosStrP(P,0,S);

    printf("Lex in F: "); printf(S);

    printf("\n");

    READonPosStrP(P,1,S);

    printf("Sample in F: "); printf(S);

    printf("\n");

    return;

    }

 

 

    void main()

    {

    char Sample[5];

    char Sample1[5];

    char Str[]="00A1B100www001OK";

    struct ListP *P1;

    struct ListP *P2;

    void *Q1;

    void *Q2;

    int i;

    int res;

 

    Sample[0]=48;

    Sample[1]=48;

    Sample[2]=0;

    Sample1[0]=49;

    Sample1[1]=0;

    P1=CRbegStrP(Sample);

    ADDendStrP(P1,Sample1);

    P2=CRbegStrP("");

    ADDendStrP(P2,"");

    Q1=CreateQueue(2);

    Q2=CreateQueue(12);

    i=0;

    printf("xxx");

    printf("\n");

    printf(Str);

    printf("\n");

    while(*(Str+i)!=0)

    {

    res=UniversalScanner(P1,P2,Q1,Q2,*(Str+i),F,0);

    printf("%d \n",res);

    i++;

    }

    res=UniversalScanner(P1,P2,Q1,Q2,*(Str+i),F,1);

    printf("END");

    printf("\n");

    return;

    }

 

 

Б) «Сканирование» файла –

 

 

    #include <stdio.h>

    #include <stdlib.h>

 

    #include <datamem.h>

    #include <memodyn.h>

    #include <newdtmem.h>

 

    int I=0;

 

    void F(struct ListP *P)

    {

    char S[100];

    printf("**************************");

    printf("\n");

 

    READonPosStrP(P,0,S);

    printf("Lex in F: "); printf(S);

     

    printf("\n");

    READonPosStrP(P,1,S);

    printf("Sample in F: "); printf(S);

    printf("\n");

    return;

    }

 

 

    void main(int argc,char *argv[])

    {

      char F1[91];

      char F2[91];

     FILE *f1;

     FILE *f2;

     int Ch;

     char ch;

    char Sample[5];

    char Str[]="11";

    struct ListP *P1;

    struct ListP *P2;

   

    void *Q1;

    void *Q2;

    int i,j;

    int res;

 

      if(argc!=3)

        {

        printf("ERROR! We need 2 parameters!\n");

        return -2;

        };

      CpStr(argv[1],F1);     

      CpStr(argv[2],F2);     

 

    Sample[0]=13;

    Sample[1]=10;

    Sample[2]=0;

    P1=CRbegStrP(Sample);

    P2=CRbegStrP("");

    ADDendStrP(P2,"");

    Q1=CreateQueue(2);

    Q2=CreateQueue(12);

    f1=fopen(F1,"rb");

     if(f1==NULL)

        {

        fclose(f2);

        printf("Can't open file to read.\n");

        return -1;

        }

     j=0;

     while(j>-1)

        {

        Ch=fgetc(f1);

        if(Ch==EOF)

          {

          fclose(f1);

          break;

          };

        ch=(char)Ch;

    res=UniversalScanner(P1,P2,Q1,Q2,ch,F,0);

        j++;

        }

    res=UniversalScanner(P1,P2,Q1,Q2,ch,F,1);

 

 

 

/*  i=0;

этот отрывок оставлен чтоб сравнить со сканированием строки.

    while(*(Str+i)!=0)

    {

    res=UniversalScanner(P1,P2,Q1,Q2,*(Str+i),F,0);

    printf("%d \n",res);

    i++;

    }

    res=UniversalScanner(P1,P2,Q1,Q2,*(Str+i),F,1);

*/

    printf("END");

    printf("\n");

    return;

    }

 

   

   

 

Хостинг от uCoz