Examensarbete. Kompilator system för integration av SQL- databas i Ada- baserat system genom ODBC

Storlek: px
Starta visningen från sidan:

Download "Examensarbete. Kompilator system för integration av SQL- databas i Ada- baserat system genom ODBC"

Transkript

1 Mälardalens högskola Institutionen för Datateknik Examensarbete datalogi nivå C Examinator: Christer Norström Företag: Celciustech AB, Järfälla Handledare: Anders Jansson Examensarbete Kompilator system för integration av SQL- databas i Ada- baserat system genom ODBC Järfälla Monica Larsson mln99005@student.mdh.se David Löfqvist dlt99001@student.mdh.se

2 Förord Vi vill tacka företaget CelsiusTech AB som gav oss möjligheten att utföra vårt Examensarbete hos dem. Det mesta på företaget så som maten, medarbetare, arbetsrum var bra. Ett speciellt tack går till vår handledare Anders Jansson och initiativtagaren till exjobbet Daniel Wengelin. Även Hugo Löving som hoppade in som vår handledare när Anders Jansson var borta skall ha ett tack. En olycklig omständighet var att den tilltänkta handledaren slutade innan vi hann komma igång med examensarbetet. Han var den som var mest insatt i de områden som examensarbetet innefattar. Hans kunskap och förståelse för hur systemet är uppbyggt och fungerar idag skulle ha underlättat mycket i analysen av problemet, samt säkert förkortat inlärnings samt förståelsetiden för oss. Förmodligen skulle han med sin förståelse också kunnat ge oss värdefulla tips och förslag på lösningar på de problem vi stötte på vid implementationen av kompilatorsystemet. Kanske inte implementations mässigt men på en mer abstrakt nivå, som kanske skulle ha lett till ett mer robust och smartare kompilatorsystem. Istället blev det Anders Jansson som fick hoppa in som handledare. Han visade sig vara väldigt allround och duktig på det mesta. Men någon vecka efter det att vi satt igång med examensarbetet fick Anders ett erbjudande om ett nytt jobb vilket resulterade i att han sa upp sig. Detta faktum verkar dock inte haft någon större positiv/negativ inverkan på hur han handledde oss. Det som dock påverkade negativt var att han hade väldigt mycket att göra jämt och att han inte hann installera ODBC programvaran innan han gick på semester. Detta ledde till ett glapp på 2-3veckor då problemet med kopplingen mellan Ada och ODBC inte kunde arbetas på. Istället lades all energi på kompilatorsystemet vilket var ineffektivt. Någon vecka innan Anders kom tillbaka från semestern undersöktes hur ODBC fungerar. Detta gjordes för att snabbt komma igång med testningen av Ada till ODBC kopplingen när väl Anders kommit tillbaka. När Anders kom tillbaka tog han genast tag i problemet. Efter vissa problem vid installationen och konfigureringen av ODBC började det fungera.

3 Sammanfattning Examensarbetet har utförts på bl.a. CelsiusTech System AB eller numera Saab Tech Systems i Järfälla. På CTS utvecklas ett system som simulerar omvärlden till det operativa ledningssystemet av typ STRIC, främst i syfte att ge personalen i STRIC möjlighet att öva på sina uppgifter. Övningarna sker i förpreparerade spel vilka lagras i en databas och sedan vid övningstillfället läses in och exekveras i realtid. Vad som simuleras är Tex. radardata, flyg, marin etc. För att integrera simuleringsapplikationerna med databasen används ett definitionsspråk, SAMeDL, i vilken databasfrågorna definieras. En prekompilator (SAME) genererar Ada- kod och C- kod med embedded SQL. Den implementation av SAMeDL som används idag är behäftad med en hel del fel som måste åtgärdas genom efterbearbetning av den genererade koden. Det är här examensarbetet kommer in för att om möjligt lösa problemen med dagens tillvägagångssätt. Till skillnad från nuvarande implementation skall ett kompilatorsystem generera Ada kod för en ODBC gränsyta snarare än C och embedded SQL kod för en CT-lib gränsyta. Efter en analys av SAMeDL bestämdes det att ett eget kompilatorsystem byggt med hjälp av Lex och Yacc var lösningen på problemet. Lex och Yacc är program som används för att bygga upp kompilatorsystem. Det kompilatorsystem som utvecklades kan hantera syntaxen i de flesta av input filerna (SME-filerna), samt generera output i form av Ada kod. Ada koden anropar databasen genom en ODBC gränsyta. Lösningen med ODBC som gränsyta mot databasen ger ett standardiserat och flexiblare system, vilket gör att man utan problem kan byta ut vilken typ av databas som skall användas. På grund av tidsbrist klarar kompilatorsystemet bara att generera komplett output för en SME fil. Dock finns det inget som säger att det skulle vara svårt eller omöjligt att generera kompletta output filer för alla SME filer. Det som menas med kompletta output filer är att dessa filer skall generera exakt samma resultat som innan ombyggnationen av systemet, men utan efterbearbetning av fel.

4 Innehållsförteckning BAKGRUND...5 SYFTE...6 AVGRÄNSNINGAR...6 KONVENTIONER...6 FÖRKORTNINGAR...6 PROBLEMBESKRIVNING...7 PROBLEMANALYS...7 ADA...7 ODBC...7 UTVECKLINGSMILJÖ...10 ÖVERSIKTLIG BESKRIVNING AV NUVARANDE SYSTEM SAME...11 VARFÖR BEHÖVS SAME?...11 MÅL METOD LÖSNING INPUTFILERNAS (*.SME) EGENSKAPER...13 PRAKTISKT GENOMFÖRANDE...13 ADA TILL ODBC LÖSNING...21 RESULTAT FRAMTIDA ARBETE LITTERATURFÖRTECKNING BILAGA1...1 FLEX OCH BISON INTRODUKTION...1 Flex...1 Bison...2 BILAGA2...1 EN *.SME FILS UPPBYGGNAD...1 DBIF_DDD.SME FILENS ÖVERSIKTLIGA UPPBYGGNAD MED KOMMENTARER....2 S_DB.SME FILENS ÖVERSIKTLIGA UPPBYGGNAD MED KOMMENTARER....3 FLEX- FUNKTIONER...3 BISON...10 GRAMMATIK BISON...10 C- KODS DEL BISON...14 Figurförteckning FIGUR 1: DELAR I SIMULERINGEN...5 FIGUR 2: ODBC ETT GRÄNSSNITT MELLAN APPLIKATIONER OCH DATABASER...7 FIGUR 3: NUVARANDE SYSTEM...11 FIGUR 4: MÅLSYSTEMETS UPPBYGGNAD...12

5 Bakgrund Strics är ett system som simulerar omvärlden till det operativa ledningssystemet av typ STRIC, främst i syfte att ge personalen i STRIC möjlighet att öva på sina uppgifter. Övningarna sker i förpreparerade spel vilka lagras i en databas och sedan vid övningstillfället läses in och exekveras i realtid för att generera simulerat radardata etc. System Strics använder en relationsdatabas, Sybase, för att lagra data. Prepareringen sker med Javaoch 4GL- applikationer. Simuleringsapplikationerna är främst skrivna i Ada95. Plattformen för exekvering av övningarna är IBM/6000 med operativsystemet AIX, en Unix- variant. För att integrera simuleringsapplikationerna med databasen används ett definitionsspråk, SAMeDL, i vilken databasfrågorna definieras. En prekompilator genererar Ada- kod och C- kod med embedded SQL: Den implementation av SAMeDL som används idag är behäftad med en hel del fel som måste åtgärdas genom efterbearbetning av den genererade koden. 890 JAS/JA37 Flygbaser LIFV Flygbaser LIFV FK stab MILMET RTD RS D SU Radio FY L STRIC SYSIM 1-2 STRIC Telefoni ATC LULIS LC LV FIGUR 1: DELAR I SIMULERINGEN. lfc typ 1 LV-ordersändare LVrb 5

6 Syfte Examensarbetet består i att genom en analys av SAMeDL definiera, implementera och testa ett kompilatorsystem. Till skillnad från nuvarande implementation ska kompilatorsystemet generera Ada kod för en ODBC- gränsyta snarare än C och embedded SQL för en CT-lib gränsyta. ODBC gränssnittet ska även det implementeras och testas. Förslagsvis används LEX/YACC för att generera Ada95- kod. Alternativt används något scriptspråk för att implementera kompilatorn. Avgränsningar När vi i började med lex & yacc, så fick vi problem. Se i förordet. Detta gjorde att på slutet så fick vi avgränsa oss mer än vad vi önskade. Grammatiken för kompilatorn är skriven för ett fåtal av *.smefilerna. Konventioner Förkortningar Ada = Ada är ett högnivåspråk DB = DataBase DBIF = DataBase InterFace Interface mellan Ada applikationer och databasen DBMS = DataBase Management System ODBC = Open Database Connectivity standardiserat databasinterface SQL = Structured Query Language, ett standardiserat språk som används för att kommunicera med en relationsdatabas. SAME = SQL Ada Module Extension En metod för att skapa ett gränssnitt mellan Ada och SQL databaser. SAME består av ett antal Ada support paket. SAMeDL = SQL Ada Module Extension Description Language Ett språk för automatisk generering av SAME interface SME = Handskrivna input filer till SAME STRIC = Är ett nytt svenskt luftförsvarssystem STICS = Är ett system som simulerar omvärlden till det operativa ledningssystemet av typ STRIC 6

7 Problembeskrivning 1: Det nuvarande gränssnittet mot databasen består av ett CT- lib, som nu upplevs som gammalmodigt. Det gör tex. systemet bundet vid en viss sorts produkt av databas och ett visst språk. 2: Den nu använda produkten för kompilering av SAMeDL och handhavandet av denna är något trög, med ett flertal moment av handpåläggning. Exempelvis är SAMeDL behäftad med en hel del fel som måste åtgärdas genom efterbearbetning av den genererade koden vilket gör systemet långsamt. Problemanalys För att få ett mer flexibelt och modernare system skall CT-lib ersättas av ODBC och all C-kod som används för att anropa CT-lib skall ersättas av Ada-kod som anropar ODBC. Problemet kan delas upp i ett antal mindre delar: För att lösa problemet med att ersätta dagens C/CT-lib gränssnitt mot ett ADA/ODBC gränssnitt måste ett sätt att få fram ADA/ODBC kod tänkas ut. Går det att byta ut det befintliga sättet som används idag med en egen kompilatorlösning? Lex och yacc ska testas för att se om en kompilator kan byggas som ska tolka SME syntaxen och parsa fram motsvarande Ada samt ODBC kod, skriven i Ada. Ada En undersökning som skulle ta reda på om det finns Ada till ODBC kopplingar utfördes. Denna gav som resultat att det finns flera, T.ex. Iodbc ett freeware samt Datadirect från företaget MERANT. Men hur fungerar dessa då? För att få svar på den frågan gjordes en prototyp där Iodbc användes, prototypen gav svaret att det går att från Ada anropa ODBC. Finns det tillräcklig information I SME filerna för att kunna parsa fram all nödvändig Ada kod? För att hitta svaret på den frågan undersöktes hur dagens system fungerar. Det visade sig att den information som behövdes fanns i några olika filer som beskriver vilka tabeller, typer etc. som finns i databasen. Odbc För att genom ODBC kunna anropa en databas krävs viss kunskap om hur ODBC fungerar. Här följer en liten introduktion till ODBC. ODBC är ett standardiserat programmeringsgränssnitt för databasåtkomst. ODBC arkitekturen är uppbyggd för komponentbaserad databasåtkomst, vilket ger en logisk separation av applikationer och databaser (se figur 2). Applikation Applikation Applikation ODB DBM DBM DBM FIGUR 2: ODBC ETT GRÄNSSNITT MELLAN APPLIKATIONER OCH DATABASER. 7

