{"id":16133680,"url":"https://github.com/gabboraron/fordprog-egyben","last_synced_at":"2026-07-06T08:31:35.416Z","repository":{"id":131753073,"uuid":"219365263","full_name":"gabboraron/fordprog-egyben","owner":"gabboraron","description":"2019 - 2020 | ősz | fordító programok | lex | bison | assembly","archived":false,"fork":false,"pushed_at":"2020-01-13T10:39:48.000Z","size":10844,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-28T12:31:43.357Z","etag":null,"topics":["bison-yacc","flex","lex","lexical-analysis","nasm-assembly","plang","regex","while-language","yacc-example"],"latest_commit_sha":null,"homepage":"https://deva.web.elte.hu/pubwiki/doku.php?id=fordprog:plang2019","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gabboraron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-03T21:03:50.000Z","updated_at":"2024-09-20T10:46:50.000Z","dependencies_parsed_at":"2023-06-05T21:15:11.239Z","dependency_job_id":null,"html_url":"https://github.com/gabboraron/fordprog-egyben","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gabboraron/fordprog-egyben","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabboraron%2Ffordprog-egyben","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabboraron%2Ffordprog-egyben/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabboraron%2Ffordprog-egyben/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabboraron%2Ffordprog-egyben/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gabboraron","download_url":"https://codeload.github.com/gabboraron/fordprog-egyben/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabboraron%2Ffordprog-egyben/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35184015,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bison-yacc","flex","lex","lexical-analysis","nasm-assembly","plang","regex","while-language","yacc-example"],"created_at":"2024-10-09T22:45:22.895Z","updated_at":"2026-07-06T08:31:35.361Z","avatar_url":"https://github.com/gabboraron.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fordító programok őszi félév\n**Tartalom:**\n- [Példakód](https://github.com/gabboraron/fordprog-egyben#példakód)\n- [A nyelv definíciója](https://github.com/gabboraron/fordprog-egyben#a-nyelv-definíciója)\n- [Lexikális elemző ~ 1. beadandó](https://github.com/gabboraron/fordprog-egyben#lexikális-elemző-1-beadandó)\n  - [A lexikális elemző érdekesebb részei](https://github.com/gabboraron/fordprog-egyben#megoldás-érdekes-részei)\n  - [regex összefoglaló](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#ezekhez-felhasználjuk-a-regexeket)\n  - [gyakori hibaüzentek](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#gyakori-hibaüzenetek)\n  - [csttabi féle youtube tutorial](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#csttabi-féle-youtube-tutorial)\n- [Szintaktikus elemző ~ 2. beadandó](https://github.com/gabboraron/fordprog-egyben#szintaktikus-elemző-2-beadandó)\n  - [gyakori hibaüzenetek](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#hibaüzenetek)\n  - [csttabi féle Youtube tutorial](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#csttabi-féle-youtube-tutorial-1)\n- [Szemantikus ellenörző ~ 3. beadandó](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#szemantikus-elemző-3beadandó)\n  - [Tutorial](https://github.com/gabboraron/fordprog-egyben#tutorial): [1](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#1-lépés), [2](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#2-lépés), [3](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#3-lépés), [4](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#4-lépés), [5](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#5-lépés) \n  - [Összefoglalás](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#összefoglalás-a-szemantikus-ellenőrzésről)\n- [Kódgenerálás ~ 4. beadandó](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#kódgenerálás)\n- [Nyelv kiegészítése (vizsgafeladatok)](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#nyelv-kiegészítése-vizsgafeladatok)\n  - [`String`](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#string)\n- [Irodalom, jegyzetek, példák, előadás anyag, könyvek](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#irodalom)\n  - [xxi századi fordító programok](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#xxi-századi-fordító-programok-youtube)\n- [Szoftverkörnyezet](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#szoftverkörnyezet)  \n  \n  \n---\n\n## Példakód:\n**Példaprogram:** \n````\n# A legkisebb valodi oszto meghatarozasa.\nPROGRAM oszto\nVALTOZOK:\n  EGESZ a\n  EGESZ i\n  EGESZ oszto\n  LOGIKAI vanoszto\nUTASITASOK:\n  BE: a\n  vanoszto := HAMIS\n  i := 2\n  CIKLUS AMIG NEM vanoszto ES i \u003c a\n    HA a % i = 0 AKKOR\n      vanoszto := IGAZ\n      oszto := i\n    HA_VEGE\n    i := i+1\n  CIKLUS_VEGE\n  HA vanoszto AKKOR\n    KI: vanoszto\n    KI: oszto\n  KULONBEN\n    KI: vanoszto\n  HA_VEGE\nPROGRAM_VEGE\n````\nMég több példa a [tesztfájlokban](https://github.com/gabboraron/fordprog-egyben/blob/master/plang-2019-tesztfajlok.zip)\n\n## A nyelv definíciója\neredeti leírás és bővebben: https://deva.web.elte.hu/pubwiki/doku.php?id=fordprog:plang2019\n\na PLanG nyelvről bővebben: http://digitus.itk.ppke.hu/~flugi/bevprog_1415/plang.html\n\n### Karakterek\n\nA forrásfájlok a következő `ASCII` karaktereket tartalmazhatják:\n\n- az angol abc kis és nagybetűi\n- számjegyek (0-9)\n- `():+-*/%\u003c\u003e=_#`\n- szóköz, tab, sorvége\n- megjegyzések belsejében pedig tetszőleges karakterek állhatnak\nMinden más karakter esetén hibajelzést kell adnia a fordítónak. A nyelv case-sensitive, azaz számít a kis és nagybetűk közötti különbség.\n\n### Kulcsszavak\n\nA nyelv kulcsszavai a következők: `PROGRAM`, `PROGRAM_VEGE`, `VALTOZOK:`, `UTASITASOK:`, `EGESZ`, `LOGIKAI`, `IGAZ`, `HAMIS`, `ES`, `VAGY`, `NEM`, `SKIP`, `HA`, `AKKOR`, `KULONBEN`, `HA_VEGE`, `CIKLUS`, `AMIG`, `CIKLUS_VEGE`, `KI:`, `BE:`\n\n### Azonosítók\n\nA változók nevei, illetve a program neve kis- és nagybetűkből, _ jelből és számjegyekből állhatnak, de nem kezdődhetnek számjeggyel, és nem ütközhetnek egyik kulcsszóval sem.\n\n### Típusok\n\n- `EGESZ`: négy bájtos, előjel nélküli egészként kell megvalósítani; konstansai számjegyekből állnak, és nincs előttük előjel\n- `LOGIKAI`: egy bájton kell ábrázolni, értékei: `HAMIS`, `IGAZ`\n\n### Megjegyzések\n\nA `#` karakteretől a sor végéig. Megjegyzések a program tetszőleges pontján előfordulhatnak, a fordítást és a keletkező programkódot nem befolyásolják.\n\n### A program felépítése\n\nA `PROGRAM` kulcsszóval kezdődik (amit egy tetszőleges azonosító, a program neve követ) és a `PROGRAM_VEGE` kulcsszóval fejeződik be. (Ezek előtt illetve után csak megjegyzések állhatnak.) A változódeklarációk a program elején találhatóak, és a `VALTOZOK:` szöveg vezeti be őket. A deklarációs rész opcionális, de ha a `VALTOZOK:` szöveg megjelenik, akkor legalább egy változót deklarálni kell. A deklarációk után a program utasításai következnek, ezt a részt az `UTASITASOK:` szöveg vezeti be, és legalább egy utasítást tartalmaznia kell.\n\n### Változódeklarációk\n\nMinden változót a típusának és nevének megadásával kell deklarálni, több azonos típusú változó esetén mindegyikhez külön ki kell írni a típust.\n\n### Kifejezések\n\n- `EGESZ` típusú kifejezések: számkonstansok, `EGESZ` típusú változók és az ezekből a `+` (összedás), `-` (kivonás), `*` (szorzás), `/`  (egészosztás), `%` (maradékképzés) infix operátorokkal és zárójelekkel a szokásos módon felépített kifejezések.\n- `LOGIKAI` típusú kifejezések: az `IGAZ` és `HAMIS` literálok, `LOGIKAI` típusú változók, két `EGESZ` típusú kifejezésből az `=` (egyenlőség), `\u003c` (kisebb), `\u003e` (nagyobb), `\u003c=` (kisebbegyenlő), `\u003e=` (nagyobbegyenlő) infix operátorokkal előállított, valamint az ezekből `ES` (konjunkció), `VAGY` (diszjunkció), `=` (egyenlőség) infix és a `NEM` (negáció) **prefix** operátorral és zárójelekkel a szokásos módon felépített kifejezések.\n- Az infix operátorok mind balasszociatívak és a precedenciájuk növevő sorrendben a következő:\n  - `VAGY`\n  - `ES`\n  - `=`\n  - `\u003c \u003e \u003c= \u003e=`\n  - `+ -`\n  - `* / %`\n\n### Utasítások\n\n- `SKIP` utasítás: a változók értékeinek megváltoztatása nélküli továbblépés.\n- Értékadás: az `:=` operátorral. Baloldalán egy változó, jobboldalán egy - a változóéval megegyező típusú - kifejezés állhat.\n- Olvasás: A `BE:` utasítás a megadott változóba olvas be egy megfelelő típusú értéket a standard bementeről. (Megvalósítása: meg kell hívni a be eljárást, amit a negyedik beadandó kiírásához mellékelt C fájl tartalmaz. A beolvasott érték `EGESZ` típus esetén az eax, `LOGIKAI` típus esetén az al regiszterben lesz.)\n- Írás: A `KI:` utasítás a megadott kifejezés értékét a standard kimenetre írja (és egy sortöréssel fejezi be). (Megvalósítása: meg kell hívni a `ki_egesz` (vagy a `ki_logikai`) eljárást, amit a 4. beadandó leírásához mellékelt C fájl tartalmaz. Paraméterként a kiírandó értéket (mindkét esetben 4 bájtot) kell a verembe tenni.)\n- Ciklus: `CIKLUS AMIG feltétel utasítások CIKLUS_VEGE` alakú. A feltétel logikai kifejezés. A ciklus utasításlistája nem lehet üres. A megszokott módon, elöltesztelős ciklusként működik.\n- Elágazás: `HA feltétel AKKOR utasítások HA_VEGE` vagy `HA feltétel AKKOR utasítások` `KULONBEN utasitasok HA_VEGE` alakú. A feltétel logikai kifejezés. Az egyes ágak utasításlistái nem lehetnek üresek. A megszokott módon működik.\n\n---\n\n## Lexikális elemző (1. beadandó)\n**Feladat:**\n\u003e Lexikális hiba észlelése esetén hibajelzést kell adni, ami tartalmazza a hiba sorának számát; ezután a program befejeződhet, nem kell folytatni az elemzést.\n\u003e \n\u003e a megoldáshoz szükséges egy `flex` és egy `C++` fájl\n\n**Fájlok:** [saját megoldás](https://github.com/gabboraron/fordprog-egyben/tree/master/elso_beadando) illetve [múlt félévből](https://github.com/gabboraron/fordprog-beadando1) valamint a [hivatalos példaprogram](https://github.com/gabboraron/fordprog-egyben/blob/master/lexikalis-pelda%20(2).zip), [hivatalos, tanári megoldás](https://github.com/gabboraron/fordprog-egyben/blob/master/1-lexikalis%20(1).zip), [régebbi WHILE feladatra adott megoldás](https://github.com/gabboraron/fordprog-egyben/tree/master/1-lexikalis)\n\n**Flex tutorial** [kifejtve futtatható példaprogramokkal itt](https://github.com/gabboraron/fordprog-1-flex)\n\n**Teszteléshez** a [hivatalos tesztfájlok](https://github.com/gabboraron/fordprog-egyben/blob/master/plang-2019-tesztfajlok.zip)at érdemes lehet [kiegészíteni még pár fájllal](https://github.com/gabboraron/fordprog-egyben/commit/70970ef1c854e79de35469b18a769154fcd1c870)\n### Fordítás és futtatás\n- futtassuk: `flex flex1.l`\n- keletkezik egy `lex.yy.cc` fájl benne `C++` kóddal\n- fordítsuk: `g++ -o flex1 lex.yy.cc`\n- a fordítás eredménye `flex1` futtatható állomány\n- futtassuk paraméterezve `input.txt`:ekkor az `input.txt` tartalma jelenik meg standar kimeneten\n\n### Megoldás érdekes részei:\nEzekhez a formákhoz igen hasznosak a [Flex regexei](https://github.com/gabboraron/fordprog-1-flex#flex-regex). \n\u003e A legegyszerűbb, legelemibb elemeket megadjuk [makrónak](https://github.com/gabboraron/fordprog-1-flex#flex)\n````\nDIGIT\t\t    [0-9]\nWS  \t\t\t  [ \\t\\n]\nCHAR  \t\t\t[a-zA-Z]\nUNDERSCORE\t\"_\"\n````\n\u003e A [kulcsszavakat](https://github.com/gabboraron/fordprog-egyben#kulcsszavak), [kifejezéseket](https://github.com/gabboraron/fordprog-egyben#kifejezések), [típusokat](https://github.com/gabboraron/fordprog-egyben#típusok) stb, egyéb a nyelvben konkrétan szereplő szavakat lekezeljük az alábbi módon:\n````\nPROGRAM_VEGE      std::cout \u003c\u003c \"kulcsszo: PROGRAM_VEGE\" \u003c\u003c std::endl;\nVALTOZOK:         std::cout \u003c\u003c \"kulcsszo: VALTOZOK:\"\t\u003c\u003c std::endl;\nUTASITASOK:       std::cout \u003c\u003c \"kulcsszo: UTASITASOK:\" \t\u003c\u003c std::endl;\n````\n\u003e Reguláris kifejezésekkel megadhatjuk a komplexebb konstrukciókat, pl: a [karakterek](https://github.com/gabboraron/fordprog-egyben#karakterek) formáit, vagy a whitespacek kezelését, illetve a [megjegyzéseket](https://github.com/gabboraron/fordprog-egyben#megjegyzések)\n````\n{DIGIT}+   \t\tstd::cout \u003c\u003c \"karakter(ek): \" \t\t \u003c\u003c YYText()\u003c\u003c std::endl;\n{WS}+    \t\t  std::cout \u003c\u003c \"ureskarakter(ek): \"  \u003c\u003c YYText()\u003c\u003c std::endl;\n\"#\"+.*+\\n\t \t  std::cout \u003c\u003c \"megjegyzes: \"   \t   \u003c\u003c YYText()\u003c\u003c std::endl;\n````\n\u003e ugyanígy megadhatjuk az [azonosítókat](https://github.com/gabboraron/fordprog-egyben#azonosítók) is\n```\n({CHAR}|{UNDERSCORE})+({CHAR}|{DIGIT}|{UNDERSCORE})*\t\t\tstd::cout \u003c\u003c \"azonosito: \" \u003c\u003c YYText() \u003c\u003c std::endl;\n```\n\n### Ezekhez felhasználjuk a regexeket.\n\u003e\n\u003e Regexekről bővebben: [részletes regex magyarázat](https://github.com/gabboraron/fordprog-1-flex#flex-regex), illetve [aalborgi egyetemi anyag](https://people.cs.aau.dk/~marius/sw/flex/Flex-Regular-Expressions.html)\n\u003e \n\u003e _**Fontosabb regexek:**_\n\u003e\n\u003e **`\\`   - escape operátor, a rákövetkezőt semlegesíti**\n\u003e\n\u003e `.`     - bármi kivéve új sor\n\u003e\n\u003e `[abc]` - bármiylen karakter ezek között, megfelel ennek: `[a-c]`\n\u003e\n\u003e `(r)`   - `r`re illeszkedik a precedencia felülírásával\n\u003e\n\u003e `a?`    - 0 vagy 1 `a`\n\u003e\n\u003e `a+`    - 1 vagy több `a`\n\u003e\n\u003e `a*`    - 0 vagy több `a`\n\u003e\n\u003e `^a`    - `a` karakter a sor **elején**\n\u003e \n\u003e `a$`    - `a` karkater a sor **végén**\n\u003e \n\u003e `a/b`    - `a` de csak ha `b` követi\n\n### gyakori hibaüzenetek\n#### nem illeszkedő minta\n\u003e a sorrendben a legelső illeszkedő mintát fogja figyelembe venni. [hasonló Stackowerflow kérdés](https://stackoverflow.com/questions/58780981/why-the-last-rule-matching-in-my-lex-file-when-i-have-better-rules)\n\n### csttabi féle Youtube tutorial\n#### Fordítóprogramok flex lexikális elemzés 01 - csttabi\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=6xn36w6x0kg\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/6xn36w6x0kg/0.jpg\" \nalt=\" Fordítóprogramok flex lexikális elemzés 01 - csttabi\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok flex lexikális elemzés 02 - csttabi\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=xB-Xj520OEs\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/xB-Xj520OEs/0.jpg\" \nalt=\" Fordítóprogramok flex lexikális elemzés 02 - csttabi\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok flex lexikális elemzés 03 - csttabi\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=B1I7C8INTCA\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/B1I7C8INTCA/0.jpg\" \nalt=\" Fordítóprogramok flex lexikális elemzés 03 - csttabi\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok flex lexikális elemzés 04 - csttabi\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=PuHJY9JQCyk\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/PuHJY9JQCyk/0.jpg\" \nalt=\" Fordítóprogramok flex lexikális elemzés 04 - csttabi\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok flex lexikális elemzés 05 - csttabi\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=AVuIyG6peNQ\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/AVuIyG6peNQ/0.jpg\" \nalt=\" Fordítóprogramok flex lexikális elemzés 05 - csttabi\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok flex lexikális elemzés 06 - csttabi\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=i5xEkDzoe6g\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/i5xEkDzoe6g/0.jpg\" \nalt=\" Fordítóprogramok flex lexikális elemzés 06 - csttabi\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok flex lexikális elemzés 07 - csttabi\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=uhrSQyY2hX8\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/uhrSQyY2hX8/0.jpg\" \nalt=\" Fordítóprogramok flex lexikális elemzés 07 - csttabi\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n---\n\n## Szintaktikus elemző (2. beadandó)\n**Feladat:**\n\u003e a programnak parancssori paraméterben lehessen megadni az elemzendő fájl nevét\n\u003e\n\u003e a program minden alkalmazott szabályhoz egy sort írjon a képernyőre, például\n\u003e\n\u003e a tesztfájlok közül a `lexikalis_hibas` és `szintaktikus_hibas` kiterjesztésű fájlokra kell hibát jelezni, a többit el kell fogadni.\n\nA PLanG nyelv összes szükséges szabályátirata: http://digitus.itk.ppke.hu/~flugi/bevprog_1415/atiras.html\n\n**Fájlok:** [saját megoldás](https://github.com/gabboraron/fordprog-egyben/tree/master/szintaktikus-pelda-ver2), [mintaprogram, amiből érdemes kiindulni](https://github.com/gabboraron/fordprog-egyben/blob/master/szintaktikus-pelda%20(1).zip), [hivatalos tanári megoldás](https://github.com/gabboraron/fordprog-egyben/blob/master/2-szintaktikus.zip), illetve [korábbi félév anyagai](https://github.com/gabboraron/fordprog-2-bisoncpp), [régebbi WHILE feladatra adott megoldás](https://github.com/gabboraron/fordprog-egyben/tree/master/2-szintaktikus)\n### Fordítás és futtatás\n**Fordítás:** \n```\nflex calculate.l\nbisonc++ calculate.y\n```\n*ekkkor keletkezik: `Parserbase.h`, `Parser.ih`, `Parser.h`,`parse.cc`*\n\n*a `Parser.ih`, `Parser.h` nem kerül felülírásra legközelbb, így futtatható*\n```\ng++ -ocalculate calculate.cc parse.cc lex.yy.cc\n```\n**Futtatás:**\n`./calculate example.calculate`\n\n\u003e A folyamat során `C++ scanner`ek generálódnak, erről bővebben itt: [dinosaur.compilertools.net](http://dinosaur.compilertools.net/flex/flex_19.html)\n\n### Hibaüzenetek\n[Gyakori hibaüzenetek kifejtése korábbról](https://github.com/gabboraron/fordprog-2-bisoncpp#hibaüzenetek-errorok)\n\n#### `yyparse/yylex/yyerror was not declared in this scope`\n\u003e az `y` fájlban figyeljünk a `%` lezárásokra [stackowerflow](https://stackoverflow.com/questions/38143828/yyparse-yylex-yyerror-was-not-declared-in-this-scope-flex-bison)\n\n#### `multiple definition of 'yylineno'`\n\u003e ha több parserünk van akkor külön kell őket elneveznünk. [Stackowerflow válasz](https://stackoverflow.com/a/53448329/6274697)\n\n#### `warning, rule cannot be matched`\n\u003e van korábban illeszkedő minta a mintánkra az **`l` fájlban** , pl: *kulcsszavak* előtt *változónév*, sorrendmegfordítás megoldja. [Bővebben kifejtve](https://github.com/gabboraron/fordprog-2-bisoncpp#warning-rule-cannot-be-matched)\n\n#### `Shift/Reduce Conflicts` ~ léptetés-redukálás konfliktus\n\u003e korábban illeszkedő minta a szabályok között az **`y` fájlban**. [Bővebben kifejtve](https://github.com/gabboraron/fordprog-2-bisoncpp#shiftreduce-conflicts)\n\n#### `Reduce/Reduce Conflicts` ~ redukálás-redukálás konfliktus\n\u003e Többféle úton jut el ugyanahhoz a *terminális*hoz, [bővebben kifejtve](https://github.com/gabboraron/fordprog-2-bisoncpp#reducereduce-conflicts)\n\n\u003e Továbbá érdemes odafigyelni, hogy a [megfelelő header fájlokat használjuk](https://github.com/gabboraron/fordprog-egyben/blob/master/szintaktikus-pelda-ver2/Parser.h).\n\n**Hasznos linkek:**\n[http://www.jonathanbeard.io/tutorials/FlexBisonC++](http://www.jonathanbeard.io/tutorials/FlexBisonC++)\n\n### csttabi féle Youtube tutorial\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 1.\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=NBYM_EhJrZ8\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/NBYM_EhJrZ8/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 1.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 2.\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=kEy9W0Wk1UM\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/kEy9W0Wk1UM/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 2.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 3.\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=LEIV5_Uh3tA\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/LEIV5_Uh3tA/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 3.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 4.\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=CggHKaxOeks\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/CggHKaxOeks/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 4.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 5.\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=BzG2ksM0W1U\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/BzG2ksM0W1U/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 5.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 6.\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=2jc6hIwjaJc\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/2jc6hIwjaJc/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 6.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 7.\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=Epe0o5TJNW8\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/Epe0o5TJNW8/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 7.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 8.\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=kS25UUfZCcI\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/kS25UUfZCcI/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 8.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 9.\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=hXDKcYBM4zM\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/hXDKcYBM4zM/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 9.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n#### Fordítóprogramok bisonc++ szintaktikus-hiba 10. (nyelv kiegészítése egyéb pár szabályal, típussal, stb)\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=GClzg-5BXNc\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/GClzg-5BXNc/0.jpg\" \nalt=\"Fordítóprogramok bisonc++ szintaktikus-hiba 10.\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n---\n\n## Szemantikus elemző (3.beadandó)\n**Feladat:**\n\u003e A kód szemantikai ellenőrzése\n\n**Fájlok:** [példakód](https://github.com/gabboraron/fordprog-egyben/blob/master/szemantikus-pelda.zip), [régebbi WHILE feldatra adott megoldás](https://github.com/gabboraron/fordprog-egyben/tree/master/3-szemantikus), [előző félév anyaga](https://github.com/gabboraron/fordprog-osszefoglalo#3---szemantikus), [mintamegoldás](https://github.com/gabboraron/fordprog-egyben/blob/master/3-szemantikus.zip), [saját megoldás](https://github.com/gabboraron/fordprog-egyben/tree/master/szemantikus-ellenorzo)\n\n### Tutorial:\nforrás: [deva.web.elte.hu/szemantikus.hu.html](http://deva.web.elte.hu/szemantikus.hu.html)\neredeti tutorial fájlok és teszteseteik: [tutorial](https://github.com/gabboraron/fordprog-egyben/commit/c4015e3a14d0a38ff07b659307377892d982bb53) \n\n#### 1. lépés\n\nEbben a tananyagban egy olyan nyelvet fogunk használni, amelynek alapelemei a nemnegatív egész számok, a logikai literálok és változók. A változókat a program elején kell deklarálni. A deklarációk után értékadások sorozata következik. Ezek bal oldalán egy változó, jobb oldalán egy változó vagy egy literál szerepel. Egy példaprogram:\n\n````\nnatural n\nnatural m\nboolean b\nn := 0\nb := true\nm := n\n````\n\n- Töltsd le a nyelv [lexikális és szintaktikus elemzőjét](https://github.com/gabboraron/fordprog-egyben/tree/master/assign1) valamint a [tesztfájlokat](https://github.com/gabboraron/fordprog-egyben/tree/master/assign1/peldak)!\n- Nézd át a flex forrást ([assign.l](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/assign.l)) és a bisonc++ forrást ([assign.y](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/assign.y))!\n- A [Parser.h](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/Parser.h) és [Parser.ih](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/Parser.ih) fejállományokat a bisonc++ generálta az első futtatásakor, de ezekbe beleírhatunk.\n- A [Parser.h](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/Parser.h) fejállományba felvettük a lexikális elemzőt adattagként, és hozzáadtunk egy konstruktort, ami inicializálja azt.\n- A [Parser.ih](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/Parser.ih) implementációs fejállományban implementáltuk a lex függvényt, ami továbbítja lexikális elemző által felismert tokeneket a szintaktikus elemzőnek, és beállítja a szintaktikus elemző `d_loc__` mezőjét arra pozícióra, ahol az elemzés éppen tart a forrásszövegben! Ugyanebben a forrásfájlban a hibakezelést végző `error` függvényt is módosítottuk.\n- Fordítsd le a projektet a `make` paranccsal (vagy \"kézzel\", a flex, bisonc++ és g++ segítségével)!\n- Futtasd a programot a helyes, a [lexikális hibás](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/peldak/2.lex-hibas) és a [szintaktikus hibás](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/peldak/3.szintaktikus-hibas) példákra!\n- Figyeld meg, hogy a program nem jelez hibát a [szemantikus hibás](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/peldak/4.szemantikus-hibas) példákra! Ennek a feladatsornak az a célja, hogy kiszűrjük ezeket a hibákat.\n\n#### 2. lépés\n\nSzimbólumtáblát szeretnénk létrehozni. Az egyszerűség kedvéért ezt a C++ standard könyvtárának `map` adattípusával fogjuk megvalósítani. A map kulcsa a változó neve (`string`) lesz, a hozzárendelt érték pedig tartalmazni fogja a változó típusát és a deklarációjának sorát. A szükséges C++ kódot egy új fejállományba, a [semantics.h]() fájlba írjuk.\n\n- A [semantics.h](https://github.com/gabboraron/fordprog-egyben/commit/c5f8c306f3a443d8826dbf9505335e732c9ccfcf#diff-4372faf2015e5853c06e90c1b95d6c33) fájlban include-old az `iostream`, `string` és `map` standard fejállományokat!\n- Hozz létre ugyanitt egy felsorolási típust a programnyelvben előforduló két típus reprezentálásához!\n  `enum type { natural, boolean };`\n- Készíts egy `var_data` nevű rekord típust, amit az egyes változókhoz hozzárendelt adatok tárolására fogunk használni. Két mezője legyen:\n  - `decl_row` azt fogja tárolni, hogy az adott változó a program hányadik sorában volt deklarálva.\n  - `var_type` a változó típusát tárolja. Ez a mező az imént definiált type típusú legyen!\n- Írj a `var_data` rekordhoz egy két paraméteres konstruktort is, hogy könnyen lehessen inicializálni az ilyen típusú objektumokat létrehozásukkor. Legyen továbbá egy nulla paraméteres (üres törzsű) konstruktor is, mert erre majd szükség lesz akkor, amikor ilyen típusú elemeket akarunk egy `map`-ben tárolni!\n- A *[Parser.h](https://github.com/gabboraron/fordprog-egyben/commit/c5f8c306f3a443d8826dbf9505335e732c9ccfcf#diff-225c1abddd1957a6be382bcc2a7df431)* fejállományban add hozzá a Parser osztály privát adattagjai közé a szimbólumtáblát:\n  `std::map\u003cstd::string,var_data\u003e szimbolumtabla;`\n- Az *[assign.y](https://github.com/gabboraron/fordprog-egyben/commit/c5f8c306f3a443d8826dbf9505335e732c9ccfcf#diff-8fc56131b7aa5e0826468f24b4798841)* fájl elején cseréld le a `%baseclass-preinclude` direktívában az `\u003ciostream\u003e` fejállományt `\"semantics.h\"`-ra, hogy az imént készített fejállomány része legyen a projektnek!\nPróbáld lefordítani a projektet, és javítsd az esetleges hibákat!\n\n#### 3. lépés\n\nAz [assign.y](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/assign.y) fájlban a deklarációk szintaxisát leíró szabályhoz szeretnénk majd egy olyan akciót írni, ami az adott változót beszúrja az adataival együtt a szimbólumtáblába. Ehhez a következőkre van szükség:\n- A deklaráció sorának száma: ez a `d_loc__.first_line` érték lesz, amit a `lex` függvény állít be. ([Lásd az 1. lépést!](https://github.com/gabboraron/fordprog-egyben/blob/master/README.md#1-lépés))\n- A változó típusa: ez onnan derül ki, hogy éppen melyik szabály-alternatíva az aktív (`NATURAL IDENT` vagy `BOOLEAN IDENT`).\n- A változó neve: ezt csak a lexikális elemző tudja! El kell érnünk, hogy ez továbbításra kerüljön a szintaktikus elemzőhöz.\nA bisonc++ megengedi, hogy tetszőleges (terminális vagy nemterminális) szimbólum mellé egy ún. szemantikus értéket (lásd az előadás anyagában: [attribútum](http://deva.web.elte.hu/fordprog/11-ATG-handout.pdf)) rendeljünk. Mivel különböző szimbólumokhoz különböző típusú szemantikus érték rendelhető, ezért létre kell hoznunk egy unió típust ezekhez. Erre a bisonc++ külön szintaxist biztosít, amiből majd egy valódi C++ unió típust fog generálni. Ennek most egyetlen sora lesz, hiszen kezdetben csak a változókhoz szeretnénk szemantikus információként hozzárendelni a nevüket.\n- Az assign.y fájlhoz az első `%token` deklaráció elé add hozzá a következőt:\n```\n%union\n{\n  std::string *szoveg;\n}\n```\n- Ennek az uniónak a mezőneveit használhatjuk arra, hogy meghatározzuk az egyes szimbólumokhoz rendelt szemantikus értékek típusát. Egészítsd ki az azonosító tokent így: `%token \u003cszoveg\u003e IDENT;`\n- Az azonosító tokeneknek most már lehet szemantikus értéke (string), de ezt be is kell állítanunk valahol. A terminálisok szemantikus értékét a lex függvény tudja beállítani. (Lásd az előadás anyagában: *kitüntetett szintetizált attribútum*.) Egészítsd ki a [lex függvényt (még a return előtt)](https://github.com/gabboraron/fordprog-egyben/commit/9199980f1e9a4339f950055f7d740ad699dae8a6#diff-682b9c0994e5c0cdfc7c9aa502ae653e) a következő sorokkal:\n```\nif( ret == IDENT )\n{\n  d_val__.szoveg = new std::string(lexer.YYText());\n}\n```\n*(Az `YYText()` függvénnyel lehet elkérni a flex-től a felismert token szövegét. Ebből létrehozunk egy `string`-et. A Parser osztály `d_val__` adattagja olyan unió típusú, amit az imént az assign.y fájlba írtunk. Ennek a szoveg mezőjébe írhatjuk a szöveget.)*\n\nMost már elérjük az [assign.y](https://github.com/gabboraron/fordprog-egyben/commit/9199980f1e9a4339f950055f7d740ad699dae8a6#diff-8fc56131b7aa5e0826468f24b4798841) fájlban a szabályok mögé írható akciók belsejében az azonosítókhoz tartozó szövegeket. Az `a: A B C` szabály esetén az `A` szimbólum szemantikus értékére `$1`, a `B` szimbóluméra `$2`, a `C` szimbóluméra `$3` hivatkozik. Ezek típusának megállapításához meg kell néznünk, hogy az unió típusnak melyik mezőjét rendeltük hozzá az adott szimbólumhoz. Ennek a mezőnek a típusa lesz a szemantikus érték típusa. (Esetünkben `string*`.)\n- A deklarációkra vonatkozó szabályalternatívákat egészítsd ki úgy, hogy kiírják a standard kimenetre az éppen deklarált változó nevét!\n```\nNATURAL IDENT\n{\n  std::cout \u003c\u003c *$2 \u003c\u003c std::endl;\n}\n```\n- Futtasd a helyes példára a programot!\n\n#### 4. lépés\n\nAhelyett, hogy a standard kimenetre írnánk a deklarált változók nevét, most betesszük az adataikat a szimbólumtáblába. A `map` adattípusnak van `[]` operátora, ennek segítségével lehet beállítani és lekérdezni az adott kulcshoz tartozó értéket.\n- Írd át a [deklarációkhoz tartozó szabályalternatívák programját](https://github.com/gabboraron/fordprog-egyben/commit/3bae4cd96415afc6442f47598f50609e11c160bd#diff-8fc56131b7aa5e0826468f24b4798841) úgy, hogy a változót és adatait szúrja be a szimbólumtáblába!\n\n```\nNATURAL IDENT\n{\n  szimbolumtabla[*$2] = var_data( d_loc__.first_line, natural );\n}\n```\n\n- Ellenőrizzük le a beszúrás előtt, hogy nem volt-e már ugyanezzel a névvel korábban deklaráció! A map adattípus `count` függvénye megadja, hogy egy adott kulcshoz hány elem van a map-ben (`0` vagy `1`).\n\n```\n  if( szimbolumtabla.count(*$2) \u003e 0 )\n  {\n    std::stringstream ss;\n    ss \u003c\u003c \"Ujradeklaralt valtozo: \" \u003c\u003c *$2 \u003c\u003c \".\\n\"\n    \u003c\u003c \"Korabbi deklaracio sora: \" \u003c\u003c szimbolumtabla[*$2].decl_row \u003c\u003c std::endl;\n    error( ss.str().c_str() );\n  }\n  ```\n\nA hibaüzenet szövegének összegyűjtéséhez és a korábbi deklaráció sorának szöveggé konvertálásához a `stringstream` osztályt használtuk. Ehhez be kell `include`-olni a [semantics.h](https://github.com/gabboraron/fordprog-egyben/commit/3bae4cd96415afc6442f47598f50609e11c160bd#diff-4372faf2015e5853c06e90c1b95d6c33) fájlba a `sstream` standard fejállományt!\nA `stringstream` típusú `ss`-ből a `str()` tagfüggvénnyel lehet lekérni a benne összegyűlt `string`-et. Mivel az `error` függvény (lásd a [Parser.ih](https://github.com/gabboraron/fordprog-egyben/blob/master/assign1/Parser.ih)-ban!) string helyett `C` stílusú karakterláncot vár paraméterként, ezért a `c_str()` függvény segítségével konvertálunk.\n- Töltsd ki hasonlóan a logikai változók deklarációjához tartozó szabályalternatívát is, de ott a szimbólumtáblába logikai változót szúrj be!\n- A programnak most már a 4.szemantikus-hibas fájlra hibát kell jeleznie.\n\n#### 5. lépés\n\nAzt is szeretnénk ellenőrizni, hogy az értékadásokban használt változók deklarálva vannak-e.\n- Egészítsd ki az értékadásokat és a kifejezéseket leíró szabályoknak az `IDENT`-et tartalmazó alternatíváit úgy, hogy hibaüzenetet kapjunk nem deklarált változók esetén!\n- Ellenőrizd, hogy az 5. és 6. szemantikus hibás tesztfájlra valóban hibaüzenetet ad-e a fordító!\n\nAz értékadások típushelyességének ellenőrzéséhez szükséges, hogy szemantikus értéket adjunk a kifejezésekhez. A konkrét esetben ez lehet a korábban definiált type felsorolási típusú érték. A kifejezéseket leíró szabályokban be fogjuk állítani a kifejezés szemantikus értékét (a kifejezés típusát) a szabály jobboldala alapján (lásd az előadás anyagában: szintetizált attribútum). A szabály baloldalának szemantikus értékére a `$$` jelöléssel hivatkozhatunk az akciókban. Ha nemterminálisokhoz szeretnénk szemantikus értéket hozzárendelni, akkor ezt is fel kell tüntetni a fájl elején. Mivel ez már nem token, ezért a `%type \u003cunió_megfelelő_mezője\u003e nemterminális_neve` szintaxist kell használni.\n\n- Egészítsd ki az [assign.y](https://github.com/gabboraron/fordprog-egyben/commit/322c7e6baa648aa0ac13b8b69735d65b2c7becba) fájlban korábban definiált uniót egy `type*` típusú mezővel, és tüntesd fel az `expr` nemterminálishoz rendelt szemantikus érték típusát az unióban létrehozott új mezőnév segítségével!\n- Egészítsd ki a kifejezéseket leíró négy szabályalternatíva akcióit olyan utasításokkal, amelyek beállítják a szabály baloldalának szemantikus értékét (a kifejezés típusát)!\nPéldául az `IDENT` alternatíva esetén a szimbólumtáblából kérhetjük le az azonosító típusát:\n\n`$$ = new type(szimbolumtabla[*$1].var_type);`\nA `TRUE` alternatíva még egyszerűbb:\n`$$ = new type(boolean);`\nHasználd fel az `expr` nemterminálisokhoz most beállított szemantikus értékeket az értékadásra vonatkozó szabályban: ellenőrizd, hogy az értékadás két oldala azonos típusú-e!\n```\nif( szimbolumtabla[*$1].var_type != *$3 )\n{\n  error( \"Tipushibas ertekadas.\\n\" );\n}\n```\n- Most már valamennyi szemantikus hibás példára hibát kell jeleznie a programnak.\n- Az `IDENT` és `expr` szimbólumok szemantikus értékeit minden esetben (a lex függvényben és a szabályokhoz csatolt akciókban is) a new kulcsszó segítségével, dinamikus memóriafoglalással hoztuk létre. Azokban az akciókban, ahol ezek a szimbólumok a szabály jobb oldalán állnak, felhasználtuk az értékeket. A program memóriahatékonyságának érdekében azonban a felhasználás után fel kell szabadítani a lefoglalt memóriát, hogy elkerüljük a memóriaszivárgást. Nézd végig az összes szabályt, és ahol a jobb oldalon `IDENT` vagy `expr` áll, ott az akció végére írd be a következő utasítást: `delete $i` (ahol `i` az `IDENT` vagy `expr` sorszáma).\n\n### Összefoglalás a szemantikus ellenőrzésről\n#### I.\nA [lexikális](https://github.com/gabboraron/fordprog-egyben#lexik%C3%A1lis-elemz%C5%91-1-beadand%C3%B3) elemző és [szintaktikus](https://github.com/gabboraron/fordprog-egyben#szintaktikus-elemző-2-beadandó) ellenörző nélkül nem működőképes rendszer, így előbb annak kell működnie.\n#### II.\n- A [`Parser.h`ban egy `map` formájá](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/Parser.h#L33)ban létrehozzuk a szimbólumtáblát.\n- A `semantics.h`ban [meghatározzuk a használt típusokat egy `enum`ban](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/semantics.h#L9) ezt követően, meghatározzuk a használt [kifejezésmintákat és azok típusait, meghatározásait `struct`okban](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/semantics.h#L12).\n  - itt mindig meg kell adni [a sor számát *(`decl_row`)*](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/semantics.h#L14), ami `int`.\n  - és meg kell adjuk az adott [kifejezés típusát is *(`var_type`)*](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/semantics.h#L15)\n#### III.\n- Először biztosítanunk kell, hogy lássuk a [yacc fájl](https://github.com/gabboraron/fordprog-egyben/blob/master/szemantikus-ellenorzo/calculate.y)ban ezeket, így [egy `union`ként meghatározzuk az előbb megadott mintákat](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/calculate.y#L4), majd azokat később [a kifejezésekhez társítjuk, még a program legeljén](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/calculate.y#L51)\n- fontos, hogy a sorokat olvasó, [Parser.ih-ban](https://github.com/gabboraron/fordprog-egyben/blob/master/szemantikus-ellenorzo/Parser.ih) található [`lex` függvény](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/Parser.ih#L16)ünk [visszadja nekünk a sorok tartalmát, méghozzá feldarabolva](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/Parser.ih#L22): `d_val__.szoveg = new std::string(lexer.YYText());`\n- ezután már tudunk a [darabokra egyenként hivatkozni és azokat lekezelhetjük](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/calculate.y#L217), azaz, ha a kapott forma `A B C D` akkor hivatkoznk rá `$1 $2 $3 $4` formában, illetve mostmár leérhető a `d_loc__.first_line` is, amivel visszadhatjuk a sort amit épp vizsgálunk\n#### IV.\nMindez mit sem ér ha nem tesszük be az egészet a szimbolóumtáblába, például így: [`szimbolumtabla [*$`*`i`*`] = var_data(d_loc__.first_line, `*`típus`*`)` ](https://github.com/gabboraron/fordprog-egyben/blob/7a916e56da6124014c2f22e3b0f83f7f9b5589a8/szemantikus-ellenorzo/calculate.y#L128)\n#### V.\nEzek után a típusok helyességét kell ellenőriznünk, hogy megfelelően van-e megadva pl egy matematikai művelet és nem pl egy logikai értékhez szeretnénk hozzáadni valamit. A szabályok baloldalának szemantikai értékét a `$$`al érjük el, a nemterminálist (kifejezés, stb) az `union`on keresztül érjük el, ahogy azt fent megadtuk.\n\n## Kódgenerálás\n\n**Fájlok:**[régebbi WHILE feladatra adott megoldás](https://github.com/gabboraron/fordprog-egyben/tree/master/4-kodgen), [előző félév anyaga](https://github.com/gabboraron/fordprog-osszefoglalo#4---kódgenerátor), [mintaprogram, amiből érdemes kiindulni](https://github.com/gabboraron/fordprog-egyben/blob/master/kodgen-pelda.zip), [tanári mintamegoldás](https://github.com/gabboraron/fordprog-egyben/blob/master/4-kodgen.zip)\n\n## Nyelv kiegészítése (vizsgafeladatok)\n### `String`\n\u003e Egészítsük ki `String` típussal és hozzá egy `++` (konkatenáció) művelettel és egy hosszúság lekérdezéssel, `hossz`.  \n\u003e\n\u003e Mintakód:\n\u003e ```\n\u003e PROGRAM pelda\n\u003e VALTOZOK:\n\u003e  STRING s\n\u003e UTASITASOK:\n\u003e  s := \"com\"\n\u003e  KI: hossz(s ++ \"piler\")\n\u003e PROGRAM_VEGE\n\u003e ```\n\nfájlok: [calculate.l](), [calculate.y]()\n\n\u003e **Lexikális kiegészítés**\n\u003e\n\u003e ```\n\u003e \"++\"\t\t\t  return Parser::CONCAT;\n\u003e ```\n\u003e \n\u003e ```\n\u003e \"hossz\"\t\t\treturn Parser::HOSSZ;\n\u003e ```\n\u003e  \n\u003e ```\n\u003e STRING      return Parser::STRING;\n\u003e ```\n\u003e \n\u003e ```\n\u003e \\\"([^\\n\"])*\\\"\t\t  \n\u003e {\n\u003e   return Parser::STRINGCONST;\n\u003e }\n\u003e ```\n\n\n\u003e **szintaktikai kiegészítés**\n\u003e\n\u003e ```\n\u003e %token STRING\n\u003e %token STRINGCONST\n\u003e %token HOSSZ\n\u003e ```\n\u003e \n\u003e ```\n\u003e %left CONCAT\n\u003e ```\n\u003e\n\u003e *Típusokhoz* (`type`)\n\u003e ```\n\u003e STRING\n\u003e    {\n\u003e        std::cout \u003c\u003c \"type -\u003e STRING\" \u003c\u003c std::endl;\n\u003e    }\n\u003e ```\n\u003e \n\u003e ```\n\u003e fuggveny:\n\u003e    HOSSZ OPEN kifejezes CLOSE\n\u003e    {\n\u003e         std::cout \u003c\u003c \"fuggveny -\u003e HOSSZ OPEN kifejezes CLOSE\" \u003c\u003c std::endl;\n\u003e    }\n\u003e ;    \n\u003e ```\n\u003e\n\u003e *Kifejezésekhez* (`kifejezes`)\n\u003e ```\n\u003e    fuggveny\n\u003e    {\n\u003e         std::cout \u003c\u003c \"kifejezes -\u003e fuggveny\" \u003c\u003c std::endl;\n\u003e    }\n\u003e |\n\u003e    kifejezes CONCAT kifejezes\n\u003e    {\n\u003e         std::cout \u003c\u003c \"kifejezes -\u003e kifejezes CONCAT kifejezes\" \u003c\u003c std::endl;\n\u003e    }\n\u003e |    \n\u003e    STRINGCONST\n\u003e    {\n\u003e        std::cout \u003c\u003c \"kifejezes -\u003e STRINGCONST\" \u003c\u003c std::endl;\n\u003e    }\n\u003e ```\n\n## Irodalom\n- [Lex, Yacc, Flex, Bison manual](http://dinosaur.compilertools.net/)\n- [Előadás anyaga eredeti](https://deva.web.elte.hu/pubwiki/doku.php?id=fporak)\n- [Előadás anyag itt](https://github.com/gabboraron/fordprog-egyben/tree/master/ea)\n- [Fordítóprogramok és formális nyelvek - Király Roland 2007](https://github.com/gabboraron/books/blob/master/Ford%C3%ADt%C3%B3programok.%20%C3%A9s%20form%C3%A1lis%20nyelvek.pdf)\n- [Assembly programozás - Kitlei Róbert 2007](https://github.com/gabboraron/books/blob/master/Kitlei_Robert-Assembly_prgramozas.pdf)\n- [egybefűzve az előadás, a tesztkérdések és gyakorlófeladatok](https://github.com/gabboraron/fordprog-egyben/blob/master/ea/fordprog_egybefuzve.pdf)\n- [feladatmegoldások ~ Nagy Krisztián](https://github.com/gabboraron/fordprog-egyben/blob/master/ea/fordprog_gy_zh1.pdf)\n- [Language-Parametric Methods for Developing Interactive Programming Systems](https://github.com/gabboraron/books/blob/master/a8e4303f3f89d660d24eae1086f7b448c25d.pdf)\n\n### XXI. századi fordító programok (YOUTUBE)\n\u003ca href=\"http://www.youtube.com/watch?feature=player_embedded\u0026v=fbG2P1jCALU\n\" target=\"_blank\"\u003e\u003cimg src=\"http://img.youtube.com/vi/fbG2P1jCALU/0.jpg\" \nalt=\"KMP\" width=\"300\" height=\"150\" border=\"10\" /\u003e\u003c/a\u003e\n\n## Szoftverkörnyezet\n### Lexikális elemző generátor: flex\n\n- [letöltés](https://github.com/westes/flex/releases)\n- [dokumentáció](http://dinosaur.compilertools.net/flex/index.html)\n- [példaprogram](http://deva.web.elte.hu/fordprog/lexikalis-pelda.zip)\n- [tutorial](http://deva.web.elte.hu/fordprog/flex-tutorial.pdf)\n    \n###  Szintaktikus elemző generátor: bisonc++\n\n- [letöltés](http://sourceforge.net/project/showfiles.php?group_id=129936)\n- [dokumentáció](http://bisoncpp.sourceforge.net/bisonc++.html)\n- [példaprogram](http://deva.web.elte.hu/fordprog/szintaktikus-pelda.zip)\n- [tutorial](http://deva.web.elte.hu/fordprog/bisoncpp-tutorial.pdf)\n\n### Szemantikus elemzés:\n\n- [segédanyag](http://deva.web.elte.hu/szemantikus.hu.html)\n- [példaprogram](http://deva.web.elte.hu/fordprog/szemantikus-pelda.zip)\n\n### Kódgenerálás:\n\n- [segédanyag](http://deva.web.elte.hu/fordprog/14-kodgen-handout.pdf)\n- [példaprogram](http://deva.web.elte.hu/fordprog/kodgen-pelda.zip)\n- [NASM dokumentáció](http://www.nasm.us/xdoc/2.09.10/html/nasmdoc0.html)\n- [Assembly kódtáblázat](http://www.jegerlehner.ch/intel/IntelCodeTable.pdf)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabboraron%2Ffordprog-egyben","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgabboraron%2Ffordprog-egyben","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabboraron%2Ffordprog-egyben/lists"}