Analýza CLI¶
Commands¶
Všechny commandy jsou child class abtraktní třídy AbstractCommand
.
AbstractCommand
:
string Name
- název příkazu
- má getter
string Description
- popisek příkazu
- má getter
void Help()
- metoda vypíše do konzole pomoc k příkazu
void Execute(string args[])
- args jsou parametry, každý příkaz má jiné
- metoda vykoná příkaz
Pro každý příkaz vytvořit vlastní třídu co dědí od AbstractCommand
Pamatovat, že počet parametrů je vždy o 1 větší než počet argumentů. První argument je vždy název příkazu.
Takže pokud je někde napsáno, že příkaz má 2 parametry, tak to znamená, se checkuje zda má args
alespoň 3 prvky. Na tohle bacha.
CheckCommand
- Zkontroluje program na syntaxi a statickou sémantiku - něco jako compile time checking
- nedědí přímo třídu
AbstractCommand
aleRunCommand
- volá se
Debugger
třída metodaStart()
- příklad použití:
check <inputfile> [-add|-override|-replace <libfile> ...]
- vstup - očekává alespoň 2 argumenty - (příkaz samotný) a název souboru. Dále nepovinný argument nějakou operaci (-add, -replace, -override), pak jakýkoli počet názvů souborů
- na pořadí knihoven záleží, ty spojují zleva do prava
- -add - přidá funkce z knihovny do hlavního programu. Pokud funkce se stejným názvem existuje, tak se nic nestane
- -replace - nahradí funkce z hlavního programu funkcemi z knihovny. Pokud funkce se stejným názvem neexistuje, tak se přidá
- -override - stejné jako
-replace
ale signatury funkcí se musí shodovat tedy ne jenom název ale i typ/počet parametrů a návratový typ
DebugCommand
- podobné jako
CheckCommand
ale používá se metodaStep()
. Zeptat se Vaňečka, kde je vůbec rozíl protože v komentářích má psáno, že se jedná o beta verzi a jestli mu to vůbec funguje nebo jenom dělá to samé coCheckCommand
. - debuguje program pomocí
Debugger
třídy a metodyStep()
, ta se volá v cyklu dokud to jde - příklad použití:
debug <inputfile> [-add|-override|-replace <libfile> ...]
- vstup - očekává alespoň 2 argumenty - (příkaz samotný) a název souboru. Dále nepovinný argument nějakou operaci (-add, -replace, -override), pak jakýkoli počet názvů souborů
- na pořadí knihoven záleží, ty spojují zleva do prava
- -add - přidá funkce z knihovny do hlavního programu. Pokud funkce se stejným názvem existuje, tak se nic nestane
- -replace - nahradí funkce z hlavního programu funkcemi z knihovny. Pokud funkce se stejným názvem neexistuje, tak se přidá
- -override - stejné jako
-replace
ale signatury funkcí se musí shodovat tedy ne jenom název ale i typ/počet parametrů a návratový typ
- podobné jako
MergeCommand
- přidává nebo odebírá funkce z programu
- příklad použití:
merge <program.fprg> [-add|-override|-replace|-remove <libfile> ...] [-out <output.fprg>]
- vstup - očekává alespon 4 argumenty - (příkaz samotný), název souboru, nějaká operace (-add, -replace, -remove, -override), pak jakýkoli počet názvů souborů, a optional přepínač -out za kterém pak následuje jméno výstupního souboru, jinak se přepíše soubor původní
- -add - přidá funkce z knihovny do hlavního programu. Pokud funkce se stejným názvem existuje, tak se nic nestane
- -replace - nahradí funkce z hlavního programu funkcemi z knihovny. Pokud funkce se stejným názvem neexistuje, tak se přidá
- -override - stejné jako
-replace
ale signatury funkcí se musí shodovat tedy ne jenom název ale i typ/počet parametrů a návratový typ - -remove - odebere funkce z hlavního programu. Aby se funkce z hlavního programu odebrala, musí být úplně totožné s funkcí v knihovně
- výstup - výstupní zmergovaný soubor
TestCommand
- příkaz pro unit testování
- příklad použití:
test <programTest> [-tests TestMethod1,...] [-timeout time]
- vstup - očekává 2 argumenty - (příkaz samotný) a název souboru. Dále nepovinný argument -tests, za kterým následuje seznam testovacích metod oddělených čárkou a dále nepovinný argument -timeout, za kterým následuje časový limit v sekundách
- -tests - pokud není přepínač použit tak se provedou všechny testovací metody
- -timeout - Jedná se o maximální dobu běhu jednoho testu. Defaultní hodnota je 20 sekund, 0 sekund je timeout.
- výstup - výpis výsledků testů do konzole, zda prošly nebo ne a jak dlouho trvaly + co se očekávalo za hodnotu a co se vrátilo
RunCommand
- spustí program
- příklad použití:
run <inputfile> [-add|-override|-replace <libfile> ...] [-noOutput] [-time]
- vstup - očekává alespoň 2 argumenty - (příkaz samotný) a název souboru. Dále přepínače (-add, -override, -replace) a názvy souborů. Dále přepínače -noOutput, který značí, že soubor nebude mít žádný výstup (předpokládám, že na konzoli) a -time, to znamená, že se bude měřit běh programu v milisekundách
- -add - přidá funkce z knihovny do hlavního programu. Pokud funkce se stejným názvem existuje, tak se nic nestane
- -replace - nahradí funkce z hlavního programu funkcemi z knihovny. Pokud funkce se stejným názvem neexistuje, tak se přidá
- -override - stejné jako
-replace
ale signatury funkcí se musí shodovat tedy ne jenom název ale i typ/počet parametrů a návratový typ
- výstup - žádný nebo výstup programu
InfoCommand
- vypíše informace o programu - jméno programu, autor, saved a about
- příklad použití:
info <program.fprg>
- vstup - očekává 2 arugmenty - (příkaz samotný) a název souboru
- výstup - výpis informací o souboru do konzole = jméno programu, autor, datum uloŽení, about
- v našem případě budeme vypisovat ješte ten unikátní hash
ConvertCommand
- konvertuje program do jiného jazyka - v našem případě do C# a Python
- příklad použití:
convert <infile> [<template.fpgt>] <outfile.(language extension)>
- vstup - očekává alespoň 3 argumenty - (příkaz samotný), jméno souboru a template file = šablona podle které to zkonvertuje do vybraného jazyka a nepovinný parametr pro název výstupního souboru, jinak se automaticky pojmenuje podle jazyka např
csharp.cs
nebopython.py
- výstup - kovertovaný soubor
Třída AbstractLoader
. To je podklad pro uložení do paměti různé typy souborů. Např, čtení .fprg souboru nebo souboru s pseudokódem.
To mi pravděpodobně nebudeme mít zapotřebí udělat protože máme interpretera. a nemusíme loadovat/analyzovat soubor.
Třída ProgramDatabase
je de facto úložiště pro metadata funkcí a příkazů. Ukládá si o jednotlivé programové řádce, z jakého souboru a funkce je. Na jakém řádku se nachází atd. To umožnuje přesouvání bloků kódu mezi soubory. ProgramDatabase
si udržuje všechny soubory v Dictionary<string, string[]>
, kde klíč = název souboru a hodnota = string[]
, kde každý string pŘedstavuje jednu řádku. Ostatní metody v této třídě víceméně aktualizují metadata. Nebudeme potřebovat protože máme interpretera ale bude třeba rozšířit příkazy o metadata a informace v jaké funkci se příkaz nachází, na jaké řádce je, atd.
Třída Debugger
která dělá debug nad programem. To mi nebudeme potřebovat protože bude mít debugger uvnitř našeho interpretera. U interpretera je ještě třeba doplnit informace ohledně současného řádku a breakpointy. V interpreterovi chybí možnost otevřít více souborů. Řešení buď jeden interpreter per soubor nebo interpreter na všechny soubory. Druhé řešení je asi lepší.
Aktualizováno uživatelem Duc Long Hoang před asi 1 rok · 6 revizí