joi, 14 ianuarie 2010

Mic tutorial de lex/GNU flex

Acest mic tutorial va va spune, pe scurt, tot ce aveti nevoie pentru a face un program elementar de analiza sintactica n more cu GNU flex (da, inclusiv tema la LFA, care nu va va lua mai mult de 1h dupa ce cititi asta).

  • Ce dreq e GNU flex?
 Practic, este un wrapper peste C, un program care citeste dintr-un fisier o serie de reguli si genereaza un alt fisier cu cod sursa .c, care are vreo 1000 de linii de cod.

In esenta, reprezinta o serie de reguli de forma expresie regulata -> instructiuni de executat la gasirea ei in input.
  • Cum il folosesc?
Iei si instalezi programul de aici.  Scrii tot ce trebuie intr-un fisier .flex, si dupa rulezi "flex fisier.flex" dintr-o consola, si iti va genera lex.yy.c.
  • Bine bine da in ce consta mai exact?
Sunt 3 sectiuni in program, despartite prin "%%":
intro
%%
expresii regulate si instructiuni
%%
other code

  • Ce altceva mai trebuie sa stiu?
- Tot ce scrii intre %{ si %} va fi copiat direct in codul sursa generat (si de obicei astea se pun in intro sau other code, in functie de necesitati)
- o lista cu toate expresiile regulate pe care le stie se gaseste aici.
- yyin - pointer catre input. da, poti sa faci un yyin=fopen(argv[1],"r");
- yytext - in asta e memorata linia curenta analizata in fisier;
- yylex() - functia pe care trebuie sa o apelati din main sa intre in analizator
  • Exemple
Un program care numara de cate ori apare stringul "urasc poli" intr-un fisier:

%{
  int nr;

  /* aici se mai pot declara si alte variabile globale, sau functii pe care le veti folosi in program*/

%}

%%

"urasc poli" {printf("Da, si eu urasc poli!\n"); nr++;}
. {/*nu fa nimic pentru orice alt caracter*/}

%%
int main(int argc, char ** argv){
  nr=0;
  yyin=fopen(argv[1],"r");
  yylex();
  printf("nr = %i\n",nr);
  return 0;
}

2 comentarii:

  1. Am murit de râs când cineva a propus să scriu un joc (un program de la EGC de fapt) în flex :)

    RăspundețiȘtergere
  2. lol indeed. Desi nu vad scopul, practic oricum ar trebui sa pui tot codul intre %{%}, si partea de flex ar fi doar cod suplimentar, k nu cred ca chiar e nevoie sa parsezi ceva cand e vorba de grafica (decat, poate, daca ai o lista cu modelele 3d de desenat intr-un fisier text or smth)

    RăspundețiȘtergere