Differences
This shows you the differences between two versions of the page.
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 ==== |