8 ODBC är designat för att ge applikationer åtkomstmöjlighet till olika databaser utifrån samma källkod. Databasapplikationer anropar funktioner som finns inbakade I ODBC drivrutinerna. Användningen av drivrutinerna isolerar applikationerna från databasspecifika anrop, på samma sätt som drivrutiner för skrivare isolerar ordbehandlar program från skrivarspecifika kommandon. Tack vare att drivrutinerna laddas vid run-time kan man genom att lägga till en ny drivrutin få åtkomst till nya databaser, utan att behöva kompilera om applikationen. Nedan följer ett litet ODBC exempel. Några av dessa punkter är ej nödvändiga för att anropa en databas men de finns med för att ge ett utförligare exempel. 1. Det första man behöver är en variabel av typen SQLHENV. Den variabeln är handtaget till en intern ODBC struktur som innehåller all information om ODBC s environment. 2. Sätt environmentattribut som Tex. vilken ODBC version om det behövs. 3. Allokera ett anslutningshantag som används för att ansluta till databasen. 4. Sätt anslutningsattribut som Tex. timeout. 5. Anslut till databasen 6. Allokera ett statementhantag som är ett hantag till det statement som skall utföras 7. Bind kolumner till att lägga resultatet av SQL frågan i. 8. Exekvera statement 9. Räkna antalet kolumner som frågan resulterade i. 10. Räkna antalet rader som frågan resulterade i. 11. Hämta och skriv ut resultatet från kolumnerna. 12. Frigör resurser. ODBC exempel skriven i C: /* odbc.c */ #include <stdlib.h> #include <stdio.h> #include <odbc/sql.h> #include <odbc/sqlext.h> #include <odbc/sqltypes.h> SQLHENV V_OD_Env /* Handle ODBC environment */ long V_OD_erg /* result of functions */ SQLHDBC V_OD_hdbc /* Handle connection */ char V_OD_stat[10] /* Status SQL */ SQLINTEGER V_OD_err,V_OD_rowanz,V_OD_id SQLSMALLINT V_OD_mlen,V_OD_colanz char V_OD_msg[200],V_OD_buffer[200] int main(int argc,char *argv[]) /* 1. Allocate Environment handle and register version */ 8

9 V_OD_erg=SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env) /*2. Set some environment attributes */ V_OD_erg=SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)sql_ov_odbc3, 0) /* 3. Allocate connection handle */ V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc) /*4. Set some connection attributes */ SQLSetConnectAttr(V_OD_hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)5, 0) /* 5. Connect to the data source "web" */ V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "web", SQL_NTS, (SQLCHAR*) "christa", SQL_NTS, (SQLCHAR*) "", SQL_NTS) printf("connected!\n") /*6. Allocate statement handle */ V_OD_erg=SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt) /*7. Bind columns to put result of SQL query in */ SQLBindCol(V_OD_hstmt,1,SQL_C_CHAR, &V_OD_buffer,150,&V_OD_err) SQLBindCol(V_OD_hstmt,2,SQL_C_ULONG,&V_OD_id,150,&V_OD_err) /*8. Execute statement */ V_OD_erg=SQLExecDirect(V_OD_hstmt,"SELECT dtname,iduser FROM tkeyuser order by iduser",sql_nts) /*9. Count result columns */ V_OD_erg=SQLNumResultCols(V_OD_hstmt,&V_OD_colanz) printf("number of Columns %d\n",v_od_colanz) /*10. Count result rows */ V_OD_erg=SQLRowCount(V_OD_hstmt,&V_OD_rowanz) printf("number of Rows %d\n",v_od_rowanz) /*11. Fetch the result from the columns and print it */ V_OD_erg=SQLFetch(V_OD_hstmt) while(v_od_erg!= SQL_NO_DATA) printf("result: %d %s\n",v_od_id,v_od_buffer) V_OD_erg=SQLFetch(V_OD_hstmt) /*12. Free resources */ SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt) SQLDisconnect(V_OD_hdbc) SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc) SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env) return(0) 9

10 Utvecklingsmiljö Uppgiften skall lösas på IBM/6000 med operativsystemet AIX, en Unix- variant. Språken som skall användas är C, Ada, SAMeDL, Embedded SQL, ODBC samt Lex och yacc. Eventuellt skall flex och bison som är gnu versioner av lex och yacc användas. Eftersom vi inte har så stora kunskaper inom något av dessa områden eller språk förutom i C kan detta visa sig vara en besvärlig tröskel att komma över. 10

11 Översiktlig beskrivning av nuvarande system SME-fil Embedded SQL Ada-body Adaspecifikation Applikationer C-kod CT-lib Visar kod genereringen Databas Visar anrops kedjan FIGUR 3: NUVARANDE SYSTEM. SAME SAME är en metod för att designa gränssnittet mellan applikationen, som är skriven i Ada95, och SQL, som används för att kommunicera med en relationsdatabas. SAMeDL är ett DBMS- oberoende språk som beskriver applikationens behov av databasgränssnitt. SAMeDL koden genererar, när den kompileras Ada-kod åt applikationshållet och C-kod ner mot databasen. Varför behövs SAME? Strics applikationen är skriven i språket Ada95. Varje systemenhet i applikationen, som har behov av databas data skriver en SAMeDL- specifikation. SAMeDL- specifikationen är handskriven och har suffixet *.sme, den fungerar som input till SAME. Från *.sme genereras motsvarande Ada- kod + C- kod. C- koden fungerar med CT-lib. 11

12 Mål SME-fil Ada-body Adaspecifikation Applikationer ODBC Databas Visar kod genereringen Visar anrops kedjan FIGUR 4: MÅLSYSTEMETS UPPBYGGNAD. Att från *.sme filerna generera ADA kod samt i den genererade Ada koden lägga till ODBC anrop istället för embedded sql och c-kods anrop till databasen Metod Databasgränssnittet ODBC undersöks och analyseras. Kan CT- lib bytas ut mot ODBC, vad är då värdet av detta? Utgångs ODBC är en freeware, eventuellt kommer en ODBC- applikation köpas in senare, under arbetets gång. En undersökning och utvärdering ska göras av värdet av att ersätta SAME med annan process. Kan *.sme filerna(eller eventuell den nya notationen) kompileras och på detta sätt generera Ada95 kod. Ada95 koden ska då kunna kommunicera med ODBC gränssnittet utan vidare transformering. På uppmaning av examensarbetets initiativtagare, Daniel Wengelin, så har en utvärdering av An Automatic Object- Oriented Parser Generator for Ada (AdaGOOP) gjorts. Eftersom parseträdet som AdaGOOP producerar har som input ada95 så är dock inte denna produkt aktuell, den aktuella applikationen har *.sme filer som input(samedl). En utvärdering av Aflex- An Ada Lexical Analyzer och Ayacc User s Manual har också gjorts. Skillnaden mellan lex och aflex samt yacc och ayacc är den att genererade filer som handhar den lexikaliska analysen respektive parsningen är skrivna i Ada. Vi är ännu ej så hemma på Ada och föredrar lex och yacc, då den är skriven i språket C, som vi är mer bekanta med. Eventuellt kommer FLEX och Bison som är gnu- versioner av lex och yacc användas om det ger större utvecklings möjligheter eller lättare lösning på problemet. 12

13 Lösning Inputfilernas (*.sme) egenskaper En *.sme fil (input filen) innehåller inte tillräcklig information för att generera *.ads och *.adb direkt, utan även Dbif_DDD.sme och S_db.sme måste parsas. Dbif_DDD..sme är en fil som håller alla i databasens förekommande variablers egenskaper. S_db.sme är en fil som håller alla i databasen förekommande databastabeller och dess struktur. Exempel på *.sme fil dessa tre filer visas i bilaga2.. Praktiskt genomförande Applikationen består av fyra filer, big.bison, big.flex, makefile och link.h big.flex s struktur med förklarande kommentarer inom /*...*/ : % /* början på definitionsdel */ #include <stdio.h> #include <string.h> #include <ctype.h> #include "big.bison.tab.h" #include "link.h" /* lineno håller reda på vilken aktuell rad i *.sme- filen som parsas */ /* with_counter räknar hur många with- förekomster som finns i aktuell *.sme- filen. Beroende /*på antalet with genereras olika with- block till *.ads och *.adb */ /*************************** counters **********************************************/ int lineno = 1 /* keeps track on line in inputfile */ int with_counter = 0 /* keeps track on occurenses of with */ /* Olika flaggor, som signalerar när ett keyword, id eller tecken ska sparas, signalerar även så att */ /* korrupt data ej sparas. Sparat data används då keyword, id eller tecken genereras i *.ads */ /* eller *.adb- filen */ /* OBS! Flera flaggor har tagits bort för att förenkla i rapporten */ /*********** different flags that signals when to save and **************************/ /*********** prevents the struct- arrays to hold corrupt data********************/...int signal3 = -1 /* signals when to save a procedures name used in *.adb */ int alarm = -1 /* signal when to save variables type used in *.ads */ int alarm4 = -1 /* signals when to save variables type in records body */ int alarm5 = -1 /* signals when to save variables type in cursors input */... /* Olika index, som räknas upp när ett keyword, id eller tecken har sparats undan i struct- arrayen */ /* OBS! Flera index har tagits bort för att förenkla */ /************ different index to keep track in struct- array*******************/... int odd2 = 1 /* used in sql_type() */ int cu2 = 0 /* index in curs_variables_type */ int sqllen = 0... /* Struct- arrayerna används för att spara undan tokens när det */ /* är nödvändigt, används för att genereras sedan i *.ads eller *.adb- filen */ /* OBS! Flera arrayer har tagits bort för att förenkla */ /********struct arrays that saves data that is used later when generating *.ads and *.adb ******/... struct inp_curs curs_sql_type[200] /* is used to save the Cursors variables SQL_type, is used later in *.adb */ struct inp_curs procedure_name[20] /* is used to save a name off procedure */... /* Hur flaggor, index och struct- arrayer fungerar redovisas nedanför i C- kods */ % /* slut på del som kopieras ordagrant till lex.yy.c*/ 13

