diplom (664366), страница 8
Текст из файла (страница 8)
^[^"."\n] {yymore();
BEGIN TEXT;};
^"." {BEGIN COMMAND;};
^\n {return (EMPTYSTR);};
^[^"."\n]$ {return (TEXTSTR);};
.+ {BEGIN 0;
return (TEXTSTR);};
br[ \t]* {BEGIN COMARG;
return (BREAKLINE);};
sp[ \t]* {BEGIN COMARG;
return (SPACE);};
bd[ \t]* {BEGIN COMARG;
return (BOLD);};
ul[ \t]* {BEGIN COMARG;
return (UNDERLINE);};
ft[ \t]+ {BEGIN COMARG;
return (FONT);};
ps[ \t]+ {BEGIN COMARG;
return (SIZE);};
ad[ \t]+ {BEGIN COMARG;
return (ADJUST);};
na[ \t]* {BEGIN COMARG;
return (NOADJUST);};
fi[ \t]* {BEGIN COMARG;
return (FILL);};
nf[ \t]* {BEGIN COMARG;
return (NOFILL);};
in[ \t]+ {BEGIN COMARG;
return (IN);};
ti[ \t]+ {BEGIN COMARG;
return (TIN);};
ex[ \t].* {BEGIN COMARG;
return (EXIT);};
[A-Za-z]{1,2}[ \t]* {BEGIN COMARG;
return (UNKNOW);};
[ \t]*$ {BEGIN 0;};
[0-9]+ {BEGIN 0;
return (DARG);};
[A-Za-z] {BEGIN 0;
return (CARG);};
[A-Za-z][^ \t\n]+ {BEGIN 0;
return (SARG);};
%%
Фрагмент кода грамматического анализатора.
%start list
%token UNKNOW
%token EXIT
%token FONT SIZE
%token SCENTER SUNDERLINE UNDERLINE BOLD
%token ADJUST NOADJUST LINELENGHT IN TIN
%token BREAKLINE SPACE LINESPACE
%token FILL NOFILL
%token DARG CARG SARG
%token TEXTSTR EMPTYSTR
%{
#include "lex.yy.c"
#define printT(STR) fprintf(yyout,(STR))
#define printD(STR,D) fprintf(yyout,(STR),(D))
int cb=-1,cu=-1,cc=-1,cl=-1;
int co=-1;
int ta=0,tf=0,tb=0,tu=0,tc=0,tp=0;
int tFILL=0,cIN,cTIN,LS=0;
char nhtext[YYLMAX];
int i;
%}
%%
list: | list string
string: text
| command
;
command: BREAKLINE
{breakline();}
| SPACE comarg
{printD("",$2*30);}
| LINESPACE comarg
{LS=$2;}
| BOLD comarg
{if (!tb) {tb=1;
printT("");}
cb=$2;}
| UNDERLINE comarg
{if (!tu) {tu=1;
printT("");}
cu=$2;}
| FONT comarg
{if (tf) printT("");
fontchange(nhtext);
tf=1;}
| SIZE comarg
{if (tf) printT("");
printD("",$2);
tf=1;}
| ADJUST comarg
{if (tp) {tp=0;printT("");};
if (ta) printT("");
ta=1;
printT("
switch (nhtext[0])
{
case 'l': printT("left");break;
case 'r': printT("right");break;
case 'c': printT("center");break;
default : printT("left");break;
}
printT("\">");};
| IN comarg
{cIN=$2;};
| TIN comarg
{cTIN=$2;};
| FILL
{tFILL=1;};
| NOFILL
{tFILL=0;};
| UNKNOW comarg
{fprintf(stderr,"unknow nroff command before arg
'%s'\n",yytext);}
| UNKNOW
{fprintf(stderr,"unknow nroff command: .%s\n",yytext);}
| EXIT
{return(0);}
;
comarg: DARG
{$$=atoi(yytext);}
| CARG
{nhtext[0]=yytext[0];}
| SARG
{for(i=0;yytext[i]!=0;i++) nhtext[i]=yytext[i];
nhtext[i++]=0;}
;
text: TEXTSTR
{if (cTIN) {for(i=0;i printT(" "); cTIN=0;} else for(i=0;i printT(" "); printD("%s",yytext); if (!tFILL) breakline(); if (!(cb<0)) cb--; if (!cb) {tb=0;printT("");};} | EMPTYSTR {breakline();} ; %% #include "y.tab.c" int main(int argc, char *argv[]) { ++argv, --argc; /* skip over program name */ if (argc > 0) yyin = fopen(argv[0], "r"); else yyin = stdin; ++argv, --argc; /* skip over input file name */ if (argc > 0) yyout = fopen(argv[0], "w"); else yyout = stdout; fprintf(yyout, "\n \n \n \n \n\n \n"); yyparse(); fprintf(yyout, "\n \n\n\n"); } 88 Код головной программы.