• No results found

Bilaga 2 Manual programmeringsspråket Q

2.1 Nyckelord

Nedanstående ord är reserverade i programmeringsspråket Q. sysMemAllocGlobal, sysCreateStack, alias, stk, while, do, if, else, print, include, call, subroutine, struct.

2.2 Main

Det finns ingen fördefinierad main funktion som anger startpunkten för programmet utan varje projekt har en start fil som anges med hjälp av filändelsen .main.q. När Interpretatorn ska börja interpretera letar den efter en fil med filändelsen .main.q om den hittar filen börjar den interpretera första byten i <filename>.main.q filen om den inte kan lokalisera den kommer ett felmeddelande visas.

2.3 Allokera minne

Instruktion Beskrivning

:sysM emAllocGlobal 64; Allokera en Global på 64 byte.

:sysCreateStack 32; Skapa en Stack på 32 byte.

2.4 Global

Användaren bör allokera minne högst upp i filen med filändelsen main.q. Minnet för Global allokeras statiskt och dess värden nollställs aldrig, vid insättning av nya värden skrivs de gamla värdena över. Första minnesadressen är alltid #0 och varje minnesadress är av stor leken

40 en byte, det vill säga åtta bitar. Det finns ingen övre gräns för hur mycket minne användaren tillåts allokera utan den övre gränsen bestäms av operativsystemet.

2.5 Stack

Stacken är en data struktur som är implementerad enligt LIFO (Last In First Out) principen och är placerad ovanpå Global. Skapandet av Stacken ska ske innan den används och bör göras direkt efter allokeringen av Global. Vidare får inte Stackens storlek överstiga storleken på Global. Storleken på en minnesplats i Stacken är av samma storlek som en minnesplats på Global. När Stacken skapas utgår den alltid från minnesplats #0 på Global. När ett värde läggs på Stacken ansvarar Stacken för insättningen av värdet samt lagra s värdets storlek och data typ i ett separat index. I de fall användaren försöker skapa ett alias på Stacken kommer ett felmeddelande visas. I de fall värdet för ett alias läggs till på Stacken kommer enbart en kopia av värdet lagras, vilket innebär att en ändring av värdet inte påverkar aliaset som äger värdet.

Instruktion Beskrivning

:stk.popTop(); Avlägsnar elementet högst upp på Stacken

:stk.pop(); Avlägsnar en byte högst upp på Stacken.

:stk.pushTop(”hello”); :stk.pushTop(alias); :stk.pushTop(12345);

Lägger till ett element högst upp på Stacken.

:stk.getTop(); Hämtar första elementet på Stacken.

:stk.getSize(); Returnerar antalet lagrade element på Stacken. :stk.pushAt(23, “hello”); :stk.pushAt(23, alias); :stk.pushAt(23, 12345); Lagrar element på minnesplats 23.

stk.getAt(23); Hämtar elementet lagrat på minnesplats 23.

2.6 Inkludera fil

Vid inkluderandet av nya filer rekommenderas att detta görs direkt under minnesallokeringen och skapandet av Stacken, men det är möjligt att inkludera nya filer på valfri plats i koden.

Instruktion Beskrivning

:include("../anotherFile.q"); Inkluderar en ny fil i projektet.

2.7 Kommentarer

Instruktion Beskrivning

41

*/ Avslut på kommentar.

2.8 Alias

Ett alias värde kan vara från en byte till Globals maximala storlek. Vid namn kollisioner kommer det första värdet skrivas över av det senare.

I de fall en textsträng saknar dubbla citationstecken i början och slutet kommer det förefallas av en krasch. Vidare finns inget stöd för att använda dubbla citationstecken som symbol inne i en textsträng. Textsträngar ska inte avslutas med ett ’\0’ eftersom interpretatorn är medveten om textsträngarnas storlek.

För att verifiera storleken av ett heltal används [15] INT_MAX och INT_MIN. I de fall det

inmatade talet överstiger storleken eller det inmatade heltalet innehåller bokstäver kommer det förefallas av en krasch.

För att kunna skilja mellan att lagra ett värde på en adress och att häma ett värde på en adress anges left hand side value med en & operator framför aliaset och right hand side value anges utan & operatorn.

Instruktion Beskrivning

:alias namn : #32;

:alias tal : #12 ; Definition. #32 = ”hello”;

#12 = 12345;

Initialisering

:alias namn : #32 = ”hello”; :alias tal : #12 = 12345;

Definition inklusive initialisering.

&alias1 = alias2 Lagrar värdet för alias2 på minnesplatsen för alias1.

2.9 Operatorer

Interpretatorn läser från höger till vänster vilket innebär att användandet av parenteser för att skapa nivåer inte kommer påverka hur den tolkar uttrycke n. Det finns inget stöd för

prioritering av operatorer i matematiska uttryck.

2.9.1 Jämförelser

Kan jämföra alias mot alias, alias mot värdet i hårdkodad minnesadress, alias minnesadress mot hårdkodad minnesadress, minnesadress mot minnesadress.

Instruktion Beskrivning

!= Om värdena inte är lika.

42

< Det vänstra värdet är mindre i jämförelse med det högra. Jämför storleken på tal och jämför längden på textsträngar.

> Det högra värdet är större i jämförelse med det vänstra. Jämför storleken på tal och jämför längden på textsträngar.

2.9.2 Logisk

Instruktion Beskrivning

& Placeras till vänster om alias namnet för att få åtkomst till dess minnesplats.

2.9.3 Minnes adress

Instruktion Beskrivning

# Placeras till vänster om ett tal för att få

åtkomst till en specifik minnesadress.

2.9.4 Tilldelning

Instruktion Beskrivning

= Det vänstra värdet är lika med det högra.

+ Addera vänstra och högra värdet.

- Subtrahera det vänstra och högra värdet.

* Multiplicerar det vänstra och högra värdet.

/ Dividerar det vänstra och högra värdet.

2.10 Skriva ut till skärm

Kan hantera mellan ett och 32 argument.

Instruktion Beskrivning

:print(”Hello world”); Skriver ut textsträngen ”Hello world”.

:print(alias); Skriver ut värdet för ett alias.

:print(”value is ”, alias); Skriver ut textsträngen ”value is ” följt av värdet för alias.

:print(”Compare numbers: ”, 2 == 1); :print(”Compare strings: ”, ”hello” == ”hell”);

:print(”Compare alias: ”, alias1 == alias2);

Stödjer jämförelser mellan heltal, textsträngar och alias.

43

:print(#13); Skriver ut värdet som finns lagrat på minnesplats 13 (om användaren inte har lagrat något värde kommer NULL skrivas ut).

:print(&alias); Skriver ut minnesadressen för ett alias.

Related documents