14 /* Här anges hur ett token kan vara uppbyggt */ delim [ \t] /* delim är tab och mellanslag */ WS delim+ /* WS är en eller fler delims */ LETTER [A-Za-z] /* bokstäver */ UND [_] /* enskilda tecken som särskiljs */ DOT [.] PAR_ONE [(] PAR_TWO [)] COL [:] QUO ["] ATOM [,] DIGIT [0-9] /* siffror*/ ID LETTER(LETTER DIGIT UND DOT)* /* En godkänd variabel börjar med minst en bokstav, sedan versaler, gemener, siffror,., _ */ COMMENT "--"(.)*\n /* En kommentar börjar med -- sedan kommer vad-som-helst samt avslutas med nyradstecken */ N "NULL" /* NULL och NOT NULL särskiljs */ NN "NOT NULL" %% /* slut på definitions delen */ /* Regel del. OBS! Delar av aktions har tagits bort har för att förenkla, anges... */ WS COMMENT lineno++ /* radnr i *.sme fil räknas upp */ N strcpy(yylval.yystring,yytext)return N NN...strcpy(yylval.yystring,yytext) return NN /*Enskilda tecken som särskiljs. yytext[0] returneras till parsern dvs. det tecken som är det */ /* associerade värdet till aktuellt token */ PAR_ONE... if(alarm5 == 1) alarm5 = 2 return yytext[0] PAR_TWO return yytext[0] COL if(alarm4 == 2) alarm4 = 3... return yytext[0] QUO alarm5 = 0... if(alarm == 1) alarm = 0 return yytext[0] ATOM... return yytext[0] \n lineno++ /* radnr i *.sme fil räknas upp */ /* Nyckelorden definieras. Returvärdet är ett heltalsvärde som deklarerats som token i bisons */ /* specifikations- fil. Vid strcpy(yylval.yystring,yytext) så kopieras yytext-värdet till yylval.yystring */ /* som är en omdefinierad variabel yylval. yylval kan ses som en kommunikationsmöjlighet*/ /* mellan flex och bison. Dvs. inte enbart det returnerade heltalsvärdet av token är synligt i bison */ /* utan också tokens associerade värde */ abstract strcpy(yylval.yystring,yytext) return ABSTRACT and strcpy(yylval.yystring,yytext) return AND authorization by close_cursor... signal3 = 0 strcpy(yylval.yystring,yytext) return CLOSE_CURSOR close strcpy(yylval.yystring,yytext) return CLOSE cursor strcpy(yylval.yystring,yytext) return CURSOR Cursor... alarm5 = 1 alarm = 1 strcpy(yylval.yystring,yytext) return CURSOR delete strcpy(yylval.yystring,yytext) return DELETE get... signal3 = 0 strcpy(yylval.yystring,yytext) return GET get_is strcpy(yylval.yystring,yytext) return GET_IS end strcpy(yylval.yystring,yytext) return END fetch strcpy(yylval.yystring,yytext) return FETCH for... strcpy(yylval.yystring,yytext) return FOR from... strcpy(yylval.yystring,yytext) return FROM FROM strcpy(yylval.yystring,yytext) return FROM 14

15 insert strcpy(yylval.yystring,yytext) return INSERT in... if(alarm5 == 2) alarm5 = 3 strcpy(yylval.yystring,yytext) return IN into... strcpy(yylval.yystring,yytext) return INTO is... if(alarm4 == 1) alarm4 = 2 strcpy(yylval.yystring,yytext) return IS like strcpy(yylval.yystring,yytext) return LIKE module named strcpy(yylval.yystring,yytext) return NAMED open_cursor... signal3 = 0 strcpy(yylval.yystring,yytext) return OPEN_CURSOR open strcpy(yylval.yystring,yytext) return OPEN or strcpy(yylval.yystring,yytext) return OR order strcpy(yylval.yystring,yytext) return ORDER_BY update strcpy(yylval.yystring,yytext) return UPDATE procedure... signal3 = 1 strcpy(yylval.yystring,yytext) return PROCEDURE record alarm4 = 1 strcpy(yylval.yystring,yytext) return RECORD schema_db select... strcpy(yylval.yystring,yytext) return SELECT set strcpy(yylval.yystring,yytext) return SET status strcpy(yylval.yystring,yytext) return STATUS use strcpy(yylval.yystring,yytext) return USE VALUES strcpy(yylval.yystring,yytext) return VALUES where strcpy(yylval.yystring,yytext) return WHERE with strcpy(yylval.yystring,yytext) with_counter++ return WITH ID strcpy(yylval.yystring,yytext)... if(alarm5 == 3) save_input_type (3) if(alarm4 == 3) save_input_type(2) if(alarm == 1) save_variables_type() if(signal3 == 1) save_proc_name()... return ID. return yytext[0] /* returnera enskilt tecken */ %% /* slut på regeldelen */ /* C- kods del. OBS! Här visas yywrap() och save_proc_name() */ /* Flera funktioner visas i bilags delen längsta bak i rapporten,*/ /* alla funktioner i flex redovisas inte */ /**********************************************************************************/ /* YYWRAP */ /**********************************************************************************/ /* A function that is used when END OF FILE is found */ /**********************************************************************************/ yywrap() return (1) /*************************************************************************************************/ /* save_proc_name() fungerar så här: ( se gärna tidigare i rapporten då en *.sme - fil presenteras) */ /* Det som ska sparas är xxx : */ /* procedure xxx(yyy: in Dbif_DDD.yyy NOT NULL) */ /* Flaggan signal3 sätts till 1 när nyckelordet procedure förekommer sedan sparas yylval.yystring då xxx */ /* förekommer i ID och signal3 = 1. I funktionen där sparandet utförs så sätts signal3 = 0 för att */ /* undvika att sparande av korrupt data. */ * /* Nyckelordet procedure förekommer även i Cursor men då sätts alltid signal3 = 0 i efterföljande */ /* keyword så yylval.yystring inte sparas felaktigt. Name räknas upp efter kopieringen. */ /*Behovet att spara uppkommer då id ska genereras i *.adb på plats där xxx inte */ /* längre är aktuellt token. */ 15

16 /**********************************************************************************/ /* SAVE_PROC_NAME */ /**********************************************************************************/ /* A function that saves the procedures name from yylval.yystring used later */ /* when printing to *.adb */ /**********************************************************************************/ save_proc_name() fixstring(yylval.yystring) strcpy(procedure_name[name].input, yylval.yystring) name++ signal3 = 0 big.bison s struktur med förklarande kommentarer inom /*...*/ : /* Deklarations- del, C- kods del */ % #include <errno.h> #include <stdio.h> #include <string.h> #include <ctype.h> #include "link.h" /*Här finns struct för länkad lista och struct-array*/ #define FILE_NAME 50 FILE *file /* Pekare till input filen dvs. *.sme */ char *tok /* Håller sträng som ska genereras i *.ads */ char *tok_adb /* Håller sträng som ska genereras i *.ads */ /* Strängkonstanter som används. OBS! Några har plockats bort*/... char *one = " " char *three = " " char *six = " " char *nine = " " char *twelve = " " char *fifteen = " " char *eighteen = " " char *fence = " \n" char *t_r_i = "type Row_Type is" char *s_ql = "Sqlcode : Sql_Standard.Sqlcode_Type" char *standard = "Sql_Standard.Indicator_Type" char *if_not = "if not ((Sqlcode < 0) or (Sqlcode = 100)) then" char *raise = "raise Samedl_Standard.Null_Value_Error" /* Variabeldeklarationer OBS! Några har plockats bort */... extern int lineno /*keeps track on actual line in input file*/ extern int with_counter /*keeps track on with occurrences*/ extern int signal3 /* flags used in big.flex, but is re- defined in main */... extern int alarm5 extern int cu2 /* index used in big.flex, but is re- defined in main */... extern int sqllen... extern struct inp_curs database_stmnt[200]... extern struct inp_curs curs_variables_type[200] int ready = 0 /* Används då with- blocken genereras */ int first = 0 /* Används då if- else block genereras i *.adb*/ % /* Bison del */ %union /* yylval omdefinieras till att enbart hålla strängar*/ char yystring[100] /* type deklareras. (Dvs. lablar eller icketerminaler) */ %type <yystring> cur_like aoo_id aoo_id1 aoo_id2 aoo_orderby aoo_and aoo_token %type <yystring> cur_i4 cur_tok1 cur_s cur_tok2 aoo_status2 %type <yystring> prog the_end with abstract abs_id record rec_id rec_is 16

17 %type <yystring> rec_token rec_end the_cursor cur_id3 cur_id4 cur_token1 %type <yystring> the_procedure p_procedure1 p_tkn p_tkn1 p_id p_null p_is1 %type <yystring> select sel_id sel_tkn sel_nam sel_null sel_into sel_from %type <yystring> sel_status update u_id u_set u_tkn u_tkn1 u_where delete %type <yystring> del_from del_id del_where del_status insert ins_id ins_tkn %type <yystring> ins_tkn ins_into end_param ins_from values ins_status cur_afterid %type <yystring> cur_in cur_null cur_for cur_select cur_xnn cur_from cur_where cur_t %type <yystring> aoo_like1 aoo_or aoo_is1 aoo_tkn aoo_is aoo_proc1 aoo_proc aoo_oc1 %type <yystring> aoo_cursor aoo_is1 aoo_oc aoo_fe aoo_status aoo_status1 aoo_tkn1 %type <yystring> '' ':' '(' ')' ',' '<' '>' '=' '"' /* token deklareras. (Dvs. terminaler) */ %token <yystring> ABSTRACT ANDCLOSE_CURSOR CLOSE CURSOR DELETE END FETCH FOR %token <yystring> FROM GET GET_IS ID INSERT IN INTO IS LIKE NAMED N NN OPEN_CURSOR %token <yystring> OPEN OR ORDER_BY PROCEDURE RECORD SET SELECT STATUS UPDATE %token <yystring> USE VALUES WITH WHERE %% /* slut på deklarationsdel */ /* Grammatik del OBS! Grammatik delen är förkortad*/ /*... == aktiondelen borttagen,... == stycken av grammatik borttagen */ /* prog är start label för grammatiken */ /* Några funktioner som används i grammatikdelen, förklaras i C- kods */ /* delen längre fram i rapporten */ /* Olika with- block genereras för olika antal with förekomster som flex hittat*/ prog: WITH with if(with_counter == 1) gen_with(1) if((with_counter > 1) && (ready == 0)) gen_with(2) ready = 1 USE with ABSTRACT abstract... RECORD record... CURSOR the_cursor... PROCEDURE the_procedure... END the_end tok_adb = oneemit_adb(tok_adb) tok_adb = $1emit_adb(tok_adb) tok_adb = "\n"emit_adb(tok_adb) tok = oneemit_ads(tok) tok = $1emit_ads(tok) tok = "\n"emit_ads(tok) /*********** END************************************************************/ the_end: ID '' tok_adb = "\n\n\n" emit_adb(tok_adb) tok_adb = "" emit_adb(tok_adb) fixstring($1)tok_adb = $1 emit_adb(tok_adb) tok = "\n\n\n" emit_ads(tok) tok = "" emit_ads(tok) fixstring($1)tok = $1 emit_ads(tok) /************WITH USE***********************************************/ with: ID '' prog /************ ABSTRACT ************************************/ abstract: ID abs_id... abs_id: IS prog... /*************RECORD**************************************/... /********************************************************************************/ Några ytterligare bitar av grammatik delen visas i bilaga2. 17

18 %% /* C- kods del */ /*... == delar av funktion borttagen */ /* Här redovisas main(int argc, char** argv) och generate_databasecall() */ /* I bilaga2 redovisas fler bison funktioner, dock inte alla. */ I mainfunktionen startas parsningen genom answer = yyparse(). Under parsningen så kontrolleras först grammatikdelen. Då botten är nådd så utförs alla aktioner. Eftersom aktions börjar från botten och går uppåt, så blir den länkade listan bakvänd. Därför måste den vändas innan den skrivs ut i writeoutputfile_ads(). I lämpliga aktions så laddas tok = lämplig sträng. tok kan laddas med konstanta strängar, strängar, $- värden och värden struct- array sparade värden. tok är sedan inparameter i emit_ads(tok), där tok hamnar i den länkade listan. fixstring(char s[]), används vid behov för att stuva om i strängen links *endptr_ads /* End of linked list in *.ads */ links *startptr_ads /* Start of linked list in *.ads */ links *endptr_adb /* End of linked list in *.adb*/ links *startptr_adb /* Start of linked list in *.adb*/ FILE *fileads /* Pointer to output file *.ads */ FILE *fileadb /* Pointer to output file *.adb */ /*############################# MAIN ######################################*/ main(int argc, char** argv) extern FILE yyin /* yyin är flex inputfil */ int answer= -1 int index = 1 int len int output links *freeptr_ads links *freeptr_adb startptr_ads = NULL endptr_ads = NULL startptr_adb = NULL endptr_adb = NULL if(startptr_ads = (links *) malloc (sizeof (links)) ) startptr_ads->next = NULL strcpy(startptr_ads->strval,"") else printf("error creating linked list!!") exit(1) if(startptr_adb = (links *) malloc (sizeof (links)) ) startptr_adb->next = NULL strcpy(startptr_adb->strval,"") else printf("error creating linked list!!") exit(1) if(argc >= 1) do /* fler variabler re- definieras */ char outputads[file_name] char outputadb[file_name] startptr_ads = NULL startptr_adb = NULL memset(outputads, 0, FILE_NAME) memset(outputadb, 0, FILE_NAME) with_counter = 0 ready = 0 first = 0 cu2 =

19 stm = 0 signal3 = stmnt = - 1 file = fopen(argv[index],"r") if(!file) fprintf(stderr,"cant open argv %s\n", argv[index]) exit (1) yyin = file len = strlen(argv[index]) len = len - 3 strncpy(outputads, argv[index], len) strncpy(outputadb, argv[index], len) strncat(outputads, "ads", 3) strncat(outputadb, "adb", 3) fileads = fopen(outputads,"w") fileadb = fopen(outputadb,"w") if(!(fileads)!(fileadb) ) printf("could not open outputads: %s\n",strerror(errno)) exit(1) answer = yyparse() /* Start the parser */ if(answer == 0) /* 0 == Parse- Success */ if( (freeptr_ads = (links *) malloc (sizeof (links))) ) freeptr_ads = startptr_ads else fprintf(stderr,"no memory...") if( (freeptr_adb = (links *) malloc (sizeof (links))) ) freeptr_adb = startptr_adb else fprintf(stderr,"no memory...") writeoutputfile_ads() /* Write to file ads */ writeoutputfile_adb() /* Write to file adb */ fclose(fileads) fclose(fileadb) fclose(file) index++ /* increment for next *.sme */ while(freeptr_ads->next!= NULL) /* free memory */ startptr_ads = freeptr_ads freeptr_ads = freeptr_ads->next free(startptr_ads) while(freeptr_adb->next!= NULL) startptr_adb = freeptr_adb freeptr_adb = freeptr_adb->next free(startptr_adb) startptr_ads->next = NULL startptr_ads = NULL free(freeptr_ads) startptr_adb->next = NULL startptr_adb = NULL free(freeptr_adb) /* END answer if */ else fprintf(stderr,"\n error in parse\n") exit(1) 19

20 while(index < argc) /* END while */ /* END if */ return 0 /* Databas anropet som samlats av flex genereras */ /****************************************************************************/ /* GENERATE_DATABASECALL */ /****************************************************************************/ /* A function that generates the proper database call for */ /* dbif_c_i.adb */ /****************************************************************************/ generate_databasecall()... tok_adb = "\n"emit_adb(tok_adb) stm = stm -1 tok_adb = "end" emit_adb(tok_adb) tok_adb = nine emit_adb(tok_adb) tok_adb = "\n"emit_adb(tok_adb) tok_adb = " ), SQL_NTS)"emit_adb(tok_adb) tok_adb = rec_name2[rec2].inputemit_adb(tok_adb) tok_adb = " & Local_Log_" emit_adb(tok_adb) tok_adb = "\"" emit_adb(tok_adb) tok_adb = "=" emit_adb(tok_adb) tok_adb = database_stmnt[stm].input /*databas anrop*/ emit_adb(tok_adb) tok_adb = "\"" emit_adb(tok_adb) tok_adb = "Sts := SqlPrepare(Stmt, To_C (" emit_adb(tok_adb) tok_adb = twelve emit_adb(tok_adb) tok_adb = "\n"emit_adb(tok_adb)... 20

21 Ada till ODBC lösning För att utvärdera om det vara möjligt att från ADA anropa ett ODBC interface som sen anropar en sybase databas letades det fram en freeware produkt. Freeware eller open source produkten bestod av en ODBC driver manager (iodbc) och ett ODBC bibliotek från OpenLink. Efter att ha löst vissa problem vid testningen så fungerade det, vilket resulterade i att företaget (CELSIUS) bestämde att en kommersiell produkt skulle inhandlas. Orsaken till att Celsius ville ha en kommersiell produkt var att det oftast saknas support och uppdateringar till freeware produkter och man ville försäkra sig om att detta skulle finnas. En produkt från företaget MERANT beställdes hem DataDirect Connect ODBC 3.6. Denna produkt visade sig vara något svår att konfigurera, men efter en del testande gick det att få fart på förbindelsen mellan databasen och Ada genom ODBC gränssnittet. Nästa steg var att för hand generera en koppling mellan Ada och ODBC för den nya produkten. Detta gjordes för att få fram en mall att gå efter vid genereringen av koden med hjälp av kompilatorsystemet. Mallen byggdes med hjälp av material hämtat från nätet, och med hjälp av ODBC exemplet ovan. Här följer den handskrivna mallen: Alla för Celsius specifika namn på variabler, filnamn osv. har ersatts. -- ************************************************************** -- Generated Abstract Body for: -- Module: DBIF_XXX -- Source: dbif_xxx.sme -- Date : 2000 Jun 08 14:04:35 -- ************************************************************** -- With är ungefär som include i C with Dbif_Odbc_Support use Dbif_Odbc_Support with Ois_Basic_Types use Ois_Basic_Types with Ada.Text_IO use Ada.Text_IO with Ada.Command_Line use Ada.Command_Line with Interfaces.C use Interfaces.C with Iodbc use Iodbc package body Dbif_XXX is use Sql_Standard -- Procedur för att hämta ett filnamn. -- Inparameter är filnamnet utparameter är status på hur det gick. procedure Get_Filename (Filename_Log : in Dbif_ZZZ.Beteck_Not_Null Row : in out Get_Filename_Type_Row Stats : out Dbif_ZZZ.Query_Stats) is -- Lokala variabler Local_Filename : Sql_Standard.Char( ) Sqlcode : Sql_Standard.Sqlcode_Type Cols : aliased SQLreturn Env : aliased SQLHENV Dbc : aliased SQLHDBC Stmt : aliased SQLHSTMT Num : aliased Sqlsmallint Text : String (1..100) Sts : Retcode Text_Length : aliased SDWORD Sql_Error : exception Command_Syntax_Error : exception -- Error hantering procedure Error (Sts : Retcode Text : String) is Sqlstate : aliased char_array (0..10) 21

22 Errmsg : aliased char_array (0..400) Nativerr : aliased SQLINTEGER Actmsglen : aliased SQLSMALLINT Ret : Retcode Begin -- Om inte lyckat resultat, skriv ut felmeddelande -- och res ett undantag if sts /= Sql_Success and Sts /= SQL_SUCCESS_WITH_INFO then Ret := SQLError(Env, Dbc, Stmt, Sqlstate, Nativerr'Access, Errmsg, Iodbc.SQL_MAX_MESSAGE_LENGTH, Actmsglen'Access) if Ret = Iodbc.Sql_Error then Put_Line("SQLError call failed") raise SQL_ERROR end if Put ("Return code = ") Put_Line(SQLRETURN'Image(Ret)) Put_Line("From = " & Text) -- Detailed SQL error if Ret /= SQL_NO_DATA_FOUND then Put_Line("SQLSTATE = " & String(Interfaces.C.To_Ada(Sqlstate))) Put_Line("NATIVE ERROR = " & SQLINTEGER'Image(Nativerr)) Put("MSG = ") for Ix in 1.. Size_T(ActMsgLen) loop Put(Character(ErrMsg(Ix))) end loop raise Sql_Error end if raise Sql_Error end if end Error -- Start av programmets main del begin -- Kontrollera antal argument till programmet if Argument_Count /= 3 then Put_Line ("syntax: datasourcename username password ") raise Command_Syntax_Error end if -- fyll variabler med blanksteg för att slippa skräptecken Row.Filename := (others => ' ') Local_Filename := (others => ' ') -- Sts är handtaget till en intern ODBC struktur som innehåller all information om -- ODBC s environment Sts := SqlAllocEnv (Env'Unchecked_Access) Error (Sts, "allocenv") -- Alloc Connect Sts := SqlAllocConnect (Env, Dbc'Unchecked_Access) Error (Sts, "allocdbc") -- Connect Sts := SQLConnect (Dbc, Error (Sts, "connect") -- Prepare a statement for execution and -- bind output fields to program variables To_C(Argument (1)), Argument (1)'Length, To_C(Argument (2)), Argument (2)'Length, To_C(Argument (3)), Argument (3)'Length) Sts := SqlAllocStmt (Dbc, Stmt'Unchecked_Access) Error (Sts, "allocstmt") -- prepare sql statement to be executed 22

23 declare Local_Filename_Log constant String := "'" & Stripp_Trailing_Blanks(String(Filename_Log)) & "'" begin Sts := SqlPrepare (Stmt, To_C ("select YYY.filnamn from YYY where YYY.YYY_id = " & Local_Filename_Log), SQL_NTS) end Error (Sts, "prepare") -- Bind columns Sts := SqlBindCol (Stmt, 1, Sql_Char, Local_Filename'Address, Local_Filename'Length,Text_Length'Unchecked_Access) Error (Sts, "bindcol text 1") -- Execute the statement to get a result set Sts := SqlExecute (Stmt) Error (Sts, "execute") -- Check if execute returned any columns. -- Needed after fetch for error handling Cols := SQLNumresultCols(Stmt,Num'access ) -- Fetch result to column Sts := Sqlfetch (Stmt) Error (sts, "FETCH" & Retcode'Image (sts) ) -- Release resources and drop connection Sts := SQLFreeStmt (stmt, SQL_DROP) Error (Sts, "freestmt") Sts := SQLDisconnect (dbc) Error (Sts, "disconnect") Sts := SQLFreeConnect (dbc) Error (Sts, "freeconect") Sts := SQLFreeEnv (env) Error (Sts, "freeenv") Status := Dbif_Odbc_Support.Get_Stats (Sts) if not ((sts < 0) or (sts = 100)) then -- if error in sqlnumresultcols call if Cols /= 0 then raise Samedl_Standard.Null_Value_Error else -- if no columns in result if integer(num) <= 0 then raise Samedl_Standard.Null_Value_Error else Row.Filename := ( Dbif_ZZZ.Filnamn_Not_Null ( Local_Filename (1.. Local_Filename'Last - 1)) ) end if end if end if end Get_Filename end Dbif_XXX Det som var det stora problemet vid själva byggandet av mallen var att Adas hårt typade språk krävde ombyggnationer. Ada kräver att längden, storleken på i stort sett allt är känt vid kompilering. På grund av detta var det tvunget att alla variabler fylldes med blanktecken eftersom man då i anropande applikation kan plocka bort alla blanksteg från höger tills man hittar något tecken som är skilt från blanktecken. Genom att göra så kan man vara säker på att det man får tillbaks bara innehåller resultatet av SQL uttrycket och inget annat. Tack vare den lösningen så kunde man jobba med inparametrar av olika längd så länge man i den lokala funktionen alltid skapade variabler av samma längd och typ som inparametrarna. Detsamma gäller när man ska returnera resultatet av en SQL fråga till den anropande applikationen. 23

