Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lfa:proiect:etapa1 [2021/10/31 16:17]
stefan.stancu [Ce primeste la input un lexer?]
lfa:proiect:etapa1 [2021/12/23 00:48] (current)
stefan.stancu [Etapa 1 - Lexer cu AFD-uri]
Line 1: Line 1:
 ====== Etapa 1 - Lexer cu AFD-uri ====== ====== Etapa 1 - Lexer cu AFD-uri ======
 +
 +**Checker si teste**: [[lfa:​proiect:​checker|Checker proiect LFA]].
  
 Etapa 1 consta in implementarea unui lexer simplu (in Python sau Haskell). Etapa 1 consta in implementarea unui lexer simplu (in Python sau Haskell).
Line 57: Line 59:
     * **Atentie: un alfabet valid poate contine orice simbol alfanumeric,​ prin urmare inclusiv SPATII ALBE**, care vor fi necesare pt implementarea etapei 4.     * **Atentie: un alfabet valid poate contine orice simbol alfanumeric,​ prin urmare inclusiv SPATII ALBE**, care vor fi necesare pt implementarea etapei 4.
   * ''<​token>''​ este **o linie** ce contine numele token-ului descris de AFD, deobicei scris cu litere mari (spre exemplu: ''​VARIABILA''​)   * ''<​token>''​ este **o linie** ce contine numele token-ului descris de AFD, deobicei scris cu litere mari (spre exemplu: ''​VARIABILA''​)
-  * ''<​stare_initiala>''​ este **o linie** ce contine un intreg ce desemneaza starea initiala a AFD-ului (deobicei ​0)+  * ''<​stare_initiala>''​ este **o linie** ce contine un intreg ce desemneaza starea initiala a AFD-ului (deo bicei 0)
   * ''<​stari_finale>''​ este **o linie** ce contine o secventa de intregi separati printr-un spatiu alb ce desemneaza starile finale (spre exemplu: ''​2 3''​)   * ''<​stari_finale>''​ este **o linie** ce contine o secventa de intregi separati printr-un spatiu alb ce desemneaza starile finale (spre exemplu: ''​2 3''​)
   * ''<​tranzitie_i>''​ este **o linie** condifica o tranzitie a AFD-ului, si are urmatoarea forma:   * ''<​tranzitie_i>''​ este **o linie** condifica o tranzitie a AFD-ului, si are urmatoarea forma:
-      * ''<​s>,<​c>,<​d>''​ unde ''<​s>''​ si ''<​d>''​ sunt intregi ce codifica starea //sursa// respectiv //​destinatie//,​ iar ''<​c>''​ este un caracter (poate fi orice caracter cu exceptia ​'''​\n'''​ si '',''​+      * ''<​s>,<​c>,<​d>''​ unde ''<​s>''​ si ''<​d>''​ sunt intregi ce codifica starea //sursa// respectiv //​destinatie//,​ iar ''<​c>''​ este un caracter (poate fi orice caracter cu exceptia ​ '',''​)
  
 ==== Ce intoarce la output un lexer? ==== ==== Ce intoarce la output un lexer? ====
Line 160: Line 162:
   - pregati o implementare de AFD care sa permita cele de mai sus, si a carei implementare va fi rafinata in urmatoarele etape. Oferim cateva sugestii:   - pregati o implementare de AFD care sa permita cele de mai sus, si a carei implementare va fi rafinata in urmatoarele etape. Oferim cateva sugestii:
      - implementarea unei clase ''​Stare'',​ care poate fi modificata (sau extinsa) ulterior      - implementarea unei clase ''​Stare'',​ care poate fi modificata (sau extinsa) ulterior
-     - codificarea starilor printr-o lista: ''​[s1,​ s2, ..., sn]'',​ in care elementele pot avea orice tip (profitam astfel de flexibilitatea typing-ului in Python). Dictionarul AFD-ului va folosi indecsii acestei liste si nu valorile efective. In felul asta, putem transforma transparent de dictionar ​valorile starilor, si evitam problema hashing-ului.+     - codificarea starilor printr-o lista: ''​[s1,​ s2, ..., sn]'',​ in care elementele pot avea orice tip (profitam astfel de flexibilitatea typing-ului in Python). Dictionarul AFD-ului va folosi indecsii acestei liste si nu valorile efective. In felul asta, putem transforma ​valorile starilor ​transparent ​fata de dictionar, si astfel sa evitam problema hashing-ului.
  
 ==== Igiena codului ==== ==== Igiena codului ====
Line 259: Line 261:
  
   * Vizitati functiile din biblioteca ''​Data.Map''​ si ''​Data.Set''​. Unele pot fi foarte utile pentru implementare   * Vizitati functiile din biblioteca ''​Data.Map''​ si ''​Data.Set''​. Unele pot fi foarte utile pentru implementare
-  * Refolositi functia ''​splitBy''​ de la PP+  * Refolositi functia ''​splitBy''​ de la PP.
   * Aruncati o privire peste functia ''​sortOn''​. Este mai simplu de folosit si mai performanta decat ''​sortBy''​.   * Aruncati o privire peste functia ''​sortOn''​. Este mai simplu de folosit si mai performanta decat ''​sortBy''​.
   * Aruncati o privire peste **list comprehensions**. Pot fi utile local.   * Aruncati o privire peste **list comprehensions**. Pot fi utile local.
 +  * Nu uitati de tipuri precum ''​Data.Maybe''​ si ''​Data.Either'',​ ar putea fi utile in anumite contexte.
  
 ==== Debugging ==== ==== Debugging ====