Идеология использования функции 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;
}