24 För att kunna testa om den handskriva mallen fungerade krävdes ett testprogram som skickar in inparametrar och kontrollerar resultatet. Testprogrammet behövs eftersom den Ada kod som innehåller kopplingen till ODBC och databasen samt utför själva SQL frågan och returnerar svaret ligger i ett Ada paket (package). Ada paket kan inte exekveras rakt upp och ner, utan behöver precis som i C ett main program. Utifrån mallen gjordes försök till att generera ADA kod som fungerade mot ODBC gränssnittet. Detta gjordes mot en av de mindre SME filerna för att se om det gick, vi hann dock inte göra det för någon större SME fil då tiden blev knapp. Men I princip skulle det gå att göra för alla SME filer troligtvis, eftersom uppbyggnaden och syntaxen är ungefär den samma I alla SME filer. 24

25 Resultat Examensarbetet visar att det går att genom ett kompilatorförfarande med *.sme fil som input och Dbif_DDD.sme samt S_db.sme som hjälpfiler generera Ada- kod, inklusive Ada- kod som anropar ODBC- gränsytan. Framtida arbete Fortsatt arbete skulle innefatta färdigställande av kompilatorsystemet så att det kan hantera alla *.sme filer mer generellt. Förbättra kontrollen av syntax och semantik i kompilatorsystemet samt lägga till felhantering, vilket till viss del saknas i vår lösning. En analys av prestanda, stabilitet, flexibilitet och kompabilitet mellan de olika systemen borde göras. Analysen skulle ligga som underlag för ett beslut om att byta ut nuvarande system mot vårt nya kompilatorsystem. 25

