{"id":913,"date":"2013-03-02T09:25:35","date_gmt":"2013-03-02T08:25:35","guid":{"rendered":"http:\/\/www.itkommando.hu\/site\/?page_id=913"},"modified":"2021-07-21T06:55:54","modified_gmt":"2021-07-21T05:55:54","slug":"szintaxisgrafok","status":"publish","type":"page","link":"https:\/\/www.itkommando.hu\/site\/a_halozat_szolgalataban\/tanulmanyok\/szintaxisgrafok\/","title":{"rendered":"Szintaxisgr\u00e1fok"},"content":{"rendered":"<p><b><i>Ez az \u00edr\u00e1s eredetileg 1998-ban jelent meg,&nbsp;m\u00e1r annak idej\u00e9n is elm\u00falt id\u0151k\u00f6n borongott. Szerencs\u00e9re azonban van a cikknek egy nagy felismer\u00e9se. A t\u00e9ma, amit ismertet (a szintaxisgr\u00e1f n\u00e9ven ismert le\u00edr\u00f3-tervez\u0151 eszk\u00f6z), egykor divatosabb volt, k\u00e9s\u0151bb val\u00f3ban kev\u00e9sb\u00e9 ismertt\u00e9 v\u00e1lt \u2013 de nagy t\u00fal\u00e9l\u0151t kell \u00fcdv\u00f6z\u00f6lni benne! A cikk el\u0151sz\u00f6r a j\u00f3 eml\u00e9kezet\u0171 (\u00daj) Alaplap foly\u00f3iratban ker\u00fclt publik\u00e1l\u00e1sra.(\u00daj Alaplap 1998. \u00e9vi 4. sz.) Most az eredeti szerz\u0151 enged\u00e9ly\u00e9vel (\u00e9s apr\u00f3bb kiigaz\u00edt\u00e1saival) k\u00f6z\u00f6lj\u00fck \u00fajra.<\/i><\/b><\/p>\n<h3>Szintaxisgr\u00e1fok<\/h3>\n<h3>Van r\u00e9gi a Nap alatt&#8230;<\/h3>\n<p><b>Az \u00daj Alaplapban nemr\u00e9g fejez\u0151d\u00f6tt be egy elm\u00e9leti \u00e9s gyakorlati szempontb\u00f3l egyar\u00e1nt sokat ad\u00f3 sorozat a gr\u00e1fokr\u00f3l. Van-e m\u00e9g b\u0151r ezen a r\u00f3k\u00e1n? Azt hissz\u00fck, igen. Err\u0151l jutott tudnillik esz\u00fcnkbe egy valamikor sokat haszn\u00e1lt, manaps\u00e1g m\u00e9ltatlanul mell\u0151z\u00f6tt tervez\u00e9si eszk\u00f6z: a szintaxisgr\u00e1f. Tegy\u00fcnk hozz\u00e1 n\u00e9h\u00e1ny meglep\u0151 dolgot ahhoz, amit tudni szoktunk r\u00f3la. <\/b><\/p>\n<p>A szintaxisgr\u00e1fok \u00fagy v\u00e1ltak k\u00f6zismertt\u00e9, hogy Niklaus Wirth metanyelvk\u00e9nt haszn\u00e1lta \u0151ket az \u00e1ltala megalkotott Pascal szeml\u00e9letes le\u00edr\u00e1s\u00e1ra. (Napjainkban a <a title=\"Free Pascal\" href=\"http:\/\/www.itkommando.hu\/site\/a_halozat_szolgalataban\/tanulmanyok\/free-pascal\/\" target=\"_blank\" rel=\"noopener\">Free Pascal<\/a> is ezt a technik\u00e1t haszn\u00e1lja &#8212; A szerk.). A nyelvvel egy\u00fctt el is terjedtek. K\u00fcl\u00f6n\u00f6sen megkedvelt\u00e9k a vizu\u00e1lis \u00e1br\u00e1zol\u00e1shoz vonz\u00f3d\u00f3 m\u00e9rn\u00f6k\u00f6k; egy id\u0151ben divat volt p\u00e9ld\u00e1ul adat\u00e1tviteli protokollokat ezek seg\u00edts\u00e9g\u00e9vel defini\u00e1lni. Kev\u00e9sb\u00e9 szerett\u00e9k meg a szoftverek dokument\u00e1l\u00f3i, mert egy t\u00f6bbleteszk\u00f6zt ig\u00e9nyelt: nem lehetett billenty\u0171zeten megrajzolni a k\u00fcl\u00f6nben oly kifejez\u0151 \u00e1br\u00e1kat. M\u00e1s nyelvek le\u00edr\u00e1s\u00e1ra nem is vett\u00e9k \u00e1t, \u00e9s lassacsk\u00e1n kezd h\u00e1tt\u00e9rbe szorulni. Pedig k\u00e1r lenne id\u0151 el\u0151tt elb\u00facs\u00faztatni, t\u00f6bbet tud, mint gondoln\u00e1nk! Erre mutatunk most p\u00e9ld\u00e1kat.<\/p>\n<p>K\u00e9pzelj\u00fcnk el egy Basic-nyelv\u0171 rendszert! Az\u00e9rt \u00e9ppen ilyet, mert ez maga is a sz\u00e1m\u00edt\u00e1stechnika k\u00f6zkincse, nem kell teh\u00e1t sokat magyar\u00e1znunk r\u00f3la. Viszont k\u00f6nny\u0171 t\u00f6bb alkalmaz\u00e1st is tal\u00e1lni a szintaxisgr\u00e1fok sz\u00e1m\u00e1ra benne. (Hogy nincs semmi k\u00f6ze a Pascalhoz, k\u00fcl\u00f6n el\u0151ny. Legal\u00e1bb l\u00e1tjuk, hogy \u00e1br\u00e1zol\u00e1sm\u00f3dunk nem k\u00f6t\u0151dik egyetlen nyelvhez.)<\/p>\n<h3>Valami \u00fajdons\u00e1g&#8230;<\/h3>\n<p>Wirth k\u00e9tf\u00e9le m\u00f3don cimk\u00e9zi meg a gr\u00e1f \u00e9leit: a <i>termin\u00e1lis<\/i> szimb\u00f3lumok hely\u00e9n k\u00f6rbe, ov\u00e1lis keretbe foglalt jellel, sz\u00f3val szak\u00edtja meg az \u00e9lt, a <i>nemtermin\u00e1lis szimb\u00f3lumokat<\/i> viszont t\u00e9glalap alak\u00fa keretbe \u00edrt sz\u00f3 jelzi. (Eml\u00e9keztet\u00e9s\u00fcl: a termin\u00e1lisoknak pontosan \u00fagy kell szerepelni\u00fck egy szintaktikusan helyes programban, ahogy a gr\u00e1fban a nev\u00fcket megadtuk. A nemtermin\u00e1lisok viszont a gr\u00e1fk\u00e9szletben m\u00e1s helyen el\u0151fordul\u00f3 szintaxisgr\u00e1fok c\u00edm\u00e9t jelzik, teh\u00e1t tov\u00e1bbi kifejt\u00e9st ig\u00e9nyelnek.)<\/p>\n<p>A mi \u00faj\u00edt\u00e1sunk az lesz, hogy egy harmadik fajta jelet is haszn\u00e1lunk. Ez egy szaggatott vonalas lekerek\u00edtett keret lesz. Jelent\u00e9se: a c\u00e9lprogram termin\u00e1lisa, nevezz\u00fck el <i>c\u00e9ltermin\u00e1lisnak<\/i>. Ezeket a szimb\u00f3lumokat nem a programoz\u00f3 \u00edrja a forr\u00e1sprogramba, hanem a ford\u00edt\u00e1s sor\u00e1n keletkeznek. (Engedje el az olvas\u00f3 annak pontos defini\u00e1l\u00e1s\u00e1t, hogy mikor \u00e9s hogyan lehet haszn\u00e1lni ezt a h\u00e1romf\u00e9le cimk\u00e9s m\u00f3dszert, hagyjuk meg a matematikusoknak.)<\/p>\n<h3>&nbsp;A szintaxisgr\u00e1f, mint parser<\/h3>\n<p>Legyen az els\u0151 p\u00e9ld\u00e1nk egy olyan elemz\u0151 k\u00e9sz\u00edt\u00e9se, amely ford\u00edtott lengyel form\u00e1ra (RPN) hozza a Basic program egy sor\u00e1t. Valamif\u00e9le ford\u00edt\u00f3programra gondolunk teh\u00e1t, de olyanra, ami nem k\u00f6zvetlen\u00fcl v\u00e9grehajthat\u00f3 g\u00e9pi k\u00f3dot \u00e1ll\u00edt el\u0151, mint a compilerek, hanem egy gyorsan \u00e9s k\u00e9nyelmesen \u00e9rtelmezhet\u0151 bels\u0151 form\u00e1t. (Aki nem ismeri a ford\u00edtott lengyel jel\u00f6l\u00e9st, annak most elegend\u0151 annyit meg\u00e9rteni, hogy alap\u00f6tlete szerint a m\u0171veleti jel az \u0151t megel\u0151z\u0151 operandusokra vonatkozik. P\u00e9ld\u00e1ul <i>A<\/i> + <i>B<\/i>&nbsp; helyett az <i>A B<\/i> +&nbsp; sorrend haszn\u00e1latos.)<\/p>\n<p>A p\u00e9lda szintaxisdiagramjainak egy t\u00f6red\u00e9k\u00e9t mutatjuk be illusztr\u00e1ci\u00f3 gyan\u00e1nt (az \u00e9rt\u00e9kad\u00f3 utas\u00edt\u00e1s egyszer\u0171s\u00edtett gr\u00e1fjait). Az egyszer\u0171s\u00edtett gr\u00e1fk\u00e9szlet csak a n\u00e9gy alapm\u0171veletet tartalmazza \u2013 mint k\u00e9toperandus\u00fa m\u0171veleteket \u2013 \u00e9s csak a minusz el\u0151jelet, mint egyoperandus\u00fat. (Mivel a forr\u00e1sprogramban ezt is ugyanazzal a &#8216;\u2013&#8217; jellel \u00edrjuk, mint a k\u00e9poperandus\u00fa minuszt, ez\u00e9rt az RPN-be ett\u0151l megk\u00fcl\u00f6nb\u00f6ztetett jelet ford\u00edtunk. Ezt itt a &#8216;~&#8217; hull\u00e1mvonal jel\u00f6li.)<\/p>\n<figure id=\"attachment_909\" aria-describedby=\"caption-attachment-909\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.itkommando.hu\/site\/szintaxisgrafok\/ertekadas\/\" rel=\"attachment wp-att-909\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-909 \" title=\"\u00e9rt\u00e9kad\u00e1s\" src=\"http:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/ertekadas-300x46.jpg\" alt=\"\u00e9rt\u00e9kad\u00e1s\" width=\"300\" height=\"46\" srcset=\"https:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/ertekadas-300x46.jpg 300w, https:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/ertekadas-1024x158.jpg 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-909\" class=\"wp-caption-text\">\u00e9rt\u00e9kad\u00e1s<\/figcaption><\/figure>\n<figure id=\"attachment_910\" aria-describedby=\"caption-attachment-910\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.itkommando.hu\/site\/szintaxisgrafok\/kifejezes\/\" rel=\"attachment wp-att-910\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-910 \" title=\"Kifejez\u00e9s\" src=\"http:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/kifejezes-300x122.jpg\" alt=\"Kifejez\u00e9s\" width=\"300\" height=\"122\" srcset=\"https:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/kifejezes-300x122.jpg 300w, https:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/kifejezes-1024x417.jpg 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-910\" class=\"wp-caption-text\">Kifejez\u00e9s<\/figcaption><\/figure>\n<figure id=\"attachment_911\" aria-describedby=\"caption-attachment-911\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.itkommando.hu\/site\/szintaxisgrafok\/tag\/\" rel=\"attachment wp-att-911\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-911\" src=\"http:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/tag-300x114.jpg\" alt=\"tag\" width=\"300\" height=\"114\" srcset=\"https:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/tag-300x114.jpg 300w, https:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/tag-1024x390.jpg 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-911\" class=\"wp-caption-text\">Tag<\/figcaption><\/figure>\n<figure id=\"attachment_912\" aria-describedby=\"caption-attachment-912\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.itkommando.hu\/site\/szintaxisgrafok\/tenyezo\/\" rel=\"attachment wp-att-912\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-912\" src=\"http:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/tenyezo-300x130.jpg\" alt=\"t\u00e9nyez\u0151\" width=\"300\" height=\"130\" srcset=\"https:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/tenyezo-300x130.jpg 300w, https:\/\/www.itkommando.hu\/site\/wp-content\/uploads\/tenyezo-1024x446.jpg 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><figcaption id=\"caption-attachment-912\" class=\"wp-caption-text\">T\u00e9nyez\u0151<\/figcaption><\/figure>\n<p>Figyelj\u00fck meg, hogy a <code>kifejez\u00e9s<\/code> elej\u00e9n szerepl\u0151 m\u00e1sik el\u0151jelhez, a pluszhoz nem tartozik c\u00e9ltermin\u00e1lis! Ez tudnillik redund\u00e1ns el\u0151jel, + <i>X<\/i> pontosan annyit \u00e9r, mint <i>X<\/i>. A c\u00e9lprogramban teh\u00e1t nem sz\u00fcks\u00e9ges hozz\u00e1 semmif\u00e9le tev\u00e9kenys\u00e9g! M\u00e1sik megjegyz\u00e9s\u00fcnk: a <code>v\u00e1ltoz\u00f3<\/code> \u00e9s <code>sz\u00e1m<\/code> formailag nemtermin\u00e1lisokok, de ismertnek tekintj\u00fck, ez\u00e9rt nem r\u00e9szletezz\u00fck \u0151ket tov\u00e1bb. A harmadik: meg kell k\u00fcl\u00f6nb\u00f6ztetni az \u00e9rt\u00e9kad\u00e1st jelz\u0151 egyenl\u0151s\u00e9gjel bal oldal\u00e1n szerepl\u0151 v\u00e1ltoz\u00f3t a jobb oldalon, a kifejez\u00e9sben esetleg el\u0151fordul\u00f3t\u00f3l! (A C nyelv alkalmaz\u00f3inak sokszor kell erre figyelni: \u201ebal\u00e9rt\u00e9k\u201d, vagy \u201ejobb\u00e9rt\u00e9k\u201d, amit haszn\u00e1lnak.) De erre k\u00e9s\u0151bb m\u00e9g visszat\u00e9r\u00fcnk.<\/p>\n<p>Hogyan lehet az elemz\u00e9st v\u00e9grehajtani? Az elv az, hogy p\u00e1rhuzamosan haladunk a be\u00edrt sz\u00f6vegen (a forr\u00e1skifejez\u00e9sen) \u00e9s az <code>\u00e9rt\u00e9kad\u00e1s<\/code> szintaxisgr\u00e1fj\u00e1n. Abba az ir\u00e1nyba haladunk, amelyben azonos termin\u00e1lisokat tal\u00e1lunk, figyelembe v\u00e9ve a gr\u00e1f \u00e9leinek \u2013 nyilakkal jelzett \u2013 ir\u00e1ny\u00edt\u00e1s\u00e1t. Ez k\u00f6zismert. Az \u00fajdons\u00e1g: ford\u00edtsuk f\u00fcgg\u0151leges ir\u00e1nyba a szintaxisgr\u00e1fokat, \u00e9s \u00edgy, mint program folyamat\u00e1br\u00e1t olvassuk! Az algoritmus:<\/p>\n<ol>\n<li>Ha van a gr\u00e1fon olyan termin\u00e1lis, mint a forr\u00e1sban, akkor a gr\u00e1fon arra az \u00e1gra l\u00e9pj\u00fcnk, ahol ezt tal\u00e1ltuk \u00e9s mind a forr\u00e1sban, mind a gr\u00e1fon l\u00e9pj\u00fcnk \u00e1t ezen a termin\u00e1lison! (<i>Felismer\u00e9s.<\/i>)<\/li>\n<li>&nbsp;Ha termin\u00e1lis nincs, de nemtermin\u00e1lis van a gr\u00e1fban, akkor haladjunk arra, \u00e9s <i>szubrutink\u00e9nt h\u00edvjuk meg<\/i> a vele c\u00edmzett gr\u00e1fot. (Most feltessz\u00fck, hogy csak egy ilyen ir\u00e1ny van.)<\/li>\n<li>Ha a k\u00e9t el\u0151z\u0151 felt\u00e9telnek megfelel\u0151 \u00e1g nincs a gr\u00e1fban, akkor hibajelz\u00e9st kell adni, a forr\u00e1s szintaxisa rossz.<\/li>\n<li>Ha a gr\u00e1fon c\u00e9ltermin\u00e1list l\u00e1tunk, haladjunk \u00e1t rajta \u00e9s tegy\u00fck le az RPN-forma k\u00f3dj\u00e1ba. (V\u00e9gs\u0151 soron ez akkor is megt\u00f6rt\u00e9nik, amikor nemtermin\u00e1lisokon haladunk \u00e1t, mert minden nemtermin\u00e1list is valahol termin\u00e1lisokra kell visszavezetni, \u00e9s a hozz\u00e1tartoz\u00f3 tev\u00e9kenys\u00e9get egy c\u00e9ltermin\u00e1lis defini\u00e1lja.)<\/li>\n<\/ol>\n<p>Mi felel meg a gr\u00e1f alakzatainak a bel\u0151le el\u0151\u00e1llott elemz\u0151 programban? Az egy pontb\u00f3l t\u00f6bbfel\u00e9 halad\u00f3 \u00e9lek eset\u00e9ben az \u00e1gakon szerepl\u0151 termin\u00e1lisokat lehet felt\u00e9teles el\u00e1gaz\u00e1ssal, p\u00e9ld\u00e1ul IF utas\u00edt\u00e1s seg\u00edts\u00e9g\u00e9vel azonos\u00edtani. A hurkokban el\u00f6l-, vagy h\u00e1tultesztel\u0151 ciklusokra ismerhet\u00fcnk, att\u00f3l f\u00fcgg\u0151en, hogy hol szerepel benn\u00fck felismerhet\u0151 termin\u00e1lis. A nemtermin\u00e1lisok t\u00e9glalapjait, mint m\u00e1r erre c\u00e9loztunk, szubrutinokkal val\u00f3s\u00edthatjuk meg.<\/p>\n<p>Mit kaptunk? Egy RPN-compiler elemz\u0151 r\u00e9sz\u00e9nek (az \u00fan. parsernek) a programj\u00e1t le\u00edr\u00f3 folyamat\u00e1br\u00e1t.<\/p>\n<h3>A szintaxisgr\u00e1f, mint interpreter<\/h3>\n<p>M\u00e1sodik p\u00e9ld\u00e1nkr\u00f3l csak n\u00e9h\u00e1ny sz\u00f3val tegy\u00fcnk eml\u00edt\u00e9st. A zsebsz\u00e1mol\u00f3g\u00e9pek haszn\u00e1latakor sokszor j\u00f3, ha matematikai fel\u00edr\u00e1sm\u00f3dot lehet haszn\u00e1lni a m\u0171veletek sorrendj\u00e9nek el\u0151\u00edr\u00e1s\u00e1ra, z\u00e1r\u00f3jelekkel, precedencia-szab\u00e1lyokkal. Nem sz\u00fcks\u00e9ges viszont t\u00e1rolni a m\u0171veleteket, azonnal v\u00e9grehajthat\u00f3, amit bebillenty\u0171zt\u00fcnk. Nyilv\u00e1n r\u00e1ismer\u00fcnk a k\u00f6r\u00fcl\u00edr\u00e1sb\u00f3l, hogy az \u00e9rtelmez\u0151 programok m\u0171k\u00f6d\u00e9s\u00e9re c\u00e9lzunk. A dologban az a fantasztikus, hogy <i>ugyanaz a szintaxisdiagram, amit az el\u0151bb elemz\u0151 el\u0151\u00e1ll\u00edt\u00e1s\u00e1ra haszn\u00e1ltunk, alkalmas \u00e9rtelmez\u0151 le\u00edr\u00e1s\u00e1ra is<\/i>. Csak annyi v\u00e1ltoztat\u00e1sra van sz\u00fcks\u00e9g, hogy az \u00e9lek c\u00edmk\u00e9ihez rendel\u00fcnk m\u00e1s tev\u00e9kenys\u00e9geket. (Igaz\u00e1b\u00f3l m\u00e9g ennyi sem sz\u00fcks\u00e9ges: csak a c\u00e9ltermin\u00e1lisokn\u00e1l kell elt\u00e9rni az eddigiekt\u0151l.) Most \u00edgy kell teh\u00e1t olvasnunk az algoritmust: \u201eHa a gr\u00e1fon c\u00e9ltermin\u00e1list l\u00e1tunk, haladjunk \u00e1t rajta, \u00e9s hajtsuk v\u00e9gre a hozz\u00e1rendelt tev\u00e9kenys\u00e9get!\u201d.<\/p>\n<p>A tev\u00e9kenys\u00e9gek: sz\u00e1mnak, v\u00e1ltoz\u00f3nak tegy\u00fck az \u00e9rt\u00e9k\u00e9t egy verembe. A m\u0171veleti jelek \u00e1ltal el\u0151\u00edrt sz\u00e1m\u00edt\u00e1st a veremben l\u00e9v\u0151 utols\u00f3 egy vagy k\u00e9t \u00e9rt\u00e9ken kell v\u00e9grehajtani, \u00e9s az eredm\u00e9nyt visszatenni a verembe. \u00c9s most t\u00e9r\u00fcnk vissza a \u201ebal\u00e9rt\u00e9k\u201d fogalm\u00e1ra. Az egyenl\u0151s\u00e9gjel bal oldal\u00e1n szerepl\u0151 v\u00e1ltoz\u00f3nak nem az \u00e9rt\u00e9k\u00e9re van sz\u00fcks\u00e9g, hanem a c\u00edm\u00e9re. \u00c9rt\u00e9ke esetleg m\u00e9g nincs is. Az \u00e9rt\u00e9kad\u00f3 utas\u00edt\u00e1s szerepe teh\u00e1t: a jobb oldalon kapott \u00e9rt\u00e9ket elhelyezi a baloldalra \u00edrt v\u00e1ltoz\u00f3val meghat\u00e1rozott helyre.<\/p>\n<p>Csin\u00e1lhatjuk persze azt is, hogy ink\u00e1bb az RPN-form\u00e1hoz k\u00e9sz\u00edt\u00fcnk \u00e9rtelmez\u0151t (ahhoz sokkal k\u00f6nnyebb, \u00e9ppen ez\u00e9rt tal\u00e1lt\u00e1k ki az RPN-t). Ez\u00e9rt nem is lenne j\u00f3 tov\u00e1bb cicom\u00e1znunk ezt az el\u0151bbiekben felv\u00e1zolt, k\u00f6zvetlen\u00fcl interpret\u00e1l\u00f3 m\u00f3dszert. Van ugyanis egy baja: csak menet k\u00f6zben der\u00fcl ki, hogy a forr\u00e1ssor nem is volt szintaktikusan helyes. A zsebsz\u00e1mol\u00f3g\u00e9p ilyenkor vagy hib\u00e1t jelez, vagy \u00e9sszer\u0171 feltev\u00e9sekkel korrig\u00e1l.<\/p>\n<h3>A szintaxisgr\u00e1f, mint inverz parser<\/h3>\n<p>Most valami eg\u00e9szen meglep\u0151t csin\u00e1lunk. Ha az els\u0151 p\u00e9ld\u00e1nkban szerepl\u0151 k\u00e9pzelt Basic-rendszer gyakorlati haszn\u00e1lat\u00e1ra gondolunk, felmer\u00fcl egy k\u00e9rd\u00e9s: hogyan lehet a programunkat szerkeszteni, vagy ki\u00edratni, ha csak a bels\u0151, RPN form\u00e1t t\u00e1roljuk, a forr\u00e1sprogramot nem?&nbsp; M\u00e1s megold\u00e1s h\u00edj\u00e1n, meg kell pr\u00f3b\u00e1lnunk a bels\u0151 form\u00e1b\u00f3l visszanyerni a forr\u00e1ssorokat.<\/p>\n<p>Hogyan lehets\u00e9ges ez? Csod\u00e1t fogunk tenni!&nbsp; <i>Ugyanaz<\/i> a szintaxisgr\u00e1f, amelyr\u0151l e cikk elej\u00e9n sz\u00f3ltunk, ezt a visszaford\u00edt\u00e1st is k\u00e9pes le\u00edrni. Hogyan?&nbsp; \u00dagy, hogy a k\u00f6vetkez\u0151 dolgokat csin\u00e1ljuk:<\/p>\n<p>El\u0151sz\u00f6r is az \u00e9lekhez ism\u00e9t m\u00e1s tev\u00e9kenys\u00e9get rendel\u00fcnk, mint az elemz\u0151 program eset\u00e9ben. (Ez m\u00e1r a harmadik fajta lesz a cikkben.) A c\u00e9ltermin\u00e1lisokat most felismerni kell; a nemtermin\u00e1lisokn\u00e1l, itt is, egy-egy m\u00e1sik gr\u00e1fot kell szubrutinszer\u0171en helyettes\u00edteni (csak most a visszaford\u00edt\u00e1s gr\u00e1fk\u00e9szlet\u00e9b\u0151l, ami esetleg nem azonos az eredetivel); a termin\u00e1lisokat az outputba kell \u00edrni (mert most ezeknek kell keletkezni).<\/p>\n<p>A m\u00e1sodik, amit tesz\u00fcnk, az, hogy most az <code>\u00e9rt\u00e9kad\u00e1s<\/code> gr\u00e1f v\u00e9g\u00e9t\u0151l indulunk el, mindig az ir\u00e1ny\u00edt\u00e1ssal ellent\u00e9tesen haladva, m\u00edg v\u00e9g\u00fcl \u2013 h\u00e1tulr\u00f3l-el\u0151re haladva \u2013 meg\u00e9rkez\u00fcnk a gr\u00e1f kezdet\u00e9hez. K\u00f6zben el\u0151\u00e1ll a forr\u00e1ssor, szint\u00e9n el\u0151sz\u00f6r a v\u00e9ge, k\u00e9s\u0151bb az eleje. (Elk\u00e9pzelhetj\u00fck \u00fagy is, hogy most ellenkez\u0151 ir\u00e1nyban ford\u00edtjuk f\u00fcgg\u0151legesre a gr\u00e1fokat, ez lesz a folyamat\u00e1br\u00e1nk.)<\/p>\n<p>Az algoritmus a \u201etermin\u00e1lis\u201d \u00e9s \u201ec\u00e9ltermin\u00e1lis\u201d szavak cser\u00e9j\u00e9vel az el\u0151re halad\u00f3 elemz\u00e9sn\u00e9l megadottal megegyezik:<\/p>\n<p>Ha van a gr\u00e1fon olyan c\u00e9ltermin\u00e1lis, mint az RPN-form\u00e1ban, akkor a gr\u00e1fon arra az \u00e1gra l\u00e9pj\u00fcnk, ahol ezt tal\u00e1ltuk, \u00e9s mind az RPN-ben, mind a gr\u00e1fon l\u00e9pj\u00fcnk \u00e1t ezen a c\u00e9ltermin\u00e1lison! (<i>Felismer\u00e9s<\/i>)&#8230; \u00c9s \u00edgy tov\u00e1bb, nem is kell r\u00e9szletezni.<\/p>\n<p>Ink\u00e1bb n\u00e9h\u00e1ny gyakorlati szempontra t\u00e9rj\u00fcnk ki!<\/p>\n<p>1. \u00c9rezz\u00fck, hogy van valamif\u00e9le hat\u00e1rozott izomorfia a forr\u00e1s \u00e9s az RPN-alak k\u00f6z\u00f6tt. Vagyis az egyikben pontosan annyi inform\u00e1ci\u00f3 van, mint a m\u00e1sikban. De van egy nagy k\u00fcl\u00f6nbs\u00e9g: az RPN-form\u00e1ban nem fordulhat el\u0151 szintaktikus hiba! (Akkor nem fogadtuk volna el leford\u00edt\u00e1sra, amikor a forr\u00e1salakot el\u0151sz\u00f6r be\u00edrtuk.) A visszaalak\u00edt\u00e1s sor\u00e1n teh\u00e1t nem kell arra felk\u00e9sz\u00fclni, hogy nem siker\u00fcl a tov\u00e1bbhalad\u00e1s a gr\u00e1f egyik \u00e9l\u00e9n sem. Ez nagy k\u00f6nnyebbs\u00e9g.<\/p>\n<p>2. Ezzel a hibamentess\u00e9ggel tudatosan vissza is \u00e9lhet\u00fcnk. Nyugodtan \u00f6ssze lehet vonni olyan gr\u00e1fokat \u00e9s r\u00e9szgr\u00e1fokat, amelyek val\u00f3j\u00e1ban t\u00f6bbet engednek meg, mint a nyelv, amit elemz\u00fcnk. Nem a leg\u00fcgyesebb p\u00e9lda, de k\u00e9zn\u00e9l van: az \u00e9rt\u00e9kad\u00f3 utas\u00edt\u00e1st <code>kifejez\u00e9s = kifejez\u00e9s<\/code> form\u00e1ban is fel\u00edrhatjuk. Nem baj, hogy az egyenl\u0151s\u00e9gjel bal oldal\u00e1n nem fog el\u0151fordulni a <code>kifejez\u00e9s<\/code> gr\u00e1f bej\u00e1r\u00e1sainak t\u00falnyom\u00f3 t\u00f6bbs\u00e9ge. Most csak az az \u00e9rdekes, hogy a lehet\u0151s\u00e9gek k\u00f6z\u00f6tt szerepel az is, hogy itt egyetlen v\u00e1ltoz\u00f3 \u00e1ll. Hiszen \u201ev\u00e9letlen\u00fcl\u201d a szintaktikusan helyes forr\u00e1ssorok eset\u00e9ben \u00e9ppen ez szerepel majd. (A p\u00e9lda az\u00e9rt nem a legjobb, mert sokkal t\u00f6bb \u00f6sszevon\u00e1si lehet\u0151s\u00e9g van, mint ebb\u0151l gondoln\u00e1nk. Meg azt\u00e1n, eml\u00e9kezz\u00fcnk arra is, hogy az RPN-form\u00e1ban nem egyeznek meg egym\u00e1ssal az egyenl\u0151s\u00e9gjel bal \u00e9s jobb oldal\u00e1n el\u0151fordul\u00f3 v\u00e1ltoz\u00f3k. Mind a k\u00e9t form\u00e1t meg kell engedni teh\u00e1t a <code>kifejez\u00e9s<\/code> \u00f6sszevont gr\u00e1fj\u00e1nak megszerkeszt\u00e9sekor.)<\/p>\n<p>Aki \u00fagy \u00e9rzi, hogy ez az \u00f6sszevon\u00e1s lass\u00edtja a visszaalak\u00edt\u00f3 program m\u0171k\u00f6d\u00e9s\u00e9t, annak igaza van. De semmi baj! Gondoljunk arra, hogy egy kiviteli perif\u00e9ri\u00e1t kell az eredm\u00e9nnyel (a forr\u00e1ssorokkal) kiszolg\u00e1lni. B\u0151ven lesz id\u0151nk&#8230;<\/p>\n<p>3. Nos, k\u00f6nny\u0171 azt mondani, hogy \u201eolvassuk visszafel\u00e9\u201d&#8230; \u2013 a gr\u00e1fnak mindegy, de az RPN-nek nem! Feltehet\u0151leg a t\u00e1rolt, bels\u0151 form\u00e1j\u00fa inform\u00e1ci\u00f3k jelent\u0151s r\u00e9sze t\u00f6bb b\u00e1jtot foglal el. P\u00e9ld\u00e1ul az els\u0151 b\u00e1jt jelzi azt, hogy a k\u00f6vetkez\u0151 n\u00e9gyben egy val\u00f3s sz\u00e1mot helyezt\u00fcnk el. Az ilyen adatokat csak \u00fagy lehet kezelni, ha tudjuk, hol van az adatok els\u0151 b\u00e1jtja. Persze, ha m\u00e1r tudjuk, hogy van ilyen buktat\u00f3, akkor csak csek\u00e9ly technikai neh\u00e9zs\u00e9get jelent a kezel\u00e9se. (Hogy az eredm\u00e9nyt is jobbr\u00f3l-balra \u00e1ll\u00edtja el\u0151 a m\u00f3dszer, legfeljebb kicsit furcsa \u00e9s mulats\u00e1gos, de nem okoz gondot.)<\/p>\n<p>4. \u00c9s, v\u00e9g\u00fcl, m\u00e9g egy \u00e9rdekess\u00e9g! Mi t\u00f6rt\u00e9nik a forr\u00e1salak redund\u00e1ns m\u0171veleti jeleivel, z\u00e1r\u00f3jeleivel? Ezekhez nincs c\u00e9ltermin\u00e1lis rendelve. A z\u00e1r\u00f3jelekhez az\u00e9rt nem, mert az RPN z\u00e1r\u00f3jelmentes forma, a m\u0171veleti sorrendet a m\u0171veleti jelek \u00e9s az operandusok sorrendje \u00edrja el\u0151. A redund\u00e1ns m\u0171veleti jelekn\u00e9l pedig mi magunk hat\u00e1roztuk el, hogy nem \u0151rizz\u00fck meg ezeket. H\u00e1t bizony ezek a ford\u00edtott lengyel alakra hoz\u00e1s sor\u00e1n elvesznek, enn\u00e9lfogva a visszaford\u00edt\u00e1s sor\u00e1n sem j\u00f6nnek l\u00e9tre. Baj? Ink\u00e1bb azt mondan\u00e1m, didaktikus el\u0151ny. Ha sokat l\u00e1tjuk a bonyolultan be\u00edrt sorokat egyszer\u0171bb alakban megjelenni, el\u0151bb-ut\u00f3bb hozz\u00e1 fogunk szokni ahhoz, hogy mit felesleges be\u00edrnunk. (Vagy ahhoz, hogy \u00edrjuk be nyugodtan a redund\u00e1ns elemeket, ha nem tudjuk memoriz\u00e1lni a m\u0171veletek precedencia-szab\u00e1lyait. Majd a rendszer egys\u00e9ges\u00edti, amit lehet.)&nbsp; Persze, ha szeretn\u00e9nk valamit meg\u0151rizni a forr\u00e1ssor jellegzetess\u00e9geib\u0151l, p\u00e9ld\u00e1ul a kis- \u00e9s nagybet\u0171ket, egym\u00e1sba \u00e1gyazott programr\u00e9szletek beh\u00faz\u00e1sait, felesleges pozit\u00edv el\u0151jeleket, hozz\u00e1rendelhet\u00fcnk ezekhez is megfelel\u0151 c\u00e9ltermin\u00e1lisokat.<\/p>\n<h3>Dics\u00e9rni kell, nem temetni&#8230;<\/h3>\n<p>Tal\u00e1n siker\u00fclt meggy\u0151zn\u00fcnk az Olvas\u00f3t, hogy a szintaxisgr\u00e1fokat nem kell m\u00e9g elfelejteni. Nem pusztultak ki, legf\u00f6ljebb m\u00e1s szerepk\u00f6rt kapnak. Mert arra az\u00e9rt r\u00e1 kell mutatni, hogy nem ok n\u00e9lk\u00fcl szundik\u00e1lnak valahol a k\u00f6zfigyelemt\u0151l t\u00e1volabb. Nem csak neh\u00e9zkesen dokument\u00e1lhat\u00f3 voltuk elgondolkoztat\u00f3, mint jelezt\u00fck, hanem az is, hogy ez az eszk\u00f6zk\u00e9szlet nem t\u00e1mogatja a g\u00e9pi feldolgozhat\u00f3s\u00e1got, amire pedig sok j\u00f3 p\u00e9lda van (YACC&#8230;). \u00c9s arr\u00f3l is m\u00e9lyen hallgattunk, hogy struktur\u00e1lt programot kapunk-e egy gr\u00e1f der\u00e9ksz\u00f6g\u0171 elford\u00edt\u00e1sa nyom\u00e1n. (Ugyan mi\u00e9rt kapn\u00e1nk azt?&#8230;) Vagy legal\u00e1bb valami megnyugtat\u00f3t a programhelyess\u00e9g bizony\u00edt\u00e1s\u00e1ra, nem mintha manaps\u00e1g ez nagy divat lenne.<\/p>\n<p>Persze, j\u00f3 programot egy ilyen szeml\u00e9letes kiindul\u00e1sb\u00f3l en\u00e9lk\u00fcl is k\u00f6nny\u0171 \u00edrni. Mert, hogy ne fanyalogjunk tov\u00e1bb: a legnagyobb el\u0151ny, ami meg\u0151rzi ezeket a rajzocsk\u00e1kat, \u00e9ppen szeml\u00e9letess\u00e9g\u00fck. L\u00e1m, nek\u00fcnk is siker\u00fclt n\u00e9h\u00e1ny gr\u00e1f seg\u00edts\u00e9g\u00e9vel elv\u00e9gezn\u00fcnk a \u201eTanuljon k\u00f6nnyen, gyorsan compilert, interpretert, nyelvtranszform\u00e1l\u00f3 rendszerprogramokat \u00edrni!\u201d gyorstalpal\u00f3 tanfolyamot.<\/p>\n<p>Sokoldal\u00fas\u00e1guk meggy\u0151z\u0151. Vizualit\u00e1suk, gyorsan \u00e1tl\u00e1that\u00f3 voltuk nyilv\u00e1nval\u00f3. Ahol biztos a fennmarad\u00e1suk, az az oktat\u00e1s, a tervek t\u00f6preng\u0151 f\u00e1zisa, a konferenci\u00e1kon az \u00edr\u00e1svet\u00edt\u0151re v\u00e1zolt illusztr\u00e1ci\u00f3k.&nbsp; Ahol a kreativit\u00e1s eszk\u00f6z\u00e9\u00fcl szolg\u00e1lnak.<\/p>\n<p><b>&nbsp;<\/b><\/p>\n<p><b>Segesdy G\u00e1bor<\/b><\/p>\n<p>Kapcsol\u00f3d\u00f3 cikkek:<\/p>\n<ul>\n<li><a title=\"Lazarus RAD fel\u00fclet a Free Pascalhoz\" href=\"http:\/\/www.itkommando.hu\/site\/a_halozat_szolgalataban\/tanulmanyok\/free-pascal-3\/\" rel=\"bookmark\">Lazarus<\/a><\/li>\n<li><a href=\"http:\/\/www.itkommando.hu\/site\/a_halozat_szolgalataban\/tanulmanyok\/free-pascal\/\">Free Pascal<\/a><\/li>\n<li><a title=\"Alapvet\u0151 optimaliz\u00e1l\u00e1si fog\u00e1sok\" href=\"http:\/\/www.itkommando.hu\/site\/a_halozat_szolgalataban\/tanulmanyok\/free-pascal-2\/\" rel=\"bookmark\">Free Pascal 2<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Ez az \u00edr\u00e1s eredetileg 1998-ban jelent meg,&nbsp;m\u00e1r annak idej\u00e9n is elm\u00falt id\u0151k\u00f6n borongott. Szerencs\u00e9re azonban van a cikknek egy nagy felismer\u00e9se. A t\u00e9ma, amit ismertet (a szintaxisgr\u00e1f n\u00e9ven ismert le\u00edr\u00f3-tervez\u0151&hellip;<a href=\"https:\/\/www.itkommando.hu\/site\/a_halozat_szolgalataban\/tanulmanyok\/szintaxisgrafok\/\" class=\"more-link\"><span class=\"more-button\">Tov\u00e1bb a r\u00e9szletekre<span class=\"screen-reader-text\">Szintaxisgr\u00e1fok<\/span><\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":910,"parent":397,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[13,16,15],"tags":[],"class_list":["post-913","page","type-page","status-publish","has-post-thumbnail","hentry","category-szoftver","category-tanacsok","category-uzembiztonsag"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/pages\/913","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/comments?post=913"}],"version-history":[{"count":25,"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/pages\/913\/revisions"}],"predecessor-version":[{"id":5663,"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/pages\/913\/revisions\/5663"}],"up":[{"embeddable":true,"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/pages\/397"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/media\/910"}],"wp:attachment":[{"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/media?parent=913"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/categories?post=913"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.itkommando.hu\/site\/wp-json\/wp\/v2\/tags?post=913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}