FLEX-i abil arvude genereerimine ja lekseemi positsiooni leidmine

FLEX-i abil on lihtne genereerida arve (s.t. muuta sisendteksti arvule vastav sümbolite jada arvuks); tegelikult teeb selle töö C-interpretaator (FLEX on kirjutatud C-s).

Samuti on lihtne leida lekseemi positsiooni (reanumbrit ja sümbolite positsiooni reas); järgnevas on näiteks FLEX-i sisendfail, mille alusel FLEX genereerib programmi, mis tunnistab sisendtekstis täis- ja reaalarvud ja määrab nende asukoha.

%option noyywrap
%{
/* this is needed for the to atoi(), atof() functions below */
#include <math.h>
int arv, num_lines = 0, num_chars = 0, char_pos=0;
float rearv;
%}

NUMBER [0-9]
REARV {NUMBER}*"."{NUMBER}+
ARV {NUMBER}+

%%

{REARV} {rearv = atof(yytext);
printf("In line %d in positions %d to %d real number: %f\n",
num_lines, char_pos, char_pos+yyleng-1, rearv);
num_chars=num_chars+yyleng;
char_pos=char_pos+yyleng;
}

{ARV} {arv = atoi(yytext);
printf("In line %d in positions %d to %d number: %d\n",
num_lines, char_pos, char_pos+yyleng-1, arv);
num_chars=num_chars+yyleng;
char_pos=char_pos+yyleng;
}

\n ++num_lines; ++num_chars; char_pos=0;
. ++num_chars;

%%

main()
{
yylex();
printf( "# of lines = %d, # of chars = %d\n",
num_lines, num_chars );
}

Selle teksti testimiseks (kui DOS-aknas oletuskataloog on FLEX-i programmi sisaldav kataloog \bin, see tekst on salvestatud failis text.lex ja selles kataloogis on ka arve sisaldava tekstifaili näidis pastxt.pas) tuleb anda käsud:

flex text.lex
gcc lexyy.c -otextscan
textscan.exe < pastxt.pas > textscan.txt

Programmi töö tulemusega võib nüüd tutvuda ükskõik millise tesktieditoriga; DOS-aknas võib seda teha käsuga

edit textscan.txt


Ülesandeid:
Tee skanner, mis interpreteerib aritmeetilisi avaldisi, s.t. asendab aritmeetilised avaldised nende väärtusega (arvutab selle).


Küsimused, probleemid:
jaak@cc.ttu.ee

Tagasi loengute sisukorra juurde