26 Litteraturförteckning Brown, D, Levine, J, Mason, T, (1992), lex & yacc, O Reilly, USA Cohen N.H., (1996), Ada as a second language, McGraw-Hill, USA Self, J, Ayacc User s Manual Taback D, Deepak Tolani, Aflex- An Ada Lexical Analyzer

27 Bilaga1 Flex och bison introduktion Här kommer en kort flex- och bison introduktion. Flex och bison är gnu- versioner av lex och yacc. Därför tar exemplen nedanför även upp lex och yacc. Version som använts: gnu.bison exe och gnu.flex exe Token = variabler, nyckelord, enskilda tecken osv. Ett mönster (pattern) som definierats i flex specifikationen. %%- tecknen är avskiljare mellan de olika sektionerna i flex och även i bison. Flex Flex är ett verktyg som genererar en scanner ( eller en lexikal analysator). Scannern känner igen lexikala mönster i en inputfil. Flex läser en specifikationsfil, och får då beskrivningen på hur scannern ska genereras. Själva beskrivningen är uppbyggd av regler dvs. par av reguljära uttryck och en tillhörande aktionsdel i C- kod. Flex genererar en C- kods fil lex.yy.c, vilken definierar en rutin yylex() Denna fil kompileras och länkas, för att bli ett exekverbart program. När den exekverbara filen körs så analyserar den inputfilen, för att hitta reguljära uttryck, och när dessa hittats så utförs aktion som hör till. Specifikationsfilen till flex består av tre sektioner: definitioner %% regler %% C kod Definitionsdelen består av inkludering av bibliotek, definitioner och variabel deklarationer som används I C- kod delen. Det som förekommer mellan % och % kopieras ordagrant till yy.lex.c I regel delen så beskrivs vilka tokens som ska godkännas, och vilken aktion som ska utföras då just detta token påträffas, på denna form: token aktion. C- kods delen kopieras rakt av till yy.lex.c. Ett enkelt exempel av en enkel (och förenklad) flex specifikation: % /* nothing this time */ % %% [ \t] + /*definierar white space, dvs. en eller flera tabbar och mellanslag, anger ingen.*/ /* aktion, dvs. gör ingenting*/ did am are were have be printf( %s : är ett verb \n, yytext) /* yytext håller det aktuella token som behandlas*/ [ a-za-z] printf( %s : är inte ett verb \n, yytext) /* Inom klamrarna så anges sekvens av */ /* tecken som får förekomma*/ %% main 1

28 yylex() Om vi kompilerar och testar följande: did I have fun. Så blir resultatet: did : är ett verb I : är inte ett verb have : är ett verb fun : är inte ett verb Bison Bison producerar en parser (y.*.tab.c ) utifrån den grammatik som specificerats. Hur bison kan användas: 1. Skriv en grammatik på en form som bison förstår. För varje grammatisk regel i språket så definiera en aktion som ska utföras då just denna regel påträffas. 2. Skriv en lexikal analysator som kan processa inputfilen och som passar ( returnerar) påträffade tokens till bison- parsern. 3. Skriv en main funktion som anropar den Bison- producerade parsern. 4. Hantera fel som kan uppstå. Specifikationsfilen till bison består av tre sektioner: % C- deklarationer % Bison deklarationer %% grammatik %% C- kod I C- deklarationens delen kan makros definieras, diverse nödvändiga #include xxx, typer och variabler deklareras. Bison deklarationsdelen deklarerar tex. terminal och icke- terminal- symboler, beskriver ev. operatorprioritet, och det semantiska värdet av olika symboler. Bison och flex tillhandahåller diverse symboler som kan användas eller omdefinieras. Exempel på detta: yylval : en variabel där yylex() kan placera det semantiska värdet som är associerat med ett token. Kan endast hålla ett heltalsvärde men detta går att omdefiniera med hjälp av union som beskrivs längre ner. yyerror() :felhanterare som yyparse() kallar på vid upptäckta fel yylex() :funktion som returnerar ett nytt token till parsern yyparse() :startar parsern yyin : hantag till inputfil. Parsern kallar på yyin t.o.m. END OF FILE yywrap() : då yylex() når END OF FILE så anropas denna funktion. Om yywrap() returnerar 0 så är det inte slut på input, om returvärdet är 1 så avslutas parsningen %type :anger icketerminaler %token :anger de tokens ( terminaler) som används %union : här kan yylval omdefinieras %% :separerar de olika sektionerna i både flex och bison /* */ :kommentarer : :separerar label (icketerminal) från regeln :avslutar en regel :separerar alternativa regler från samma icketerminal 2

29 Exempel på lex och yacc filer som samverkar lex, med kommentarer /* definitionsdel: */ % #include <stdio.h> #include "y.tab.h" /* Inkludering av parserns.h- fil */ int c /* Variabel deklaration* / extern int yylval /* yylval finns deklarerad yacc*/ void evaluate () /*Funktion som används av lex */ int temp=0 /* som omvandlar yytext, en sträng- array* / int i /* till ett heltal som är kompatibelt*/ for (i=0 i < yylengi++) c=yytext[i] temp= temp*10+c-'0' yylval= temp /* med yylval, som hanterar just heltal*/ % delim [ \t] /*Tecken inom klamrarna anger vilka tecken räknas */ /* till delim (mellanslag och tabb) */ WS delim+ /*WS består av delim, en eller fler*/ DIGIT [0-9] /*Digit består av sekvensen från 0 till 9*/ /* regel del:*/ %% WS /* Vid WS, dvs. upprepade delims, == gör inget*/ DIGIT+ evaluate() /*Vid digits evaluera o returnera */ return (VALUE) /* sedan VALUE till parsern */ [^0-9ws] c = yytext[0] /*Tecken som ej är digit*/ return(c) /returneras som de ä*/ /* ex. + eller - */ /*C- kods del*/ %% yywrap() return(1) yacc, med kommentarer yacc arbetar sig först ner (börjar i exemplet nedan, vid mini (som är start label)i grammatikdelen, och kontrollerar att grammatiken stämmer. När bison nått botten i grammatikdelen så utförs aktions samtidigt som parsern arbetar sig uppåt och avslutar i aktion som hör till label mini. Denna traverserings ordning kallas bottomup. /*deklarations del*/ % #include <stdio.h> % %token VALUE /*är ett heltals värde*/ %start mini /*grammatik del med ev. aktions*/ %% mini : mini line'\n' mini'\n' 3

30 line : expr printf("%d\n",$1) expr : expr '+' term $$=$1+$3 term term : term '*' factor $$=$1*$3 factor factor : '('expr')' $$ = $2 VALUE /*C- kods del*/ %% main() printf ("Programmet har startat\n\n") return (yyparse()) /*startar parsning*/ yyerror(s) /*felhanterare*/ char *s printf ("%s\n",s) Klarläggande av uttryck som används I yacc: expr : expr '+' term $$=$1+$3 expr (= $$) : expr (= $1) + (= $2) term (= $3) $1 och $2 plockas ner från parser- stacken för att processas och sedan passas uppåt genom att läggas tillbaka på stacken i $$. I detta fall så adderas värdet av $1 och $3, detta resultat läggs i $$. Värdet av $$ passas uppåt, hamnar i $1 vid regeln ovanför och kan som i detta exempel skrivas ut: printf("%d\n",$1). 4

