Fordítóprogramok: Lex és YACC

Méret: px
Mutatás kezdődik a ... oldaltól:

Download "Fordítóprogramok: Lex és YACC"

Á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 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észletesebben

Java II. I A Java programozási nyelv alapelemei

Java 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észletesebben

AWK programozás, minták, vezérlési szerkezetek

AWK 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észletesebben

A C programozási nyelv I. Bevezetés

A 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észletesebben

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozá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észletesebben

Flex tutorial. Dévai Gergely

Flex 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észletesebben

A C programozási nyelv I. Bevezetés

A 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észletesebben

AWK programozás Bevezetés

AWK 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észletesebben

AWK programozás, minták, vezérlési szerkezetek

AWK 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észletesebben

Programozás II. 2. Dr. Iványi Péter

Programozá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észletesebben

Bevezetés a programozásba I.

Bevezeté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észletesebben

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Programozá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észletesebben

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Fü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észletesebben

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Programozá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észletesebben

C 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 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észletesebben

Mutató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

Mutató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észletesebben

Programozás C és C++ -ban

Programozá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észletesebben

Fordítóprogramok (A,C,T szakirány) Feladatgy jtemény

Fordí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észletesebben

Leké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. 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észletesebben

Java II. I A Java programozási nyelv alapelemei

Java 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észletesebben

C programozási nyelv

C 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észletesebben

BASH SCRIPT SHELL JEGYZETEK

BASH 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észletesebben

Fordítóprogramok. és formális nyelvek

Fordí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észletesebben

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

Karakterké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észletesebben

Programozás 6. Dr. Iványi Péter

Programozá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észletesebben

7. fejezet: Mutatók és tömbök

7. 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észletesebben

C++ programozási nyelv Konstruktorok-destruktorok

C++ 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észletesebben

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

A 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észletesebben

Programozás I. gyakorlat

Programozá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észletesebben

Szoftvertervezés és -fejlesztés I.

Szoftvertervezé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észletesebben

Emlékeztető: LR(0) elemzés. LR elemzések (SLR(1) és LR(1) elemzések)

Emlé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észletesebben

Operációs rendszerek. 11. gyakorlat. AWK - szintaxis, vezérlési szerkezetek UNIVERSITAS SCIENTIARUM SZEGEDIENSIS UNIVERSITY OF SZEGED

Operá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észletesebben

1. Alapok. #!/bin/bash

1. 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észletesebben

Operá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. 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észletesebben

Bevezetés a programozásba I.

Bevezeté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észletesebben

Já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 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észletesebben

Programozás I gyakorlat

Programozá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észletesebben

Szkriptnyelvek. 1. UNIX shell

Szkriptnyelvek. 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észletesebben

A C programozási nyelv VI. Parancssori argumentumok File kezelés

A 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észletesebben

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

sallang 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észletesebben

Occam 1. Készítette: Szabó Éva

Occam 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észletesebben

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

HORVÁ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észletesebben

Vezérlési szerkezetek

Vezé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észletesebben

Formális nyelvek és automaták

Formá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észletesebben

Pénzügyi algoritmusok

Pé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észletesebben

Statisztikai függvények

Statisztikai 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észletesebben

Já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 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észletesebben

Máté: Assembly programozás

Má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észletesebben

Szövegek C++ -ban, a string osztály

Szö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észletesebben

Programozás C++ -ban

Programozá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észletesebben

Programozás I. 5. Előadás: Függvények

Programozá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észletesebben

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

Fü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észletesebben

OOP 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 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észletesebben

1. 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! 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észletesebben

Forráskód formázási szabályok

Forrá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észletesebben

Já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 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észletesebben

C programozási nyelv Pointerek, tömbök, pointer aritmetika

C 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észletesebben

Kifejezések. Kozsik Tamás. December 11, 2016

Kifejezé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észletesebben

12. 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 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észletesebben

Segédanyagok. Formális nyelvek a gyakorlatban. Szintaktikai helyesség. Fordítóprogramok. Formális nyelvek, 1. gyakorlat

Segé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észletesebben

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

1.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észletesebben

Programozá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. 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észletesebben

Mechatronika é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 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észletesebben

A 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. 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észletesebben

Fordítóprogramok. Aszalós László. 2009. szeptember 7.

Fordí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észletesebben

Objektumorientá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 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észletesebben

Kifejezések. Kozsik Tamás. December 11, 2016

Kifejezé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észletesebben

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Memó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észletesebben

Programozás alapjai. 5. előadás

Programozá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észletesebben

Programozá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 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észletesebben

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

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 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észletesebben

Fü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)

Fü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észletesebben

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Programozá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észletesebben

Tö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 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észletesebben

A C programozási nyelv III. Pointerek és tömbök.

A 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észletesebben

INFORMATIKA javítókulcs 2016

INFORMATIKA 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észletesebben

A programozás alapjai 1 Rekurzió

A 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észletesebben

3. Osztályok II. Programozás II

3. 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észletesebben

Készítette: Nagy Tibor István

Ké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észletesebben

Operációs Rendszerek II. labor. 2. alkalom

Operá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észletesebben

Programozá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 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észletesebben

S 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 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észletesebben

Programozási nyelvek (ADA)

Programozá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észletesebben

A C programozási nyelv III. Pointerek és tömbök.

A 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észletesebben

Fordí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. 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észletesebben

Rekurzió. Dr. Iványi Péter

Rekurzió. 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észletesebben

1. Alapok. Programozás II

1. 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észletesebben

Bevezeté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 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észletesebben

A 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.

A 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észletesebben

Webprogramozás szakkör

Webprogramozá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észletesebben

1. 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 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észletesebben

Objektumorientált programozás C# nyelven

Objektumorientá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észletesebben

Mintavételes szabályozás mikrovezérlő segítségével

Mintavé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észletesebben

A 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.

A 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észletesebben

Programozás C++ -ban 2007/7

Programozá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észletesebben

Objektum 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 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észletesebben

Turing-gép május 31. Turing-gép 1. 1

Turing-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észletesebben

Alprogramok, paraméterátadás

Alprogramok, 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észletesebben

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

file./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észletesebben

Informatika szigorlat. A lexikális elemző feladatai közé tartozik a whitespace karakterek (a

Informatika 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