Etapa 1

De aici (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: <NUME_TOKEN_CU_MAJUSCULE><SPATIU><LEXEM_ASA_CUM_APARE_IN_INPUT>).

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 <alte module auxiliare> 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 (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 <python3|haskell>. 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 <input_file> <output_file>. Acesta trebuie sa va ruleze rezolvarea etapei pe fisierul <input_file> si sa scrie rezultatele in <output_file>.

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 <alte module auxiliare>.

Etapa 3

De aici (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 <token,lexem> conform formatului din cadrul fisierelor .ref (ex. de linie: <NUME_TOKEN_CU_MAJUSCULE><SPATIU><LEXEM_ASA_CUM_APARE_IN_INPUT>).
  • 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.