31 Bilaga2 En *.sme fils uppbyggnad OBS! Exemplet är en förenkling av en *.sme fil skriven i SAMeDL notation. Alla för Celsius specifika namn på variabler, filnamn osv. har ersatts xxx, iii,... är variabler uppbyggda på formen: börjar med minst en gemen följs av siffror, gemen, versal samt tecknet _. XXX.xxx är variabler uppbyggda på formen börjar med en sträng av versaler tom., som sedan följs av siffror, gemener, versal samt tecknet _.. avvänds som separator /* Filen börjar med en kort informations del som är bortkommenterad med -- */ UNIT NAME dbif_xxx KEYWORDS CONTENTS Revision History: Dependencies: ============================================================== /* Filen med variablernas egenskaper*/ with Dbif_DDD /* Filen med tabellernas egenskaper*/ abstract module dbif_xxx is authorization S_db /* En record hänger ihop med en procedure. Dessa två funktioner */ /* samverkar för att ta ut en viss post ur en tabell. */ record xxx is yyy: dbif_ddd.xxx NOT NULL /* Här visas vilken typ av post*/ end xxx /* som ska hämtas dbif_ddd.xxx NOT NULL */ /* läggs i variabeln yyy. */ procedure xxx(xxx: in Dbif_DDD.xxx NOT NULL) /*input är en sök variabel: */ /* kan Tex. ange vilken specifik anläggnings- telefonnummer som efterfrågas */ is select yyy NOT NULL /* yyy är vilket id, tas från record*/ into : xxx /* Var resultatet ska läggas */ from XXX /* I vilken tabell variabeln finns */ where XXX.xxx = xxx /* Sök- villkor som ska uppfyllas */ status Dbif_DDD.xxx /* I en *.sme fil kan godtyckligt många par av record och procedure förekomma */ /* En Cursor hämtar flera poster från en tabell, inparametern anger sök- villkoret */ Cursor xxx(yyy: in Dbif_DDD.xxx NOT NULL) for select xxx NOT NULL, /* Anger poster som ska hämtas*/ iii, jjj from XXX /* Anger från vilken tabell */ where XXX.xxx = yyy /* Sökvillkor */ order by xxx /* Hur resultatet ska organiseras */ is /* Procedurer som öppnar och stänger Cursor */ 1

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck input läs tecken stoppa tillbaka ett tecken skicka ett token och dess attribut parser Eliminera white space och kommentarer Gruppera lästa tecken till tokens identifierare, nyckelord, numeriska konstanter,

Läs mer

Föreläsning 6: Introduktion av listor

Föreläsning 6: Introduktion av listor Föreläsning 6: Introduktion av listor Med hjälp av pekare kan man bygga upp datastrukturer på olika sätt. Bland annat kan man bygga upp listor bestående av någon typ av data. Begreppet lista bör förklaras.

Läs mer

Att använda pekare i. C-kod

Att använda pekare i. C-kod Att använda pekare i C-kod (Bör användas av de som känner sig lite hemma med C-programmering!) Rev 1, 2005-11-23 av Ted Wolfram www.wolfram.se Syfte: Man kan tycka att det är komplicerat att använda pekare

Läs mer

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

Introduktion till integrering av Schenkers e-tjänster. Version 2.0 Introduktion till integrering av Schenkers e- Version 2.0 Datum: 2008-06-18 Sida 2 av 8 Revisionshistorik Lägg senaste ändringen först! Datum Version Revision 2008-06-18 2.0 Stora delar av introduktionen

Läs mer

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program Dagens föreläsning Programmeringsteknik för Ingenjörer VT05 Föreläsning 3-4 Repetition Datatyper Uttryck Operatorer Satser Algoritmer Programmeringsteknik VT05 2 Repetition Repetition - Programmering i

Läs mer

Programmeringsteknik med C och Matlab

Programmeringsteknik med C och Matlab Programmeringsteknik med C och Matlab Kapitel 2: C-programmeringens grunder Henrik Björklund Umeå universitet Björklund (UmU) Programmeringsteknik 1 / 32 Mer organisatoriskt Imorgon: Datorintro i lab Logga

Läs mer

Sockets: server. with Ada.Command_Line; use Ada.Command_Line; with Ada.Exceptions; use Ada.Exceptions; with Ada.Text_IO; use Ada.

Sockets: server. with Ada.Command_Line; use Ada.Command_Line; with Ada.Exceptions; use Ada.Exceptions; with Ada.Text_IO; use Ada. Sockets: server with Ada.Command_Line; use Ada.Command_Line; with Ada.Exceptions; use Ada.Exceptions; with Ada.Text_IO; use Ada.Text_IO; with TJa.Sockets; use TJa.Sockets; procedure Server is -- Servern

Läs mer

Hjälpmedel för kompilatorkonstruktion, DVB004

Hjälpmedel för kompilatorkonstruktion, DVB004 Hjälpmedel för kompilatorkonstruktion, DVB004 Version 4.2 021104 Göran Fries 031104 GF Kompilatorn kan lämpligen konstrueras i tre ganska fristående pass (p1,p2,p3). Första passet gör en lexikalisk analys,

Läs mer

Tentamen Grundläggande programmering

Tentamen Grundläggande programmering Akademin för Innovation Design och Teknik Tentamen Grundläggande programmering Kurskod: DVA103 Datum 2012-06-11 Tid 14.10 16.30 Examinator: Lars Asplund Maxpoäng: 48 Betygsgränser: Betyg 3: 20 Betyg 4:

Läs mer

Programmeringsteknik med C och Matlab

Programmeringsteknik med C och Matlab Programmeringsteknik med C och Matlab Kapitel 6: Filhantering Henrik Björklund Umeå universitet 13 oktober 2009 Björklund (UmU) Programmeringsteknik 13 oktober 2009 1 / 22 Textfiler Filer är sekvenser

Läs mer

Övning från förra gången: readword

