Projekt

Obecné

Profil

Akce

Analýza CLI


Commands

Všechny commandy jsou child class abtraktní třídy AbstractCommand.

Vnitřní členy třídy 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 ale RunCommand
    • volá se Debugger třída metoda Start()
    • 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 metoda Step(). 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é co CheckCommand.
    • debuguje program pomocí Debugger třídy a metody Step(), 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
  • 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 nebo python.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í