ceskyDJ / ifj-ial-project-code

Code of project to subjects IFJ and IAL on FIT BUT
1 stars 0 forks source link

Tabulka klíčových slov #28

Closed ceskyDJ closed 3 years ago

ceskyDJ commented 3 years ago

Úplně jsme zapomněli na to, že bude ještě třeba někde uchovávat klíčová slova, aby se mohl lexikální analyzátor s tím syntaktickým domluvit na tom, co má dělat, když je symbol zároveň identifikátorem. Takové symboly totiž nejsou v tabulce symbolů (tam jsou jen identifikátory - ano, matoucí, ale je to tak). Pro klíčová slova je tedy třeba také vytvořit tabulku (nebo "tabulku" - to je třeba zvážit).

Tato datová struktura má velkou výhodu v tom, že se její obsah nebude měnit (tedy je read-only). Jednou se naplní a poté se z ní bude pouze číst. Patrně bude tedy jednodušší vymyslet vhodnou datovou strukturu. Ta bude samozřejmě implementována jako abstraktní datový typ, tady je to dané.

Potřebné operace:

omnitex commented 3 years ago

Budeme mezi klíčová slova počítat i string, number, integer? Viz dotaz. Já bych byl pro

ceskyDJ commented 3 years ago

Jasně, když začínáme s implementací až teď (a tedy už o tom víme...), není co řešit.

omnitex commented 3 years ago

Krásně se na to hodí hash tabulka z úkolu do IAL :D

Možná, tak nějak...

ceskyDJ commented 3 years ago

Takže to uděláme jako tabulku rozptýlených hodnot?

omnitex commented 3 years ago

To mi přišlo jako nejpohodlnější řešení. Možná se mi nechtělo nic jiného vymýšlet. Pokud to prostě bude fungovat, tak s tím nemám problém

ceskyDJ commented 3 years ago

Dobrá tedy.

omnitex commented 3 years ago

Hele, co kdybych jen typedefnul symtable na kwtable (můj název pro tabulku klíčových slov) a pro kwtable_create() prostě vytvořil tabulku symbolů, nastrkal do toho klíčový slova a pak ji přetypoval na kwtable_t a vrátil. Stejně tak pro ostatní funkce. Jen udělat obal nad symtable. Nechce se mi totiž vymýšlet jak to udělat na míru jen pro klíčový slova. A jelikož času není nazbyt, tak bych to tak klidně udělal.

Je to prasárna, ale pokud to takhle uděláme zde i u tabulky řetězců, tak můžu začít dělat ten konečný automat a už zprovozňovat scanner, než řešit tyhle meh věci.

omnitex commented 3 years ago

No, je to krásně prostý. Doufám, že na to přistoupíš :D Protože pak se konečně můžeme pohnout...

Ale má to jednu vadu. Pro unit testy to je potřeba linkovat jak s kwtable.o tak symtable.o samozřejmě, což jednoduše asi nezajistíme. Takže a) nebudeme unit testovat, když to je jen malinkatý obal nad symtable, která otestovaná je (dráždím s dobrým úmyslem) nebo b) předělá se nějak Makefile nebo něco, aby se mohla do testů uvádět závislost mezi moduly (otázka je, zda je toto výjimečně nebo se situace v budoucnu může opakovat) nebo za c) a to, že se ti z toho postaví vlasy na hlavě a já budu muset psát dvě další implementace hash tabulky...

ceskyDJ commented 3 years ago

Moment, moment... Vždyť v té tabulce klíčových slov jde jen o to vytvořit seznam klíčových slov, aby na ně šlo ukazovat, ne?

omnitex commented 3 years ago

No ano, tak na to využiji tabulku symbolů :D Pokud to chceme jako ADT, tak se to bude muset stejně balit do typů a struktur a tak... to je moc práce dělat další jednodušší typ a pak další na tu tabulku řetězců.

Teď mě napadlo tohle naprosto jednoduchý řešení

char *keywords[NO_KEYWORDS] = {"if", "then", "else", ...};

char *get_keyword(char *name)
{
    for (int i = 0; i < KEYWORDS; i++) {
        if (!strncmp(name, keywords[i], MAX_KEYWORD_LEN)) {
            return keywords[i];
        }
    }
    return NULL;
}

Ale tam by se muselo navrhnout, jak z toho udělat ADT (čemuž jsem se chtěl vyhnout). Nebo to můžeme nechat takhle holý?

ceskyDJ commented 3 years ago

Twl... To je kanón na vrabce a ještě to nedává smysl (většina polí nevyužitá, ten ADT je navržen na něco jiného). Programování je o přemýšlení, ne o ťukání do klávesnice. Už jsem tady asi někde naznačil, jak bych to řešil.

De facto je to řešení, co jsi poslal do komentáře pořád lepší. I když by tedy chtělo to podle alokovat dynamicky, aby se mohlo předávat odkazem + udělat typedef. Potom ještě destruktor.

omnitex commented 3 years ago

Programování je o přemýšlení, ne o ťukání do klávesnice. Už jsem tady asi někde naznačil, jak bych to řešil.

Asi se mi v tom případě přemýšlet nechce, tak si to přiřaď na sebe, ať to můžeš vymyslet líp. Vím, že to je znásilnění, ale budeme další týden dělat review na tuhle novou věc a Pája ani ještě nezačal s tou zásobníkovou strukturou, takže pak budeme muset znásilňovat ještě víc, abychom aspoň to minimum urvali. Teď bude každý týden půlsemka, to je další čas pryč. Radši bych tenhle projekt měl naprosto hnusně ale funkčně než neměl.

ceskyDJ commented 3 years ago

@omnitex, jak to tedy vlastně uděláme? :D Jsme to lehce nedořešili, ne? Tabulku zrušit a udělat z toho typy tokenů? Takové řešení se mi přeci jen lehce nezdá :D.

Teď mě napadlo... Normálně to řešit tak, jak to je teď + tabulka. Ty se potom pomocí odkazu do tabulky mrkneš, co to vlastně a je vyřešeno, ne?

omnitex commented 3 years ago

Normálně to řešit tak, jak to je teď + tabulka.

Jak to je teď? Pokud se ti typy tokenů pro klíčová slova nelíbí, nevadí, bude to tedy tabulka. Pokud to máš víc a líp rozmyšlený, tak asi směle do toho.

ceskyDJ commented 3 years ago

Ok, díky. Mně to přidání dalších tokenů přijde nevhodné. Takhle to de facto zapadne do toho systému, který je i třeba pro vlastní symboly.