Övning från förra gången: readword (9 september 2010 T4.1 ) Övning från förra gången: readword /** readword.c * * int readword(char w[], int n) { * * Läser tecken tills en bokstav påträffas. * Läser och lagrar sedan högst n-1 bokstäver

Läs mer

Översikt. Installation av EasyPHP 1. Ladda ner från http://www.easyphp.org/ Jag använder Release 5.3.4.0 2. Installera EasyPHP.

Översikt. Installation av EasyPHP 1. Ladda ner från http://www.easyphp.org/ Jag använder Release 5.3.4.0 2. Installera EasyPHP. Laboration 1 Översikt 1. Att komma igång med laborationsmiljön a. installera Aptana Studio 3 b. Installera EasyPHP 2. Testa lite programmering a. Testa enkla uppgifter b. Testa automatiskt 3. Skapa inloggningsformulär

Läs mer

INTRODUKTION TILL JDBC

INTRODUKTION TILL JDBC INTRODUKTION TILL JDBC Vad är JDBC? JDBC står för Java DataBase Connectivity. JDBC ingår i Java och består av en del klasser som har hand om databasfunktionalitet. Med Java följer JDBC-ODBC Bridge driver,

Läs mer

Introduktion till arv

Introduktion till arv Introduktion till arv 6 INTRODUKTION TILL ARV Arv Generell-Speciell Arv för att utnyttja det vi redan gjort Återanvändning Basklass Härledd klass Varför arv? Inför en subklass för att uttrycka specialisering

Läs mer

Föreläsning 4: Poster

Föreläsning 4: Poster Föreläsning 4: Poster Följande är genomgånget: type Person_Type is Namn : String(30); Skonr : Float; Kon : Boolean; Diskussion runt detta med olika typer m.m. Har tagit upp vilka operationer man kan göra

Läs mer

Tentamen OOP 2015-03-14

Tentamen OOP 2015-03-14 Tentamen OOP 2015-03-14 Anvisningar Fråga 1 och 2 besvaras på det särskilt utdelade formuläret. Du får gärna skriva på bägge sidorna av svarsbladen, men påbörja varje uppgift på ett nytt blad. Vid inlämning

Läs mer

1 Funktioner och procedurell abstraktion

1 Funktioner och procedurell abstraktion 1 Funktioner och procedurell abstraktion Det som gör programkonstruktion hanterlig och övergripbar och överhuvudtaget genomförbar är möjligheten att dela upp program i olika avsnitt, i underprogram. Vår

Läs mer

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012 1 of 6 Örebro universitet Akademin för naturvetenskap och teknik Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se) Tentamen i Programmering grundkurs och Programmering C för D1 m fl, även distanskursen

Läs mer

Programmering A. Johan Eliasson johane@cs.umu.se

Programmering A. Johan Eliasson johane@cs.umu.se Programmering A Johan Eliasson johane@cs.umu.se 1 Jag Undervisar mest grundläggande programmering på Institutionen för datavetensakap Applikationsutveckling för iphone Applikationsutveckling i Java Datastrukturer

Läs mer

Objektorienterad programmering D2

Objektorienterad programmering D2 Objektorienterad programmering D2 Laboration nr 2. Syfte Att få förståelse för de grundläggande objektorienterade begreppen. Redovisning Källkoden för uppgifterna skall skickas in via Fire. För senaste

Läs mer

Föreläsning 2: Avlusning och antilustekniker

Föreläsning 2: Avlusning och antilustekniker 2D1458, Problemlösning och programmering under press Föreläsning 2: Avlusning och antilustekniker Datum: 2007-09-11 Skribent(er): Emil Hesslow, Stefan Pettersson Föreläsare: Per Austrin Föreläsningen handlade

Läs mer

WCMS-15, Webbutvecklare CMS

WCMS-15, Webbutvecklare CMS WCMS-15, Webbutvecklare CMS Övningstentamen, delkurs Dynamiska webbplatser (20 YH-poäng) Plats: Medieinstitutet, Malmö Tid: 25 november 2015, kl. 13.00-16.00 Tillåtna hjälpmedel: Papper, penna, suddgummi,

Läs mer

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program Dagens föreläsning Programmeringsteknik för Ingenjörer VT05 Föreläsning 3-4 Repetition Datatyper Uttryck Operatorer Satser Algoritmer Programmeringsteknik för ingenjörer, VT06 2 Repetition Repetition -

Läs mer

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 - Inbyggda system - Analog till digital signal - Utvecklingssystem, målsystem - Labutrustningen - Uppbyggnad av mikrokontroller - Masinkod, assemblerkod

Läs mer

Övningar Dag 2 En första klass

Övningar Dag 2 En första klass Kurs i C++ Sid 1 (5) Övningar Dag 2 En första klass Denna övning går ut på att steg för steg bygga upp en klass och skapa objekt. Vi kommer att utgå från en sammansatt datatyp i en struct och parallellt

Läs mer

Hur man kompilerar och kör IT++-program med MinGW. 1 Sammanfattning. 2 Om dokumentet. 3 Om min konfiguration

Hur man kompilerar och kör IT++-program med MinGW. 1 Sammanfattning. 2 Om dokumentet. 3 Om min konfiguration 1 (12) Hur man kompilerar och kör IT++-program med MinGW 1 Sammanfattning Detta dokument visar hur man lätt (med några få extra raders kod) kan få IT++ att bli kompatibelt med kompilatorn MinGW. Med den

Läs mer

TDDI02. Programmeringsprojekt. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDDI02. Programmeringsprojekt. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU TDDI02 Programmeringsprojekt. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU På denna föreläsning: Verifikation, Validering och Testning XP Extreme Programming Vad är ett fel? I engelskan

Läs mer

5 Grundläggande in- och utmatning

5 Grundläggande in- och utmatning 5 Grundläggande in- och utmatning För att användaren skall kunna kommunicera med programmet krävs att man inkluderar ett eller flera bibliotek med rutiner. I Ada finns det ett antal paket som gör detta

Läs mer

Programmeringsuppgifter 1

Programmeringsuppgifter 1 Programmeringsuppgifter 1 Redovisning: Ni demo-kör och förklarar för handledaren några av de program ni gjort. Ni behöver inte hinna allt, redovisa så långt ni kommit. Om ni hinner mer kan ni alltid redovisa

Läs mer

1. PLSQL 2 2. Select into

1. PLSQL 2 2. Select into FÖ 11: Databaskursen 1 1. PLSQL 2 2. Select into 3. Anchored declaration 4. Cursorvariabler 5. Olika typer av cursors 6. Cursorattribut 7. Cursorloop 8. Datatypen record: %rowtype 9. Cursor for loop 10.

Läs mer

Chapter 3: Using Classes and Objects

Chapter 3: Using Classes and Objects Chapter 3: Using Classes and Objects I dessa uppgifter kommer du att lära dig om hur man använder klasser och metoder från java biblioteket. Du kommer inte att förstå allt som händer bakom metod anrop

Läs mer

Sätt att skriva ut binärträd

Sätt att skriva ut binärträd Tilpro Övning 3 På programmet idag: Genomgång av Hemtalet samt rättning Begreppet Stabil sortering Hur man kodar olika sorteringsvilkor Inkapsling av data Länkade listor Användning av stackar och köer

Läs mer

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll, 040110.

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll, 040110. 1(8) ÖREBRO UNIVERSITET INSTITUTIONEN FÖR TEKNIK Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Denna tenta kommer att vara färdigrättad On 14/1-04 och kan då hämtas på mitt

Läs mer

Databasutveckling Introduktion till SQL och TSQL

Databasutveckling Introduktion till SQL och TSQL Databasutveckling Introduktion till SQL och TSQL Copyright Mahmud Al Hakim mahmud@webacademy.se www.webacademy.se Agenda Introduktion till SQL SELECT satsen, enkla frågor Hämta specifika kolumner Alias

Läs mer

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Lösningsförslag, tentamen FYTA11 Javaprogrammering Lunds universitet FYTA11 Institutionen för Astronomi och Teoretisk fysik HT 12 Lösningsförslag, tentamen FYTA11 Javaprogrammering Onsdag 9 januari 2013, 10:15 14:15 Instruktioner Hjälpmedel: Papper och

Läs mer

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p Skriven av Michael Andersson Introduktion Programmering I högnivåspråk fokuserar på själv problemet (algoritmen) istället

Läs mer

Du skall naturligtvis visa körexempel med output där det behövs i din rapport!

Du skall naturligtvis visa körexempel med output där det behövs i din rapport! och databprogrammering Christilinda Göstson - PL/SQL, paket och ref cursor Du skall naturligtvis visa körexempel med output där det behövs i din rapport! OBS! Denna labb redovis i labbrapport via mail

Läs mer

Objektorienterad programmering i Java

Objektorienterad programmering i Java Objektorienterad programmering i Java Föreläsning 4 Täcker i stort sett kapitel 6 i kursboken Java Software Solutions 1 Läsanvisningar Den här föreläsningen är uppbyggd som en fortsättning av exemplet

Läs mer

Extra övningar på SDD:er/SDT:er

Extra övningar på SDD:er/SDT:er Extra övningar på SDD:er/SDT:er Bakvända meningar Grammatik: sentence word sentence sentence ε sentence space sentence word char word char 1 char 2 word char 1 word 1 char 2 Symbolen sentence producerar

Läs mer

SMD 134 Objektorienterad programmering

SMD 134 Objektorienterad programmering SMD 134 Objektorienterad programmering Dagens agenda: Typer i Java: primitiva datatyperna, referenstyper Variabler och variabeltilldelningar med primitiva typer Konstanter av de olika typerna. Heltalsräkning

Läs mer

Beijer Electronics AB 2000, MA00336A, 2000-12

Beijer Electronics AB 2000, MA00336A, 2000-12 Demonstration driver English Svenska Beijer Electronics AB 2000, MA00336A, 2000-12 Beijer Electronics AB reserves the right to change information in this manual without prior notice. All examples in this

Läs mer

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167 GU / Chalmers Campus Lindholmen Tentamen Programutveckling 2016-01-13 LEU 482 / TIG167 Examinator: Henrik Sandklef (0700-909363) Tid för tentamen: 2016-01-13, 08.30 12.30 Ansvarig lärare: Henrik Sandklef,

Läs mer

PROGRAMMERING A VC# 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL C#

PROGRAMMERING A VC# 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL C# PROGRAMMERING A VC# 2008 EXPRESS UTVECKLINGSVERKTYGET VISUAL C# Vi gör ett enkelt glosförhör Allt det du gör idag ska ligga i samma projekt (och mapp). Du kan om du tycker det behövs använda flera forms

Läs mer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs TDIU01 - Programmering i C++, grundkurs Sammanfattning period 1 Eric Elfving Institutionen för datavetenskap 1 oktober 2013 Översikt Ett C++-programs uppbyggnad Variabler Datatyper Satser Uttryck Funktioner

Läs mer

Denna laboration skapades för elever vid Roslagens Högskola men kan användas av vem som helst. Namnen på servrarna måste i så fall ändras.

Denna laboration skapades för elever vid Roslagens Högskola men kan användas av vem som helst. Namnen på servrarna måste i så fall ändras. Laboration 1, Databashantering med MySQL Av: Marcus Rejås I denna laboration skall du se till att du kommer åt databasmotorn och att det fungerar. Du kommer också att skapa en tabell

Läs mer

Skizz till en enkel databas

Skizz till en enkel databas Skizz till en enkel databas Data: Register En vektor Funktioner: Databas Initiera huvudloop Avsluta Poster (struct( struct) val Mata in Skriv ut Spara Hämta Ändra Radera Enligt diskussion 1999-11-23 Bertil

Läs mer

Klientprogrammering mot databaser

Klientprogrammering mot databaser Klientprogrammering mot Databaser Java DataBase Connectivity, JDBC Klientprogrammering mot databaser Native API olika för olika DBMS, ofta i C/C++ ODBC, Open Datbase Connectivity samma API för olika databashanterare.

Läs mer

Exempel på ett litet Ada-program

Exempel på ett litet Ada-program Exempel på ett litet Ada-program -- En kommentar som beskriver något. with Ada.Text_IO; procedure Mini is -- Deklarationer. K : constant Integer := 5; X, Y : Integer; -- Körbar kod. Ada.Text_IO.Put( Utskrift

Läs mer

Föreläsning 5: Introduktion av pekare

Föreläsning 5: Introduktion av pekare Föreläsning 5: Introduktion av pekare Det bör påpekas att det som tas upp i introduktionen inte är reella exempel på kod. Man anväder inte pekare till att peka på enstaka heltal som i exemplen nedan, men

Läs mer

Enkla datatyper minne

Enkla datatyper minne Enkla datatyper minne 143.56 sant Sonja A falskt 18 1999-10-29 Bertil Gralvik, KTH Ingenjörsskolan 1 Addera två tal Algoritmen Summera tal Mata in två tal Beräkna Skriv ut resultat Mata in tal 1 Mata in

Läs mer

Pekare och arrayer. Indexering och avreferering

Pekare och arrayer. Indexering och avreferering Pekare och arrayer En array är ett sammanhängande minnesområde rymmande ett antal element av en viss typ. Arraynamnet kan ses som adressen till arrayens början, dvs. dess första element. En pekare är en

Läs mer

Programmering A C# VT 2010. Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson 2010 02 08

Programmering A C# VT 2010. Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson 2010 02 08 Programmering A C# VT 2010 Ett kompendie över Programmering A (50p) i c# Stefan Fredriksson 2010 02 08 Innehåll Hjälp och referenser... 3 Kap 1 Introduktion... 3 Steg för steg... 3 Kapitel 2 Variabler...

Läs mer

Tentaupplägg denna gång

Tentaupplägg denna gång Några tips på vägen kanske kan vara bra. Tentaupplägg denna gång TIPS 1: Läs igenom ALLA uppgifterna och välj den du känner att det är den lättaste först. Det kan gärna ta 10-20 minuter. Försök skriva

Läs mer

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet 2009-08-09

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet 2009-08-09 Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet 2009-08-09 1. Introduktion till webbprogrammering Webbprogrammering består av ett antal

Läs mer

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering Föreläsning 1 Objektorienterad programmering DD1332 Introduktion till Java Kompilering, exekvering, variabler, styrstrukturer Kompilering och exekvering Ett program måste översättas till datorns språk

Läs mer

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? Programmera i C Varför programmera i C när det finns språk som Simula och Pascal?? C är ett språk på relativt låg nivå vilket gör det möjligt att konstruera effektiva kompilatorer, samt att komma nära

Läs mer

Innehållsförteckning. Exempel. Åtkomst & användarhandledning

Innehållsförteckning. Exempel. Åtkomst & användarhandledning Framsidan Framsidan på din labrapport kan du utforma ganska fritt. Tänk bara på att den ska vara läsbar, och innehålla (minst) följande information: Ditt namn Din e-mail adress här på CS! Kursens namn

Läs mer

Smartair System. TS1000 Version 4.23

Smartair System. TS1000 Version 4.23 Smartair System TS1000 Version 4.23 Denna manual är ett komplement till: 2069-1001 Smartair System Installations och driftsättningsmanual version 4.20A Denna manual beskriver nyheter i Smartair TS1000

Läs mer

Arbeta med databas. Översikt. Lektion 1: Arbeta med Entity Data Models. Arbeta med Entity Data Models. LINQ (Language Integrated Query).

Arbeta med databas. Översikt. Lektion 1: Arbeta med Entity Data Models. Arbeta med Entity Data Models. LINQ (Language Integrated Query). Arbeta med databas Översikt Arbeta med Entity Data Models. LINQ (Language Integrated Query). Lektion 1: Arbeta med Entity Data Models Introduktion till ADO.NET Entity Framework. Stöd i ADO.NET Entity Framework.

Läs mer

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata Innehåll MySQL Intro Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata 1 Lagrad procedur / Stored Procedure Lagrad procedur har många namn, förkortningen

Läs mer

Exempelsamling Assemblerprogrammering

Exempelsamling Assemblerprogrammering Exempelsamling Assemblerprogrammering I uppgifterna nedan utgå från följande programskelett: #include.data var1:.word 12 var2:.word 19 sum: prod:.float 0.set noreorder.text.globl start.ent start

Läs mer

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling metoder Föreläsning 2 Objektorienterad programmering DD1332 Array [modifierare] String metodnamn (String parameter) Returtyp (utdata typ) i detta fall String Indata typ i detta fall String 1 De får man

Läs mer

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek De åtta primitiva typerna Java, datatyper, kontrollstrukturer Skansholm: Kapitel 2) Uppsala Universitet 11 mars 2005 Typ Innehåll Defaultvärde Storlek boolean true, false false 1 bit char Tecken \u000

Läs mer

Kapitel 15: Data/Matrix Editor

Kapitel 15: Data/Matrix Editor Kapitel 15: Data/Matrix Editor 15 Översikt över Data/Matrix Editor... 226 Översikt över list-, data- och matrisvariabler... 227 Starta en Data/Matrix Editor-session... 229 Mata in och visa cellvärden...

Läs mer

Vyer, Prepared Statements, Triggers

Vyer, Prepared Statements, Triggers Vyer, Prepared Statements, Triggers Vyer En vy är en virtuell tabell, som ej behöver existera fysiskt, en namngiven fråga En vy är inte snabbare än SELECT satsen som definierar vyn Det är möjligt att ställa

Läs mer

Föreläsning 3.1: Datastrukturer, en översikt

Föreläsning 3.1: Datastrukturer, en översikt Föreläsning.: Datastrukturer, en översikt Hittills har vi i kursen lagt mycket fokus på algoritmiskt tänkande. Vi har inte egentligen ägna så mycket uppmärksamhet åt det andra som datorprogram också består,

Läs mer

Introduk+on +ll programmering i JavaScript

Introduk+on +ll programmering i JavaScript Föreläsning i webbdesign Introduk+on +ll programmering i JavaScript Rune Körnefors Medieteknik 1 2012 Rune Körnefors rune.kornefors@lnu.se Språk Naturliga språk Mänsklig kommunika+on T.ex. Svenska, engelska,

Läs mer

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken. Tentamen Programmeringsteknik I 2014-10-17 Skrivtid: 0800-1300 Hjälpmedel: Java-bok Tänk på följande Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till

Läs mer

Klassdeklaration. Metoddeklaration. Parameteröverföring

Klassdeklaration. Metoddeklaration. Parameteröverföring Syntax: Class Declaration Modifier Class Body Basic Class Member Klassdeklaration class Class Member Field Declaration Constructor Declaration Method Declaration Identifier Class Associations Motsvarar

Läs mer

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19

TDDC74 Programmering: Abstraktion och modellering Dugga 2, , kl 17-19 TDDC74 Programmering: Abstraktion och modellering Dugga 2, 2017-04-06, kl 17-19 Läs alla frågorna först och bestäm dig för i vilken ordning du vill lösa uppgifterna. Uppgifterna är inte nödvändigtvis i

Läs mer

printenv sort pager printenv grep args sort pager

printenv sort pager printenv grep args sort pager 1 Problembeskrivning Uppgiften var att skriva ett program, digenv för att visa miljövariabler. programmet vara ekvivalent med att köra: Kört utan argument så skulle printenv sort pager och kört med argument

Läs mer

Design och underhåll av databaser

Design och underhåll av databaser Design och underhåll av databaser 1. Modell av verkligheten 2. Normalformer 3. Introduktion till DDL 4. Skapa databaser 5. Skapa tabeller 6. Skapa index 7. Restriktioner 8. Ta bort databaser, tabeller

Läs mer

Att skriva till och läsa från terminalfönstret

Att skriva till och läsa från terminalfönstret Att skriva till och läsa från terminalfönstret Oftast används grafiska komponenter i Java för att kommunicera med användaren (användargränssnitt), men det finns objekt i standardbiblioteken för de tillfällen

Läs mer

Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa

Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa Lena Kallin Westin 2005-08-22 Institutionen för datavetenskap Umeå universitet TENTAMEN Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa Inlämnad Poäng Kurs : Programmeringsteknisk

Läs mer

Föreläsning 7: Syntaxanalys

Föreläsning 7: Syntaxanalys DD2458, Problemlösning och programmering under press Föreläsning 7: Syntaxanalys Datum: 2009-10-27 Skribent(er): Carl-Fredrik Sundlöf, Henrik Sandström, Jonas Lindmark Föreläsare: Fredrik Niemelä 1 Syntaxanalys

Läs mer

Uppgift 1 ( Betyg 3 uppgift )

Uppgift 1 ( Betyg 3 uppgift ) Uppgift 1 ( Betyg 3 uppgift ) I filerna queue_handling.ads och queue_handling.adb finns en datastruktur som motsvarar en kö. Det finns fyra operationer som kan utföras på en kö. 1) Enqueue som stoppar

Läs mer

Växtviskaren EITF11 Digitala projekt VT15, I12

Växtviskaren EITF11 Digitala projekt VT15, I12 Växtviskaren EITF11DigitalaprojektVT15,I12 NathalieLiljebrunn,EbbaRiismark,AnnaNorelius LundsTekniskaHögskola Institutionenförelektro ochinformationsteknik Handledare:BertilLindvall,AndreasJohansson 2015

Läs mer

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1. Schenker har interna system som handhar information som är av intresse för våra kunder/partners. Idag finns ett flertal av dem tillgängliga via Internet, sk Online-tjänster. Dessa erbjuder inte bara hämtning

Läs mer

ANVÄNDARMANUAL. handdatorer i ängs- och betesmarksinventeringen. för

ANVÄNDARMANUAL. handdatorer i ängs- och betesmarksinventeringen. för ANVÄNDARMANUAL handdatorer i ängs- och betesmarksinventeringen för Ändringshantering Ansvarig för dokumentet: Maria Hall Diemer Datum Ändring Ansvarig 2010-05-11 Dokumentet skapades (version 1.0.0) Edward

Läs mer

Grundläggande programmering med C# 7,5 högskolepoäng

Grundläggande programmering med C# 7,5 högskolepoäng Grundläggande programmering med C# 7,5 högskolepoäng Provmoment: TEN1 Ladokkod: NGC011 Tentamen ges för: Omtentamen DE13, IMIT13 och SYST13 samt öppen för alla (Ifylles av student) (Ifylles av student)

Läs mer

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Programmering I Tobias Wrigstad fredag, 2009 augusti 28 Programmering I Tobias Wrigstad tobias@dsv.su.se Vad är programmering? Lågnivåspråk och högnivåspråk Kompilering och interpretering Variabler Notation för flödesschema (flow chart) Kontrollstrukturer (conditionals,

Läs mer

Lär känna MS SQL 2008 / Övning. Observera. Tips. Förberedelse

Lär känna MS SQL 2008 / Övning. Observera. Tips. Förberedelse Lär känna MS SQL 2008 / Övning Observera Övningar som finns tillgängliga är till för att du ska kunna testa dina kunskaper och träna på dem. Det är helt upp till dig när du vill genomföra och om du vill

Läs mer

Föreläsning 1 & 2 INTRODUKTION

Föreläsning 1 & 2 INTRODUKTION Föreläsning 1 & 2 INTRODUKTION Denna föreläsning Vad händer under kursen? praktisk information Kursens mål vad är programmering? Skriva små program i programspråket Java Skriva program som använder färdiga

Läs mer

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition. Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Vem är vem på kursen Objektorienterad programvaruutveckling GU (DIT011) Kursansvarig : Katarina Blom, tel 772 10 60 Rum: 6126 (E-huset)

Läs mer

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack 725G61 - Laboration 7 Implementation av ett API Johan Falkenjack December 13, 2013 1 Inledning Hittills i kursen har vi tittat på grundläggande programmering och grundläggande objektorientering. I den

Läs mer

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010 Programsystemkonstruktion med C++: Övning 1 Karl Palmskog palmskog@kth.se september 2010 Programuppbyggnad Klassens uppbyggnad en C++-klass består av en deklaration och en definition deklaration vanligtvis

Läs mer

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken. Tentamen Programmeringsteknik I 2015-01-10 Skrivtid: 8.00 13.00 Hjälpmedel: Java-bok Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till

Läs mer

Tentamen TEN1 HI1029 2014-05-22

Tentamen TEN1 HI1029 2014-05-22 Tentamen TEN1 HI1029 2014-05-22 Skrivtid: 8.15-13.00 Hjälpmedel: Referensblad (utdelas), papper (tomma), penna Logga in med tentamenskontot ni får av skrivvakten. Det kommer att ta tid att logga in ha

Läs mer

Inlämningsuppgift MiniPlotter

Inlämningsuppgift MiniPlotter LUNDS TEKNISKA HÖGSKOLA Institutionen för datavetenskap EDAA01 Programmeringsteknik fördjupningskurs Inlämningsuppgift MiniPlotter I den här uppgiften ska ett program som ritar grafer av matematiska funktioner

Läs mer

Objektsamlingar i Java

Objektsamlingar i Java 1 (6) Objektsamlingar i Java Objektorienterad programmering 3 Syfte Att ge träning i att använda objektsamlingar i Java. Mål Efter övningen skall du kunna använda objektsamlingsklasserna ArrayList och

Läs mer

Snabbguide Visma Compact API Version 5.1 Copyright 2006-2008 Visma Spcs AB Visma Compact API

Snabbguide Visma Compact API Version 5.1 Copyright 2006-2008 Visma Spcs AB Visma Compact API Snabbguide Visma Compact API Version 5.1 Copyright 2006-2008 Visma Spcs AB Visma Compact API Introduktion Visma Compact API är ett programmeringsgränssnitt framtaget för att underlätta integration av Visma

Läs mer

Typkonvertering. Java versus C

Typkonvertering. Java versus C Typer Objektorienterad programmering E Typkonvertering Typkonvertering Satser: while, for, if Objekt Föreläsning 2 Implicit konvertering Antag att vi i ett program deklarerat int n=3; double x = 5.2; Då

Läs mer

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning 1 Dagens föreläsning Programmering i Lisp - Block, räckvidd - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning - Felhantering (kap 17) icke-normala återhopp catch

Läs mer

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning Varför? 732G11 Linköpings universitet 2011-02-08 Varför? 1 2 3 Varför? 4 5 Medelvärde av 5000 tal Varför? while-loopen int nrofints = 5000; int [] integers = new int [ nrofints ]; int pos = 0; while (

Läs mer

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner 732G11 Linköpings universitet 2011-01-21 1 2 3 4 5 6 Skapa program Kompilera: Källkod Kompilator bytekod Köra: Bytekod Virtuell maskin Ett riktigt program Hej.java class Hej { public static void main (

Läs mer

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: 13-06-05 Tid: kl 16.00-20.

TENTAMEN. Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg. VT-13 Datum: 13-06-05 Tid: kl 16.00-20. Umeå Universitet Datavetenskap Anders Broberg 130605 TENTAMEN Kurs: Objektorienterad programmeringsmetodik 5DV133 Ansvarig lärare: Anders Broberg VT-13 Datum: 13-06-05 Tid: kl 16.00-20.00 Namn: Personnummer:

Läs mer

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc Föreläsning 5 (6) Metoder Metoder Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc Metoder Deklarera public void setnamn(string n) Åtkomstmodifierare Returtyp

Läs mer

TENTAMEN DATABASKUNSKAP ITEK12

TENTAMEN DATABASKUNSKAP ITEK12 TENTAMEN DATABASKUNSKAP ITEK12 Tid: Fredag den 19 oktober kl. 9-00-12.00, sal D409 Tillåtna hjälpmedel: Endast papper och penna. Poäng: Maxpoäng: 56. Gräns för G: 50%. Gräns för VG: 75%. Om något som verkar

Läs mer

1.Lär känna MS SQL Observera. Tips. Förberedelse

1.Lär känna MS SQL Observera. Tips. Förberedelse 1.Lär känna MS SQL 2008 Observera Övningar som finns tillgängliga är till för att du ska kunna testa dina kunskaper och träna på dem. Det är helt upp till dig när du vill genomföra och om du vill genomföra

Läs mer

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4 Modul 2 Byggstenar PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4 Byggstenar 4 Nyckelord 4 Tecken 4 Syntax 5 Standardbibliotek 5 Vårt första program 5 Variabler 6 Konstanter 9 Operatorer 9 Övningar 9 Mer operatorer

Läs mer