Fordítóprogramok: Lex és YACC
|
|
- Aurél Magyar
- 6 évvel ezelőtt
- Látták:
Átírás
1 Fordítóprogramok: Lex és YACC Készítette: Bartos Gábor Budapest, 2005
2 Tartalom 1. Bevezetés Lex Metakarakterek Szerkezet Definíciós rész Fordítási szabályok Felhasználói programok Számológép példa Tokenek Egy string lexikális elemzése Kimenet Fontosabb hibaüzenetek YACC A számológépes példa folytatása yylval típusa Deklaráció Hibakezelés Fontosabb kapcsolók Fontosabb hibaüzenetek Lex és YACC együttmőködése Egy-két tanács a kezdetekhez... 13
3 1. Bevezetés A lexikális elemzés egy determinisztikus véges automatával valósítható meg. A lex egy olyan program, amely a reguláris kifejezések formális leírásából hozza létre az automata implementációját, vagyis egy lexikális elemzı programot generál. A lex C kódot generál egy lexikális elemzıhöz. Mintákat használ, hogy a bemenı stringekbıl tokeneket készítsen. A token a string számszerő reprezentációja, amely megkönnyíti a feldolgozást. A YACC C kódot generál szintaktikus elemzıhöz. Nyelvtani szabályokat használ a lex tokenjeinek elemzéséhez és a szintaxisfa felépítéséhez. A szintaxisfa segítségével történik a kódgenerálás. 2. Lex Ha egy nyelvet akarunk írni bármihez, akkor elıször meg kell határozzuk, hogy milyen szavakból, jelekbıl épül fel a készítendı nyelv. Ezeket reguláris kifejezésekkel határozzuk meg. 2.1 Metakarakterek A reguláris kifejezés leírásához használt karakterek és jelentésük: \n új sor karakter. bármilyen karakter, kivéve az új sor karakter * 0,1,2 szeres ismétlése az elıtte levı kifejezésnek + 1,2 szeres ismétlése az elıtte levı kifejezésnek? 0, vagy 1-szeres ismétlése az elıtte levı kifejezésnek ^ sor kezdete $ sor vége a b a vagy b aaa string literál [] karakter osztály Például: delim [ \t\n] A jobb oldalon egy karakter osztályt látunk, ami most azt jelenti, hogy a szóközt, a tabulátort és a sorvége jelet együttesen a bal oldali szóval akarjuk elnevezni, ez esetben delim -mel. Ennek segítségével definiáljuk például a whitespace-t, ami a nyelvünk szavait elválaszthatja: whitespace {delim}* Tehát a whitespace a fenn definiált karakterek tetszıleges hosszú sorozatából állhat (akár 0 hosszú sorozatából is!). A {}-nek van egy másik jelentése is: a{1,5} az a 1 és 5 közötti számú elıfordulásait jelenti A ^ karakterosztályban negálást jelent, ha az az elsı karakter tehát: [^ab] = bármi, kivéve a, vagy b, DE
4 [a^b] = a vagy ^ vagy b! Figyelni kell még a karakter osztályban használt - -ra is: Pl.: [-ab] Ha a -t, b -t, vagy - -t foglalja egybe. A mínusz szándékosan került elıre, mivel az [a-z] azt jelentené, hogy a-tól z-ig minden karakter megengedett. Példa a sor vége jel használatára (mármint a $): SzövegASorVégén szöveg$ Ez az jelenti, hogy ha a szöveget közvetlenül a sor vége elıtt találja meg, akkor SzövegASorVégén token ad tovább. 2.2 Szerkezet A lex bemenete három részbıl áll: definíciók fordítási szabályok felhasználói programok Definíciós rész A definíciós rész név és reguláris kifejezés párokból áll, ahol a név a reguláris kifejezés azonosítója. A nevet és a reguláris kifejezést whitespace kell elválassza egymástól (vagyis szóköz vagy tab). Pl.: digit [0-9] delim [ \t\n] whitespace {delim}* number {digit}+(\.{digit}+)?(e[\+\-]?{digit}+)? E utóbbi lehet, hogy már magyarázatra szorul: {digit}+ legalább egy számjeggyel kezdıdik (\.{digit}+)? (A kérdıjel miatt ez a rész elhagyható.) Ha nem hagyjuk el, akkor a. után legalább egy számjeggyel folytatódik. (E[\+\-]?{digit}+)? (Szintén nem kötelezı.) E -vel folytatódik, igény szerint elıjel tehetı, majd ismét számjegyek sorozata jön. Vigyázzunk arra, hogy ne lehessen üres, 0 hosszú kifejezéseket létrehozni vele, pl.: {delim}* (Itt nulla hosszúságú whitespace is megengedett lenne, amit a lex nem fog szeretni.) A definíciós részben a minták az elsı oszlopban kell kezdıdjenek. Minden, ami nem az elsı oszlopban kezdıdik, az átmásolódik generált C file-ba. A név reguláris párokon kívül még tartalmazhat olyan részeket, amelyet a lex automatikusan beleír majd az általa generált C kódba. Az átmásolandó kódrészleteket %{ és %} közé kell elhelyezni.
5 2.2.2 Fordítási szabályok A fordítási szabályok rész reguláris kifejezés és akció párokból épül fel. Pl.: {whitespace} {/*semmit nem csinálunk*/} (i I)(f F) {return IF;} Lex által használt változók: yytext egy nulla végő string yyleng az egyezı string hossza yyout a kimeneti file, alapértelmezésben stdout yyin a fentihez hasonlóan a bemeneti file yylval a tokenhez rendelt érték Ezeket a változókat felhasználhatjuk a fordítási szabályokban, pl.: [0-9]+ { yylval = atoi(yytext); } Van egy fontos makró a lexben, ami még a segítségünkre lehet: ECHO. Az ECHO segítségével a bekapott karaktert változtatás nélkül egyszerően továbbküldjük a kimenetre: /* match everything except newline */. ECHO; /* match newline */ \n ECHO; Felhasználói programok A harmadik részben a második részben meghívott C függvények implementációját valósíthatjuk meg. 2.3 Számológép példa Szeretnénk írni egy számológépet. Kéne legyen benne összeadás, kivonás, szorzás, osztás, jó lenne engedni a zárójelezést. Nem csak számokat, de változókat tegyünk bele! %{ %} [a-z] { } #include <stdlib.h> void yyerror(char *); #include "y.tab.h" /* variables */ yylval = *yytext - 'a'; return VARIABLE; /* integers */
6 [0-9]+ { yylval = atoi(yytext); return INTEGER; } /* operators */ [-+()=/*\n] { return *yytext; } /* skip whitespace */ [ \t] ; /* anything else is an error */. yyerror("invalid character"); int yywrap(void) { return 1; } Korábban említettük, hogy a %{ és %} olyan kódot írunk, amelyet szeretnénk, ha a lex automatikusan beszúrna a generálandó kódba. Ezúttal néhány #include kerül beszúrásra, valamint az yyerror() függvény deklarációja. Ez lesz majd az a függvény, amit az elkészült fordítónk meghív, ha a kapott szöveggel baj van. Ezután a fordítási szabályok részben ledefiniáljuk azt, hogy mit nevezünk változónak, számnak, operátornak (a definíciós részben nem neveztük el külön ıket, mert nem volt rá szükségünk) és meghatározzuk, hogy mit tegyen a fordítónk, ha ilyeneket talál. A definíciónk szerint a változó pontosan egy kis betőbıl állhat. Meghatározzuk az értékét és VARIABLE kulcsszót küldünk tovább a kimenetre. A számaink tetszıleges (nem nulla) számú számjegybıl állhatnak. Felsoroltuk még az operátorokat. Hozzávettük még a sorvége jelet is, de nem azért mert az operátor lenne, hanem azért, mert csakúgy mint az operátorokat, a sorvége jelet is szó nélkül továbbküldjük a kimenetre. Ha tabbal találkozunk, akkor azt kihagyjuk, arra semmi szükségünk. A. segítségével elérjük, hogy ha bármi mást kapunk, azt hibának vegye majd a fordítónk. Végül a felhasználói programok részben egyetlen függvényt definiálok. Az yywrap() függvény EOF-nál hívódik meg és esetleg megnyithatunk másik file-t olvasásra (és visszatérünk 0-val), vagy jelezzük, hogy ennyi volt és return 1-gyel térünk vissza. 2.4 Tokenek A lexer az összes készített tokennek azonosítót ad. Ha a verem tetején talált karaktersorozat több definiált reguláris kifejezésnek is megfelel, akkor a leghosszabb egyezést választja, ha a hosszak is megegyeznek, akkor az elsıt. A generált tokenek kb. 258-tól indulnak, mert minden karakternek le van foglalva az ASCII kódjának megfelelı azonosító, ezenkívül még van egy-két lefoglalt token, pl.: EOF. 2.5 Egy string lexikális elemzése Ha a fordítónkkal szeretnénk stringeket is kezelni, akkor meg kell vizsgálni, hogy a bemeneti fileba írt string nem lóg-e át a következı sorba és ha macskakörömmel kezdıdik, akkor azzal fejezıdik-e be. Erre ad lehetıséget a következı példa: %{
7 char buf[100]; char *s; %} %x STRING \" { BEGIN STRING; s = buf; } <STRING>\\n { *s++ = '\n'; } <STRING>\\t { *s++ = '\t'; } <STRING>\\\" { *s++ = '\"'; } <STRING>\" { *s = 0; BEGIN 0; printf("found '%s'\n", buf); } <STRING>\n { printf("invalid string"); exit(1); } <STRING>. { *s++ = *yytext; } Elıször definiálunk egy 100-as karakter tömböt, és egy char*-ot a tömbben való lépegetéshez. Ezután létrehozunk egy STRING nevő állapotot. Késıbb ha macskakörmöt találunk, akkor átváltunk ebbe az állapotba. Megadhatjuk, hogy lex hogyan viselkedjen ebben a megváltozott állapotában. Ha ezután újabb macskakörömmel találkozunk, akkor a string helyes volt, visszatérhetünk az eredeti állapotba, egyébként valami hibaüzenetet adunk. Lássuk ezt részletesebben: %x STRING utasítás definiál egy új állapotot. Ha \ et olvasunk, akkor át kéne lépni egy az általunk definiált új állapotba. Ezt tesszük a BEGIN STRING utasítással. <STRING>\n feltétel akkor teljesül, ha a STRING állapotban vagyunk és \n -t olvastunk. Ekkor természetesen hibát kell kiírnunk, mert a karaktersorozat közepén nem engedünk sortörést. Ha STRING állapotban vagyunk és macskakörmöt olvasunk, akkor tesszük amit tennünk kell, valamint visszaállítjuk az eredeti állapotot, hogy a kód többi részét normálisan elemezhessük. Megjegyzés A %x valami szabállyal elérhettük, hogy az új állapotban csak az állapot feltételeire figyeljen. %s valami szabállyal aktiválhatjuk úgy a valami állapotot, hogy a régi is megmarad. Ezután azok a feltételek is kiértékelésre kerülnek, ahol nincs állapot meghatározva, az is, ahol van. Ezt fokozni is lehet: %s state1 state2 állapotok deklarálása után lehet akár <state1, state2> feltételt megadhatunk. 2.6 Kimenet A lex tehát egy C-s forráskódot készít az lex.yy.c fileba. A kimeneti file nevét megváltoztathatjuk, ha a lexet a t kapcsolóval hívjuk.
8 2.7 Fontosabb hibaüzenetek Rule cannot be matched: Ez az üzenet akkor jelenik meg, amikor egy szabály alkalmazásához soha nem fog elérni, mert egy enyhébb szabály elızi meg. Pl: [a-z]+ {return valami;} szoveg {return valami_más} Ebben az esetben a szoveg -re soha nem fog eljutni, mivel elıtte az [a-z]+ szabályt alkalmazza, akkor is ha szoveg szót talál. 3. YACC A YACC a megadott nyelvtan file-ból létrehoz egy táblázatot egy LALR(1) számára. A nyelvtan lehet nem egyértelmő, ezt a precedencia szabályok teszik egyértelmővé (remélhetıleg). A bemeneti file itt is 3 részre bomlik, pont mint a lexben: definíciók fordítási szabályok felhasználói programok A definíciós részben token definíciók (lásd a számológépes példát néhány sorral lejjebb) és a generált file-ba helyezendı C kód kerülhet (a C kód ismét %{ és %} közé). A fordítási szabályok részbe kerül a nyelvtan leírása. 3.1 A számológépes példa folytatása Most írjuk meg a nyelvtant is a szintaktikus elemzéshez. %token INTEGER VARIABLE %left '+' '-' %left '*' '/' %{ #include <stdio.h> void yyerror(char *); int yylex(void); int sym[26]; %} program: program statement '\n' ; statement: expr { printf("%d\n", $1); } VARIABLE '=' expr { sym[$1] = $3; }
9 ; expr: INTEGER VARIABLE { $$ = sym[$1]; } expr '+' expr { $$ = $1 + $3; } expr '-' expr { $$ = $1 - $3; } expr '*' expr { $$ = $1 * $3; } expr '/' expr { $$ = $1 / $3; } '(' expr ')' { $$ = $2; } ; void yyerror(char *s) { fprintf(stderr, "%s\n", s); return 0; } int main(void) { yyparse(); return 0; } Elıször definiálunk két tokent, a változót és az egészt (csak egész számokkal dolgozunk). Ezután beállítjuk az operátorok asszociativitását: %left bal asszociatív %right jobb asszociatív %nonassoc nem asszociatív Az sorrend fontos! Az utolsónak definiált operátorok a legnagyobb precedenciájúak. Ezután a kódba automatikusan generálandó függvény deklarációk és változók definiálása következik. (stdio.h-t az yyerror függvényben használt fprintf miatt). A fordítási szabályok feldolgozása az órán tanultaknak megfelelıen egy dupla veremmel történik, (vagyis két veremmel, amelyek mindig konzisztensek maradnak egymáshoz képest, de a lényegen ez nem változtat). Tehát van például egy expr: expr * expr {$$ = $1 * $3;} szabályunk. Ha talál a terminálisokat és nyelvtani jeleket tartalmazó verem tetején ennek megfelelı elemeket, akkor kiveszi az elsı expr-et, a * -ot és a másik expr-et, majd egy expret rak vissza (hiszen ez van a bal oldalán a kettıspont elıtt). Mi pedig megadjuk a kapcsos zárójelek között, hogy a verembıl kivett elsı és harmadik értéket szorozza össze (a második a *, ezzel semmit nem teszünk), majd rakja vissza a verembe a szorzat eredményét (ezt teszi a $$= $1 * $3 utasítás). Az elsı fordítási szabály balrekurzió segítségével azt fejezi ki, hogy a program 0, 1, 2 állításból áll, az állítások végén sorvége jellel. Amikor a sorvége jelet észrevesszük, akkor kiírjuk az állítást. Megjegyzés: Technikai okokból fordítási szabály bal oldalán ne vizsgáljunk soha \0 (NULL) karaktert! Megjegyzés:
10 Ha választhatunk bal vagy jobb rekurzió között, mindig balrekurziót válasszunk, mert a jobb rekurzió nekiáll verembe pakolni, majd amikor kilép a legbelsı rekurzióból, akkor áll neki redukálni, ami elég megerıltetı szegény vermünk számára. Az állítás lehet egy kifejezés, ekkor kiírjuk az értékét, de lehet egy változó = kifejezés is. Emlékszünk mit tettünk a változókkal a lexnél? A változót egy egybetős karakternek definiáltuk. A lexben az azonosítóját úgy adtuk meg, hogy a változó ASCII kódjából kivontuk az a -t. Ezzel pont egy 0 és 25 közti értéket kaptunk, majd most a változóknak értékeinek tárolására létrehoztunk egy tömböt és ha az elıbb említett értékadást olvassuk ki a verembıl, akkor a változó azonosítójának megfelelı helyre beírjuk a tömbbe a változónak adandó értéket. A kifejezés lehet egy szám, ekkor semmit nem teszünk vele. Lehet egy változó is, ekkor az értékét adjuk vissza. Ha valamilyen mőveletet találunk, akkor elvégezzük. Ha zárójelben raboskodó kifejezést találunk, akkor kiszabadítjuk. Végül a felhasználói programok részben megírjuk, a hibakezelı függvényt, egyenlıre csak a megkapott hibaüzenetet kiírja, valamint megírjuk a main függvényt. A main egyszerően meghívja az yyparse() függvényt, ami az egész lexikális és szintaktikai ellenırzést végzi. Megjegyzés Természetesen a main függvényben ennél jóval többet tehetünk, például gondoskodhatunk arról, hogy az argumentumban kapott file-t megnyissunk és a fordítónk majd onnan olvassa be a fordítandó kódot: {% extern FILE *yyin; %} int main(int argc, char *argv[]) { yyin = fopen(argv[1], "r"); yyparse(); fclose(yyin); return 0; } Ráadásul az yyparse() 1-gyel tér vissza, ha valami kezelhetetlen hibát talált. 3.2 yylval típusa Az yylval típusa alapértelmezésben egész szám. Gyakran van azonban olyan, hogy nem csak egészekkel kívánunk dolgozni, sıt több típusú információt is el kéne tudni tárolni. Természetesen ekkor az yylval típusát meg kéne változtatni. Ezt könnyedén megtehetjük, ha létrehozunk egy unió típust, pl.: %union { int ivalue; /* integer value */ char sindex; /* symbol table index */ nodetype *nptr; /* node pointer */ }; Ez után az unió elemeit hozzáköthetjük a megfelelı tokenekhez és típusokhoz, pl.:
11 %token <ivalue> INTEGER %type <nptr> expr Az elsı sor az INTEGER tokent hozzáköti az unió ivalue eleméhez, míg a második sor hasonlóan mőködik az expr nem token kifejezéssel. A kötés fontos például az alábbihoz hasonló utasításokhoz: expr: INTEGER {printf( value: %d, $1);} INTEGER-t találtunk a verem tetején és csak azért hivatkozhatunk az értékére ($1-re) számként (vagyis %d-vel), mert a kötést megtettünk. Megjegyzés: Akik nem ismerik olyan jól a C nyelvet, azok számára érdemes megemlíteni, hogy pl. bool típust ne is próbáljunk létrehozni, használjunk helyette int-et. 3.3 Deklaráció Tegyük fel, hogy a fordítóprogramunkban a deklarációt úgy képzeljük el, hogy típus változólista. Ekkor, a változó listát ki kell fejteni és minden változónak meg kell tudjuk adni a típusát, valahogy így: decl: type varlist type: INT FLOAT varlist: VAR { settype($1, $0); } varlist ',' VAR { settype($3, $0); } Amikor változó listát találunk a veremben (varlist), akkor az rekurzióval kifejtjük, de hol van addigra már, hogy mi volt a típus? Közvetlenül a kivett elemek elıtt, hiszen típus változólista formában határoztuk meg. Emiatt ha az elsı tag a varlist, második a vesszı, harmadik pedig a VAR, akkor a 0. a típusa! Tehát $3-nak a $0 típust kell adni. 3.4 Hibakezelés Amikor a fordító programunk valamilyen hibát észlel, akkor nem célszerő, hogy azonnal leálljon. Jobb, ha megpróbálja túltenni magát a hibán és végignézi a fordítandó kód végét is. Pl.: utasítás: változó értékadás kifejezés ; {DoSomething();} ; Ha a fordítónknak beadott kódban ezek után írunk egy utasítást, de elfelejtünk pontosvesszıt tenni a végére, akkor kiírja nekünk fordítás közben, hogy syntax error, majd abbahagyja a fordítást. Ahhoz, hogy tovább fordítson, nekünk kell lekezelni a hibát, például a következı képpen: utasítás: változó értékadás kifejezés ; {DoSomething();} változó értékadás kifejezés {yyerror( Hiányzik a ;. );} ; Ha egy hasonló helyzetben találunk egy hibát, de nem a szöveg végén, hanem mondjuk kimarad az értékadás jel, akkor az utasítást már nem kell ellenırizni (hiszen hibás), írjunk ki hibaüzenetet, de a további vizsgálódást csak az utasítást követı pontosvesszıtıl folytassuk. Erre használható az e célból fenntartott error token. utasítás: változó értékadás kifejezés ; {DoSomething();} változó értékadás kifejezés {yyerror( Hiányzik a ;. );} error ;
12 ; Ez esetben külön lekezeljük a pontosvesszı hiányát, viszont minden más szintaktikai hiba esetén az error meghívja az yyerror függvényt (a sokatmondó syntax error string bemenettel), majd a következı pontosvesszıig nem elemzi a szöveget. Természetesen a ; helyére tetszıleges tokent írhatunk, például egy blokk végéig az error } utasítással hanyagolhatjuk az elemzést. Megjegyzés Az errorral az a nagy baj, hogy meghívja önkényesen az yyerrort, ami egy idegesítı és használhatatlan syntax error üzenetet eredményez. Ezt persze kikerülhetjük úgy, hogy amikor megírjuk az yyeror függvényt, akkor nem feltétlenül a paraméterként beadott stringet íratjuk ki vele, ezt már mindenkinek a saját képzeletére bízom. 3.5 Fontosabb kapcsolók -o output: y.tab.c helyett új kimenet megadása. -v: y.output file is létrehoz, ami tartalmazza a párosító táblák leírását és a nyelvtan kétértelmőségeit. -d: y.tab.h file-t is létrehozza, amelyben #define-nal összepárosítja a YACC által létrehozott token kódokat a felhasználó által adott token nevekkel. 3.6 Fontosabb hibaüzenetek symbol valami is undefined: Ezt az üzenetet akkor adja, ha olyan szimbólumot használunk a szabályok jobb oldalán (a kettıspont után), amit bal oldalon nem. Pl.: %token true false expr: boolexpr intexpr ; boolexpr: true false ; Láthatóan, az intexpr kifejezést nem deklaráltuk, nem fogja ismerni. a token appears on the lhs of a production: Egy szabály bal oldalára elızıleg tokennek definiált kifejezést írtunk. Ilyet nem tehetünk, mert mi a nyelvtanunk alapján a tokenekbıl kiindulva rövidítgetjük a szövegünket amíg el nem fogy. reduce/reduce conflict, shift/reduce conflict és shift/shift conflict: Ezek az üzenetek az jelentik, hogy a nyelvtanunk nem egyértelmően lett megírva, vagyis vagy a lépéskor, vagy a redukáláskor nem tudja egyértelmően eldönteni, hogy melyik szabályt alkalmazza. Ez nem fatális hiba, ettıl a C kódot még legenerálja, mert a YACC egyértelmővé teszi a mi nyelvtanunkat és ezt érdemes kihasználni (feltéve, hogy a gykvez. megengedi, hogy ilyen figyelmeztetés mellett jól mőködik a programunk).
13 A következı szabályok szerint jár el, ha nem egyértelmő a nyelvtanunk: 1. shift/reduce conflict esetén a shiftet hajtja végre, vagyis ha redukálás és lépés között kell válasszon, akkor mindig lépni fog. 2. reduce/reduce conflict esetén a korábban megírt szabály szerint jár el. 4. Lex és YACC együttmőködése Jelöljük a lex számára feldolgozandó file-okat.l kiterjesztéssel, a YACC által feldolgozandót.y kiterjesztéssel. Ez alapján tegyük fel, hogy az általunk megírt bemenete a lexnek a valami.l, és megírtuk már a YACC számára szükséges kódot is, ez a valami.y-ban található. Ekkor a YACC elolvassa a nyelvtani szabályokat a valami.y file-ból és elkészíti az yyparse párosító függvényt az y.tab.c-be. A d opció hatására a tokeneket ledefiniálja az y.tab.h file-ba. A lex kiolvassa a minták leírásait a valami.l file-ból, amibe bele kell foglaljuk az y.tab.h-t. Elkészíti az yylex lexikális elemzıt a lex.yy.c file-ba. Ezután nekünk már csak össze kell fordítani az egészet, valahogy így: cc lex.yy.c y.tab.c o valami. Ha a YACC-ot használók hibát kapnak, hogy nem találja az yylval-t, akkor az alábbi sort írjuk az #include <y.tab.h> alá: extern YYSTYPE yylval; Erre szüksége van a yaccnak, viszont a bison már automatikusan megteszi helyettünk. Látványosan a következı történik: YACC(szintaktikus_elemzınk.y) => y.tab.h, y.tab.c lex(lexikális_elemzınk.l) => lex..yy.c cc(y.tab.c, lex..yy.c) => fordítóprogramunk fordítóprogramunk(saját_programnyelvünkön_írt_kód) => büszkeségünk Amennyiben büszkeségünk egy asm kód, akkor nasm(büszkeségünk.asm) => büszkeségünk.o cc(büszkeségünk.o) => futtatható_állományunk 5. Egy-két tanács a kezdetekhez Érdemes elıször megírni a nyelvtan file-t, vagyis a YACC bemenetét, már csak azért is, mert a lexbe include-olni kell a YACC által generált y.tab.h-t. Viszont nem érdemest fejjel menni a falnak, vagyis elıször a nyelvtani szabályokat megírjuk, de nem kell erıltetni a szabályokhoz tartozó C kód megírását valamint a Hibakezelés pontban említett plusz sorokat is hanyagoljuk egyenlıre. Lesz még azokkal elég baj késıbb, pl: kifejezés: kifejezés + kifejezés {} kifejezés - kifejezés {} ; A kapcsos zárójelek kitöltése még ráér. Viszont amint meg van a nyelvtan csontváza, írjuk meg a lex bemenetét, vagyis a lexikális elemzıt. Rögtön írjunk a félkész fordítónkhoz egy gagyi példát, és fordítsuk le a fordítóprogramunkat, ha ez sikerült, akkor a fordítóprogramunkkal fordítsuk le a példánkat. Mivel nem írtunk C kódot, ne várjunk tıle kimeneti file-t, viszont arra jó, hogy megtudjuk: a szerintünk jónak ítélt példát a fordító programunk is jónak látja-e. Általában nem. Ekkor
14 nyilall belénk a felismerés, hogy a syntax error üzenetek, amelyek még a hiba sorát sem adják meg semmire nem jók. Eddig még nem foglalkoztunk hibakezeléssel, azonban ezt rögtön pótoljuk: a lex bemenetének írt fileban számoljuk a sorokat vagyis kell egy változó, ami 0-ról indul és minden \n hatására nı. Ezt látnunk kell a YACC bementében is, ott extern kulcsszóval tegyük láthatóvá (mivel ott a main, amiben induláskor le kell nullázni, és ott írjuk meg az yyerror-t, amiben használjuk a változót). Az yyerror-t mindenki saját szája szerint írja meg, de a hibaüzenetekhez feltétlenül csapja hozzá az aktuális sor számlálónk értékét. Ez létfontosságú. Ennél több hibakezelés nem szükséges kódolás elıtt. Most már elkezdhetjük megírni a C kódokat, hogy legyen kimenete a fordítónknak. Ha a fordítónk példakódot jónak talál, amit mi is jónak szeretnénk minısíteni, és mindent hibásnak, amit mi is hibásnak szeretnénk jelezni, akkor lehet kifinomult hibaüzenetekkel és a Hibakezelés pontban leírt módszerekkel alakítgatni a fordítóprogramunkat. Mindenkinek sok sikert kívánok a kódolással töltött álmatlan éjszakákhoz.
15 Irodalomjegyzék Csörnyei Zoltán: Bevezetés a fordítóprogramok elméletébe I. (mindenkinek ajánlom, aki egy kicsit részletesebb, tömör leírás iránt érdeklıdik)
Bisonc++ tutorial. Dévai Gergely. A szabály bal- és jobboldalát : választja el egymástól. A szabályalternatívák sorozatát ; zárja le.
Bisonc++ tutorial Dévai Gergely A Bisonc++ egy szintaktikuselemz -generátor: egy környezetfüggetlen nyelvtanból egy C++ programot generál, ami egy tokensorozat szintaktikai helyességét képes ellen rizni.
RészletesebbenJava II. I A Java programozási nyelv alapelemei
Java2 / 1 Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2009. 02. 09. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve
RészletesebbenAWK programozás, minták, vezérlési szerkezetek
10 AWK programozás, minták, vezérlési szerkezetek AWK adatvezérelt szkriptnyelv text processing, adat kiterjesztés, tagolt adatok automatizált soronkénti feldolgozása a forrásállományt soronként beolvassa
RészletesebbenA C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,
RészletesebbenProgramozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek
Programozás alapjai gyakorlat 4. gyakorlat Konstansok, tömbök, stringek Házi ellenőrzés (f0069) Valósítsd meg a linuxos seq parancs egy egyszerűbb változatát, ami beolvas két egész számot, majd a kettő
RészletesebbenFlex tutorial. Dévai Gergely
Flex tutorial Dévai Gergely A Flex (Fast Lexical Analyser) egy lexikáliselemz -generátor: reguláris kifejezések sorozatából egy C/C++ programot generál, ami szövegfájlokat képes lexikai elemek sorozatára
RészletesebbenA C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,
RészletesebbenAWK programozás Bevezetés
09 AWK programozás Bevezetés AWK adatvezérelt szkriptnyelv text processing, adat kiterjesztés, tagolt adatok automatizált soronkénti feldolgozása a forrásállományt soronként beolvassa és feldolgozhatóvá
RészletesebbenAWK programozás, minták, vezérlési szerkezetek
10 AWK programozás, minták, vezérlési szerkezetek AWK futtatási módok AWK parancs, közvetlen programkódmegadás: awk 'PROGRAMKÓD' FILE példa: ls -l awk '{print $1, $5}' a programkód helyére minden indentálás
RészletesebbenProgramozás II. 2. Dr. Iványi Péter
Programozás II. 2. Dr. Iványi Péter 1 C++ Bjarne Stroustrup, Bell Laboratórium Első implementáció, 1983 Kezdetben csak precompiler volt C++ konstrukciót C-re fordította A kiterjesztés alapján ismerte fel:.cpp.cc.c
RészletesebbenBevezetés a programozásba I.
Bevezetés a programozásba I. 6. gyakorlat C++ alapok, szövegkezelés Surányi Márton PPKE-ITK 2010.10.12. Forrásfájlok: *.cpp fájlok Fordítás: a folyamat, amikor a forrásfájlból futtatható állományt állítunk
RészletesebbenProgramozás alapjai gyakorlat. 2. gyakorlat C alapok
Programozás alapjai gyakorlat 2. gyakorlat C alapok 2016-2017 Bordé Sándor 2 Forráskód, fordító, futtatható állomány Először megírjuk a programunk kódját (forráskód) Egyszerű szövegszerkesztőben vagy fejlesztőkörnyezettel
RészletesebbenFüggvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.
Függvény pointer Több feladat közül futási időben döntöm el, hogy melyiket hajtom végre. A függvényre mutató pointer a függvény kódjának a címére mutat, azon keresztül meghívhatom a függvényt. A pointernek
RészletesebbenProgramozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)
Programozás alapjai C nyelv 8. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.07. -1- Mutatók és címek (ism.) Minden változó és függvény
RészletesebbenC programozás. 6 óra Függvények, függvényszerű makrók, globális és
C programozás 6 óra Függvények, függvényszerű makrók, globális és lokális változók 1.Azonosítók A program bizonyos összetevőire névvel (azonosító) hivatkozunk Első karakter: _ vagy betű (csak ez lehet,
RészletesebbenMutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában
Programozás alapjai C nyelv 8. gyakorlat Szeberényi mre BME T Programozás alapjai. (C nyelv, gyakorlat) BME-T Sz.. 2005.11.07. -1- Mutatók és címek (ism.) Minden változó és függvény
RészletesebbenProgramozás C és C++ -ban
Programozás C és C++ -ban 2. További különbségek a C és C++ között 2.1 Igaz és hamis A C++ programozási nyelv a C-hez hasonlóan definiál néhány alap adattípust: char int float double Ugyanakkor egy új
RészletesebbenFordítóprogramok (A,C,T szakirány) Feladatgy jtemény
Fordítóprogramok (A,C,T szakirány) Feladatgy jtemény ELTE IK 1 Lexikális elemzés 1. Add meg reguláris nyelvtannal, reguláris kifejezéssel és véges determinisztikus automatával a következ lexikális elemeket!
RészletesebbenLekérdezések az SQL SELECT utasítással. Copyright 2004, Oracle. All rights reserved.
Lekérdezések az SQL SELECT utasítással Copyright 2004, Oracle. All rights reserved. Az SQL SELECT utasítás lehetıségei Vetítés Kiválasztás 1. tábla 1. tábla Összekapcsolás 1. tábla 2. tábla 1-2 Copyright
RészletesebbenJava II. I A Java programozási nyelv alapelemei
Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak
RészletesebbenC programozási nyelv
C programozási nyelv Előfeldolgozó utasítások Dr Schuster György 2011 május 3 Dr Schuster György () C programozási nyelv Előfeldolgozó utasítások 2011 május 3 1 / 15 A fordítás menete Dr Schuster György
RészletesebbenBASH SCRIPT SHELL JEGYZETEK
BASH SCRIPT SHELL JEGYZETEK 1 TARTALOM Paraméterek... 4 Változók... 4 Környezeti változók... 4 Szűrők... 4 grep... 4 sed... 5 cut... 5 head, tail... 5 Reguláris kifejezések... 6 *... 6 +... 6?... 6 {m,n}...
RészletesebbenFordítóprogramok. és formális nyelvek
Fordítóprogramok és formális nyelvek Szerkesztette : Király Roland 2007 magasszintű nyelvi program program.cpp Fordítóprogram szerkezete fordító program c++l compiler Alacsonyszintű nyelvi program program.exe
RészletesebbenKarakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!
A PL/SQL alapelemei Karakterkészlet Az angol ABC kis- és nagybetűi: a-z, A-Z Számjegyek: 0-9 Egyéb karakterek: ( ) + - * / < > =! ~ ^ ; :. ' @ %, " # $ & _ { }? [ ] Szóköz, tabulátor, kocsivissza A kis-
RészletesebbenProgramozás 6. Dr. Iványi Péter
Programozás 6. Dr. Iványi Péter 1 Előfeldolgozás része Makrók A forrás kódban elvégzi a helyettesítéseket a fordító Csak egyszer végez helyettesítést Nem olyan makrók, mint a LISP vagy Scheme esetén Csak
Részletesebben7. fejezet: Mutatók és tömbök
7. fejezet: Mutatók és tömbök Minden komolyabb programozási nyelvben vannak tömbök, amelyek gondos kezekben komoly fegyvert jelenthetnek. Először is tanuljunk meg tömböt deklarálni! //Tömbök használata
RészletesebbenC++ programozási nyelv Konstruktorok-destruktorok
C++ programozási nyelv Konstruktorok-destruktorok Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. szeptember A C++ programozási nyelv Soós Sándor 1/20 Tartalomjegyzék
RészletesebbenA C programozási nyelv V. Struktúra Dinamikus memóriakezelés
A C programozási nyelv V. Struktúra Dinamikus memóriakezelés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv V. (Struktúra, memóriakezelés) CBEV5 / 1 A struktúra deklarációja 1.
RészletesebbenProgramozás I. gyakorlat
Programozás I. gyakorlat 1. gyakorlat Alapok Eszközök Szövegszerkesztő: Szintaktikai kiemelés Egyszerre több fájl szerkesztése pl.: gedit, mcedit, joe, vi, Notepad++ stb. Fordító: Szöveges file-ban tárolt
RészletesebbenSzoftvertervezés és -fejlesztés I.
Szoftvertervezés és -fejlesztés I. Operátorok Vezérlési szerkezetek Gyakorlás 1 Hallgatói Tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő anyag vázlatát képezik.
RészletesebbenEmlékeztető: LR(0) elemzés. LR elemzések (SLR(1) és LR(1) elemzések)
Emlékeztető Emlékeztető: LR(0) elemzés A lexikális által előállított szimbólumsorozatot balról jobbra olvassuk, a szimbólumokat az vermébe tesszük. LR elemzések (SLR() és LR() elemzések) Fordítóprogramok
RészletesebbenOperációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED
UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED AWK - szintaxis, vezérlési szerkezetek Operációs rendszerek 11. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Csuvik
Részletesebben1. Alapok. #!/bin/bash
1. oldal 1.1. A programfájlok szerkezete 1. Alapok A bash programok tulajnképpen egyszerű szöveges fájlok, amelyeket bármely szövegszerkesztő programmal megírhatunk. Alapvetően ugyanazokat a at használhatjuk
RészletesebbenOperációs Rendszerek Gyakorlat Triviális segédfeladatok 2009. június 4. 1. PERL Tömbök és hashek Feladat: 2009. május 26-i beugró
Operációs Rendszerek Gyakorlat Triviális segédfeladatok 2009. június 4. Összeállította: Méreg Balázs (mbalazs@varfok.vein.hu) Külsı forrás: 2009. május 26-i beugró 1. PERL Tömbök és hashek Feladat: 2009.
RészletesebbenBevezetés a programozásba I.
Bevezetés a programozásba I. 8. gyakorlat Fájlkezelés Surányi Márton PPKE-ITK 2010.11.02. Fájlkezelés C++-ban C++-ban van lehet ségünk fájlok kezelésére. Itt már tényleges fájlokkal dolgozunk, nem pedig
RészletesebbenJárműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás
Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás 5.3. Mutatók,tömbök A mutató vagy pointer olyan változó, amely egy másik változó címét tartalmazza. A C nyelvű programokban gyakran használják a
RészletesebbenProgramozás I gyakorlat
Programozás I. - 9. gyakorlat Sztringkezelés, mutatók Tar Péter 1 Pannon Egyetem M szaki Informatikai Kar Rendszer- és Számítástudományi Tanszék Utolsó frissítés: November 2, 2009 1 tar@dcs.vein.hu Tar
RészletesebbenSzkriptnyelvek. 1. UNIX shell
Szkriptnyelvek 1. UNIX shell Szkriptek futtatása Parancsértelmez ő shell script neve paraméterek shell script neve paraméterek Ebben az esetben a szkript tartalmazza a parancsértelmezőt: #!/bin/bash Szkriptek
RészletesebbenA C programozási nyelv VI. Parancssori argumentumok File kezelés
A C programozási nyelv VI. Parancssori argumentumok File kezelés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv VI. (Parancssori argumentum, file kezelés) CBEV6 / 1 Parancssori
Részletesebbensallang avagy Fordítótervezés dióhéjban Sallai Gyula
sallang avagy Fordítótervezés dióhéjban Sallai Gyula Az előadás egy kis példaprogramon keresztül mutatja be fordítók belső lelki világát De mit is jelent, az hogy fordítóprogram? Mit csinál egy fordító?
RészletesebbenOccam 1. Készítette: Szabó Éva
Occam 1. Készítette: Szabó Éva Párhuzamos programozás Egyes folyamatok (processzek) párhuzamosan futnak. Több processzor -> tényleges párhuzamosság Egy processzor -> Időosztásos szimuláció Folyamatok közötti
RészletesebbenHORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport
10-es Keressünk egy egész számokat tartalmazó négyzetes mátrixban olyan oszlopot, ahol a főátló alatti elemek mind nullák! Megolda si terv: Specifika cio : A = (mat: Z n m,ind: N, l: L) Ef =(mat = mat`)
RészletesebbenVezérlési szerkezetek
Vezérlési szerkezetek Szelekciós ok: if, else, switch If Segítségével valamely ok végrehajtását valamely feltétel teljesülése esetén végezzük el. Az if segítségével valamely tevékenység () végrehajtását
RészletesebbenFormális nyelvek és automaták
Formális nyelvek és automaták Nagy Sára gyakorlatai alapján Készítette: Nagy Krisztián 2. gyakorlat Ismétlés: Megjegyzés: Az ismétlés egy része nem szerepel a dokumentumban, mivel lényegében a teljes 1.
RészletesebbenPénzügyi algoritmusok
Pénzügyi algoritmusok A C++ programozás alapjai Az Integrált Fejlesztői Környezet C++ alapok Az Integrált Fejlesztői Környezet Visual Studio 2013 Community Edition Kitekintés: fordítás Preprocesszor Fordító
RészletesebbenStatisztikai függvények
EXCEL FÜGGVÉNYEK 9/1 Statisztikai függvények ÁTLAG(tartomány) A tartomány terület numerikus értéket tartalmazó cellák értékének átlagát számítja ki. Ha a megadott tartományban nincs numerikus értéket tartalmazó
RészletesebbenJárműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás
Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás 4.11. A C előfeldolgozó rendszer A fordítás első lépése a C esetében a különböző nyelvi kiterjesztések feldolgozása: másik állomány tartalmának
RészletesebbenMáté: Assembly programozás
Paraméter másutt is előfordulhat a makró törzsben, nemcsak az operandus részen, pl.: PL macro p1,p2 mov ax,p1 P2 p1 PL mov INC Adat, INC ax,adat Adat A &, %,! karakterek továbbá a és ;; speciális szerepet
RészletesebbenSzövegek C++ -ban, a string osztály
Szövegek C++ -ban, a string osztály A string osztály a Szabványos C++ könyvtár (Standard Template Library) része és bár az objektum-orientált programozásról, az osztályokról, csak később esik szó, a string
RészletesebbenProgramozás C++ -ban
Programozás C++ -ban 6. Konstansok A C nyelvben konstansokat makróval is deklarálhatunk. Ebben az esetben mindenhol ahol a makró előfordul a fordító a definiált értéket behelyettesíti a makró helyére.
RészletesebbenProgramozás I. 5. Előadás: Függvények
Programozás I 5. Előadás: Függvények Függvény Egy alprogram Egy C program általában több kisméretű, könnyen értelmezhető függvényből áll Egy függvény megtalálható minden C programban: ez a main függvény
RészletesebbenFüggvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r
Programozás I. Széchenyi István Egyetem, Gy r 2014. november 16. Áttekintés kel kapcsolatos fogalmak deklaráció Több, kompatibilis változat is elképzelhet. Meg kell el znie a fv. hívását. Mindenképp rögzíti
RészletesebbenOOP I. Egyszerő algoritmusok és leírásuk. Készítette: Dr. Kotsis Domokos
OOP I. Egyszerő algoritmusok és leírásuk Készítette: Dr. Kotsis Domokos Hallgatói tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendı anyag vázlatát képezik. Ismeretük
Részletesebben1. Jelölje meg az összes igaz állítást a következők közül!
1. Jelölje meg az összes igaz állítást a következők közül! a) A while ciklusban a feltétel teljesülése esetén végrehajtódik a ciklusmag. b) A do while ciklusban a ciklusmag után egy kilépési feltétel van.
RészletesebbenForráskód formázási szabályok
Forráskód formázási szabályok Írta: Halmai Csongor, Webcenter Bt. A php és html kódrészletek Ugyanazon fájlon belül nem szerepelhet php kód és html tartalom. E kettő különválasztására smarty-t vagy más
RészletesebbenJárműfedélzeti rendszerek II. 4. előadás Dr. Bécsi Tamás
Járműfedélzeti rendszerek II. 4. előadás Dr. Bécsi Tamás 6. Struktúrák A struktúra egy vagy több, esetleg különböző típusú változó együttese, amelyet a kényelmes kezelhetőség céljából önálló névvel látunk
RészletesebbenC programozási nyelv Pointerek, tömbök, pointer aritmetika
C programozási nyelv Pointerek, tömbök, pointer aritmetika Dr. Schuster György 2011. június 16. C programozási nyelv Pointerek, tömbök, pointer aritmetika 2011. június 16. 1 / 15 Pointerek (mutatók) Pointerek
RészletesebbenKifejezések. Kozsik Tamás. December 11, 2016
Kifejezések Kozsik Tamás December 11, 2016 Kifejezések Lexika Szintaktika Szemantika Lexika azonosítók (változó-, metódus-, típus- és csomagnevek) literálok operátorok, pl. + zárójelek: (), [], {},
Részletesebben12. gyakorlat Enum; Tárolási osztályok Preprocesszor utasítások; Moduláris programozás
12. gyakorlat Enum; Tárolási osztályok Preprocesszor utasítások; Moduláris programozás Házi (f0174) Egy sor kiíratási formátuma: "nev: %s; pont: %d;". Olvasd be a kiírt számot úgy, ha tudod, hogy a kiírt
RészletesebbenSegédanyagok. Formális nyelvek a gyakorlatban. Szintaktikai helyesség. Fordítóprogramok. Formális nyelvek, 1. gyakorlat
Formális nyelvek a gyakorlatban Formális nyelvek, 1 gyakorlat Segédanyagok Célja: A programozási nyelvek szintaxisának leírására használatos eszközök, módszerek bemutatása Fogalmak: BNF, szabály, levezethető,
Részletesebben1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3
Darvay Zsolt Típusok és nevek a forráskódban Állandók és változók Hatókörök és az előfeldolgozó Bevitel és kivitel Kifejezések Utasítások Mutatók Függvények Struktúrák és típusok Állománykezelés C programozás
RészletesebbenProgramozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double
Programozás alapjai C nyelv 4. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.10.. -1- Mit tudunk már? Típus fogalma char, int, float,
RészletesebbenMechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe
Mechatronika és mikroszámítógépek 2017/2018 I. félév Bevezetés a C nyelvbe A C programozási nyelv A C egy általános célú programozási nyelv, melyet Dennis Ritchie fejlesztett ki Ken Thompson segítségével
RészletesebbenA szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok
A szemantikus elemzés helye Forrásprogram Forrás-kezelő (source handler) Lexikális elemző (scanner) A szemantikus elemzés feladatai Fordítóprogramok előadás (A, C, T szakirány) Szintaktikus elemző (parser)
RészletesebbenFordítóprogramok. Aszalós László. 2009. szeptember 7.
Fordítóprogramok Aszalós László 2009. szeptember 7. 1. Bemelegítés Honlap: www.inf.unideb.hu/ aszalos/diak.html (Fordítóprogramok, 2009) Jegymegajánló: utolsó hét előadásán. PótZH (csak gyakorlat) vizsgaidőszak
RészletesebbenObjektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015
Objektumorientált programozás Pál László Sapientia EMTE, Csíkszereda, 2014/2015 9. ELİADÁS Kivételkezelés (Exception handling) 2 Mi a kivétel (exception)? A kivétel, olyan hibás állapot vagy esemény, amely
RészletesebbenKifejezések. Kozsik Tamás. December 11, 2016
Kifejezések Kozsik Tamás December 11, 2016 Kifejezés versus utasítás C/C++: kifejezés plusz pontosvessző: utasítás kiértékeli a kifejezést jellemzően: mellékhatása is van például: értékadás Ada: n = 5;
RészletesebbenMemóriagazdálkodás. Kódgenerálás. Kódoptimalizálás
Kódgenerálás Memóriagazdálkodás Kódgenerálás program prológus és epilógus értékadások fordítása kifejezések fordítása vezérlési szerkezetek fordítása Kódoptimalizálás L ATG E > TE' E' > + @StPushAX T @StPopBX
RészletesebbenProgramozás alapjai. 5. előadás
5. előadás Wagner György Általános Informatikai Tanszék Cserélve kiválasztásos rendezés (1) A minimum-maximum keresés elvére épül. Ismétlés: minimum keresés A halmazból egy tetszőleges elemet kinevezünk
RészletesebbenProgramozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE
Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK Sapientia EMTE 2015-16 1 Felülnézet 1 Feltételes fordítás #if, #else, #elif, #endif, #ifdef, #ifndef stb. Felülnézet 2 #include: hatására a preprocesszor
RészletesebbenSQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók
SQL*Plus Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP dolgozó), DEPT osztály) "közönséges" felhasználók Adatszótár: metaadatokat tartalmazó, csak olvasható táblák táblanév-prefixek:
RészletesebbenFüggvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)
Programozás alapjai C nyelv 7. gyakorlat Szeberényi Imre BME IIT Függvények C program egymás mellé rendelt függvényekből áll. A függvény (alprogram) jó absztrakciós eszköz a programok
RészletesebbenProgramozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)
Programozás alapjai C nyelv 7. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.11.05. -1- Függvények C program egymás mellé rendelt függvényekből
RészletesebbenTömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása
Tömbök kezelése Példa: Vonalkód ellenőrzőjegyének kiszámítása A számokkal jellemzett adatok, pl. személyi szám, adószám, taj-szám, vonalkód, bankszámlaszám esetében az elírásból származó hibát ún. ellenőrző
RészletesebbenA C programozási nyelv III. Pointerek és tömbök.
A C programozási nyelv III. Pointerek és tömbök. Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 1 Mutató (pointer) fogalma A mutató olyan változó,
RészletesebbenINFORMATIKA javítókulcs 2016
INFORMATIKA javítókulcs 2016 ELMÉLETI TÉTEL: Járd körbe a tömb fogalmát (Pascal vagy C/C++): definíció, egy-, két-, több-dimenziós tömbök, kezdőértékadás definíciókor, tömb típusú paraméterek átadása alprogramoknak.
RészletesebbenA programozás alapjai 1 Rekurzió
A programozás alapjai Rekurzió. előadás Híradástechnikai Tanszék - preorder (gyökér bal gyerek jobb gyerek) mentés - visszaállítás - inorder (bal gyerek gyökér jobb gyerek) rendezés 4 5 6 4 6 7 5 7 - posztorder
Részletesebben3. Osztályok II. Programozás II
3. Osztályok II. Programozás II Bevezető feladat Írj egy Nevsor osztályt, amely legfeljebb adott mennyiségű nevet képes eltárolni. A maximálisan tárolható nevek számát a konstruktorban adjuk meg. Az osztályt
RészletesebbenKészítette: Nagy Tibor István
Készítette: Nagy Tibor István A változó Egy memóriában elhelyezkedő rekesz Egy értéket tárol Van azonosítója (vagyis neve) Van típusa (milyen értéket tárolhat) Az értéke értékadással módosítható Az értéke
RészletesebbenOperációs Rendszerek II. labor. 2. alkalom
Operációs Rendszerek II. labor 2. alkalom Mai témák (e)grep Shell programozás (részletesebben, példákon keresztül) grep Alapvető működés: mintákat keres a bemeneti csatorna (STDIN vagy fájl) soraiban,
RészletesebbenProgramozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar
Programozás I. 3. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1 Primitív típusok Típus neve Érték Alap érték Foglalt tár Intervallum byte Előjeles egész 0 8 bit
RészletesebbenS z á m í t ó g é p e s a l a p i s m e r e t e k
S z á m í t ó g é p e s a l a p i s m e r e t e k 7. előadás Ami eddig volt Számítógépek architektúrája Alapvető alkotóelemek Hardver elemek Szoftver Gépi kódtól az operációs rendszerig Unix alapok Ami
RészletesebbenProgramozási nyelvek (ADA)
Programozási nyelvek (ADA) Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 3. előadás Programozási nyelv felépítése szabályok megadása Lexika Milyen egységek építik fel? Szintaktikus szabályok
RészletesebbenA C programozási nyelv III. Pointerek és tömbök.
A C programozási nyelv III. Pointerek és tömbök. Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv III. (Pointerek, tömbök) CBEV3 / 1 Mutató (pointer) fogalma A mutató olyan változó,
RészletesebbenFordító részei. Fordító részei. Kód visszafejtés. Izsó Tamás szeptember 29. Izsó Tamás Fordító részei / 1
Fordító részei Kód visszafejtés. Izsó Tamás 2016. szeptember 29. Izsó Tamás Fordító részei / 1 Section 1 Fordító részei Izsó Tamás Fordító részei / 2 Irodalom Izsó Tamás Fordító részei / 3 Irodalom Izsó
RészletesebbenRekurzió. Dr. Iványi Péter
Rekurzió Dr. Iványi Péter 1 Függvényhívás void f3(int a3) { printf( %d,a3); } void f2(int a2) { f3(a2); a2 = (a2+1); } void f1() { int a1 = 1; int b1; b1 = f2(a1); } 2 Függvényhívás void f3(int a3) { printf(
Részletesebben1. Alapok. Programozás II
1. Alapok Programozás II Elérhetőség Név: Smidla József Elérhetőség: smidla dcs.uni-pannon.hu Szoba: I916 2 Irodalom Bjarne Stroustrup: A C++ programozási nyelv 3 Irodalom Erich Gamma, Richard Helm, Ralph
RészletesebbenBevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok
Bevezetés a programozásba II 5. Előadás: Másoló konstruktor, túlterhelés, operátorok Emlékeztető struct Vektor { int meret, *mut; Vektor(int meret); int szamlal(int mit); }; int Vektor::szamlal(int mit)
RészletesebbenA függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.
Függvények 1.Függvények...1 1.1.A függvény deníció szintaxisa... 1..Függvények érték visszatérítése...3 1.3.Környezettel kapcsolatos kérdések...4 1.4.Lokális változók használata...4 1.5.Rekurzív hívások...5.kód
RészletesebbenWebprogramozás szakkör
Webprogramozás szakkör Előadás 5 (2012.04.09) Programozás alapok Eddig amit láttunk: Programozás lépései o Feladat leírása (specifikáció) o Algoritmizálás, tervezés (folyamatábra, pszeudokód) o Programozás
Részletesebben1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon
1. Template (sablon) 1.1. Függvénysablon Maximum függvény megvalósítása függvénynév túlterheléssel. i n l i n e f l o a t Max ( f l o a t a, f l o a t b ) { return a>b? a : b ; i n l i n e double Max (
RészletesebbenObjektumorientált programozás C# nyelven
Objektumorientált programozás C# nyelven 2. rész Öröklés és többalakúság Nemvirtuális metódusok, elrejtés Virtuális metódusok, elrejtés Típuskényszerítés, az is és as operátorok Absztrakt osztályok, absztrakt
RészletesebbenMintavételes szabályozás mikrovezérlő segítségével
Automatizálási Tanszék Mintavételes szabályozás mikrovezérlő segítségével Budai Tamás budai.tamas@sze.hu http://maxwell.sze.hu/~budait Tartalom Mikrovezérlőkről röviden Programozási alapismeretek ismétlés
RészletesebbenA C++ nyelvben a függvény nevek túlterhelésével biztonságosabbá tehetnénk az adatok kiírását és beolvasását.
1. Motiváció C nyelvben a printf és a scanf függvények használata a programozótól nagy körültekintést igényel. A változó számú argumentum miatt a fordító nem tudja ellenőrizni, hogy a formátum mezőben
RészletesebbenProgramozás C++ -ban 2007/7
Programozás C++ -ban 2007/7 1. Másoló konstruktor Az egyik legnehezebben érthető fogalom C++ -ban a másoló konstruktor, vagy angolul "copy-constructor". Ez a konstruktor fontos szerepet játszik az argumentum
RészletesebbenObjektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése
Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése Készítette: Gregorics Tibor Szabóné Nacsa Rozália Alakítsunk át egy infix formájú aritmetikai kifejezést postfix
RészletesebbenTuring-gép május 31. Turing-gép 1. 1
Turing-gép 2007. május 31. Turing-gép 1. 1 Témavázlat Turing-gép Determinisztikus, 1-szalagos Turing-gép A gép leírása, példák k-szalagos Turing-gép Univerzális Turing-gép Egyéb Turing-gépek Nemdeterminisztikus
RészletesebbenAlprogramok, paraméterátadás
ELTE Informatikai Kar, Programozási Nyelvek és Fordítóprogramok Tanszék October 24, 2016 Programozási nyelvek Alprogramok Függvények, eljárások Metódusok Korutinok stb. Alprogramok Alprogram: olyan nyelvi
Részletesebbenfile./script.sh > Bourne-Again shell script text executable << tartalmat néz >>
I. Alapok Interaktív shell-ben vagy shell-scriptben megadott karaktersorozat feldolgozásakor az első lépés a szavakra tördelés. A szavakra tördelés a következő metakarakterek mentén zajlik: & ; ( ) < >
RészletesebbenInformatika szigorlat. A lexikális elemző feladatai közé tartozik a whitespace karakterek (a
Informatika szigorlat 17-es tétel: Felülről lefelé elemzések 1. Lexikális elemzés A lexikális elemző alapvető feladata az, hogy a forrásnyelvű program lexikális egységeit felismerje, azaz meghatározza
Részletesebben