===== Checker proiect LFA ===== ==== Etapa 1 ==== De aici ({{:lfa:proiect:checker_etapa1.zip|}}) puteti descarca arhiva ce contine checkere (pentru etapa 1) atat pentru variantele in Python, cat si in Haskell ale proiectului, sub forma fisierelor ''Tester.py'' si ''Tester.hs'', precum si directorul cu testele. Ambele testere presupun ca arhiva cu teste de care au nevoie pentru a rula (''T1'') se afla intr-un director numit ''tests/'', aflat la randul sau in cadrul directorului curent. Puteti schimba oricand asta prin modificarea variabilei TESTER_DIR din cadrul fisierului .py sau .hs. Checker-ele ofera un total de 107 puncte pentru prima etapa, dintre care 100 sunt distribuite in mod uniform pe primele seturi de teste T.1-10, ultimele 7 fiind distribuite in cadrul setului T1.11. ==== Detalii pentru Python3 ==== Checker-ul pentru Python3 se ruleaza dand o comanda de forma ''python3 Tester.py [-h] [--stage STAGE] [--set SET] [--test TEST]'', unde: * ''stage'' reprezinta indexul etapei testate (parametru optional; default: 1 **- pentru etapa 2, utilizati scriptul-ul checker.py de la sectiunea urmatoare**), * ''set'' reprezinta numele setului testat (parametru optional; ex.: T1.1) si * ''test'' reprezinta indicele testului din cadrul unui anumit set (parametru optional, trebuie specificat impreuna cu ''--set''; ex.: 1). Astfel, puteti testa fie o intreaga etapa (momentan doar etapa 1), fie un set dintr-o etapa, fie un anumit test dintr-un set dintr-o etapa. Script-ul ''Tester.py'' presupune ca se afla in acelasi director impreuna cu un fisier numit ''Lexer.py'', ce exporta o functie numita ''runlexer''. Functia ''runlexer'' primeste ca parametri (in ordine) calea catre un fisier **.lex** (ce contine specificatia lexicala sub forma unor AFD-uri), un fisier **.in** (ce contine sirul de lexat) si un fisier **.out**. In ultimul, ''runlexer'' va trebui sa printeze, pe cate o linie, perechile (token, lexem) conform formatului din fisierele .ref (ex. de linie: ''''). ==== Detalii pentru Haskell ==== Checker-ul pentru variantele in Haskell ale proiectului se gaseste sub forma unui modul cu numele ''Tester.hs'' si care exporta 3 functii principale: * runTest, ce primeste ca parametri indicele etapei (''Int''), numele unui set de teste (''String'') si indicele unui test (''Int'') si intoarce rezultatele lexer-ului vostru pe testul specificat * runSet, ce primeste ca parametri indicele etapei (''Int'') si numele unui set de teste (''String'') si intoarce rezultatele lexer-ului pe setul specificat * runAll, ce primeste ca parametru indicepe etapei (''Int'') si afiseaza rezultatele lexer-ului pe toate testele din cadrul etapei specificate. Pentru a utiliza in mod facil functiile puteti, in ghci, da comanda '':l Tester.hs Lexer.hs '' pentru a incarca modulul Tester impreuna cu Lexer si a rula direct functiile anterior mentionate. ''Tester.hs'' se asteapta sa se afle in acelasi director impreuna cu un alt modul numit Lexer.hs, care sa exporte o functie numita runLexer. Functia aceasta primeste ca parametri un ''String'' reprezentand continutul raw al unui fisier **.lex** si un ''String'' reprezentand sirul de caractere de lexat si intoarce o lista de perechi (token, lexem) de tipul ''[(String, String)]''. ==== Etapa 2 ==== Aici ({{:lfa:proiect:checker_etapa2.zip|}}) puteti gasi arhiva ce contine checker-ul pentru etapa a doua a proiectului. Acesta a fost creat atat pentru Python3, cat si pentru Haskell, si poate fi rulat dand o comanda de forma ''python3 checker.py ''. In plus, script-ul presupune ca se afla in acelasi director impreuna cu un folder numit ''tests/'', in care sa se afle la randul sau directorul ''T2'' cu subdirectoarele ''in'' si ''ref''. ==== Detalii pentru Python3 ==== Pentru Python3, este nevoie ca in directorul curent sa existe un fisier numit ''main.py'', ce sa poata fi rulat folosind comanda ''python3 main.py ''. Acesta trebuie sa va ruleze rezolvarea etapei pe fisierul '''' si sa scrie rezultatele in ''''. ==== Detalii pentru Haskell ==== Pentru Haskell, este nevoie ca in directorul curent sa existe un executabil numit ''Main'', compilat dintr-un modul numit ''Main.hs''. In arhiva de sus puteti gasi un schelet de ''Main.hs'' in care input-ul si output-ul au fost deja implementate, iar la care ramane doar sa atasati ce ati facut pana acum. Pentru a compila unul sau mai multe module Haskell intr-un executabil, puteti da comanda ''ghc -make Main.hs ''. ==== Etapa 3 ==== De aici ({{:lfa:proiect:checker_etapa3.zip|}}) puteti descarca arhiva ce contine checker-ul (''Tester.py'') de Python3 pentru Etapa 3, impreuna cu folder-ul de teste. Script-ul ''Tester.py'' este **o varianta imbunatatia a celui oferit pentru Etapa 1**. Ca urmare, acesta poate fi folosit pentru verificarea atat a primeia, cat si a celei de-a treia etape, **pastrand aceeasi functionalitate in cazul Etapei 1**. Punctajul total calculat de checker pentru Etapa 3.1 este de 107p, ce va fi scalat pentru a se incadra in maximul corespunzator de 0.7p. Pentru Etapa 3.2, punctajul este de 8p, fiind de asemenea scalat pentru a se incadra in maximul corespunzator de 0.3p. Pentru claritate, checker-ul afiseaza si nota finala pe etapa/subetapa pe care rulati (nu se aplica daca rulati doar un singur test sau set de teste). ==== Detalii pentru Python 3 ==== Checker-ul pentru Python3 se ruleaza dand o comanda de forma ''python3 Tester.py [-h] [--stage STAGE] [--set SET] [--test TEST]'', unde: * ''stage'' reprezinta indexul etapei testate (parametru optional; default: 1), pentru Etapa 3 putand fi 3, 3-regex sau 3-prog * ''set'' reprezinta numele setului testat (parametru optional; ex.: --set T3.1) * ''test'' reprezinta indicele testului din cadrul unui anumit set (parametru optional, trebuie specificat impreuna cu --set; ex.: --set T3.1 --test 1). Ca urmare, puteti testa fie o intreaga etapa, fie un set dintr-o etapa, fie un anumit test dintr-un set dintr-o etapa. Exceptie face rularea unui test specific din partea de parsare de program a etapei (3.2): **daca rulati cu --stage 3-prog, trebuie sa mentionati direct testul, fara set**. Fisierul ''Tester.py'' trebuie sa se afle in acelasi director impreuna cu un modul numit ''CompleteLexer.py'', ce exporta doua functii: ''runcompletelexer'' (pentru etapa 3.1) si ''runparser'' (pentru etapa 3.2). * Functia ''runcompletelexer'' va primi ca argumente (in ordine) calea catre fisierul ''.lex'' (ce contine specificatia lexicala, sub forma unor expresii regulate, a unui set de teste), calea catre un fisier ''.in'' (ce contine sirul de lexat) si calea catre un fisier ''.out'' unde va trebui sa printeze perechile '''' conform formatului din cadrul fisierelor ''.ref'' (ex. de linie: ''''). * Functia ''runparser'' va primi ca argumente (in ordine) calea catre un fisier de input si calea catre un fisier de output, unde va trebui sa printeze rezultatul parsarii programului de intrare confom formatului stabilit in scheletul ''ast.py''. ==== Detaii pentru Haskell ==== Verficarea in cadrul prezentarilor se va face manual impreuna cu asistentul/a de laborator.