2D1372 Artificiella språk och syntaxanalys

Relevanta dokument
2D1373 Artificiella språk och syntaxanalys

Övningsexempel i Artificiella språk och syntaxanalys 2D1373

MÄLARDALENS HÖGSKOLA. CD5560 Formella språk, automater och beräkningsteori. Användarmanual. för simulatorn JFLAP

Föreläsning 7: Syntaxanalys

Introduktion till formella metoder Programmeringsmetodik 1. Inledning

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

DD1361 Programmeringsparadigm. Formella Språk & Syntaxanalys. Per Austrin

Inlämningsuppgift MiniPlotter

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

Föreläsning 6: Introduktion av listor

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Idag: Reguljära språk Beskrivs av Reguljära uttryck DFA Grammatik

Reguljära uttryck Grammatiker Rekursiv nedåkning Allmänna kontextfria grammatiker. Syntaxanalys. Douglas Wikström KTH Stockholm

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

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

Föreläsning 3-4 Innehåll

TENTAMEN I PROGRAMSPRÅK -- DVG C kl. 08:15-13:15

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

i=1 c i = B och c i = a i eller c i = b i för 1 i n. Beskriv och analysera en algoritm som löser detta problem med hjälp av dynamisk programmering.

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Kontextfria grammatiker

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Automatateori (2) Idag: Sammanhangsfria språk. Dessa kan uttryckas med Grammatik PDA

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Typkonvertering. Java versus C

Alfabeten, strängar och språk. String

Användarhandledning Version 1.2

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

TDIU01 - Programmering i C++, grundkurs

Inlämningsuppgift : Finn. 2D1418 Språkteknologi. Christoffer Sabel E-post: csabel@kth.se 1

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 9: Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

Uppgift 1 (grundläggande konstruktioner)

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

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

Tentamen *:58/ID100V Programmering i C Exempel 3

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Sätt att skriva ut binärträd

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Uppgift 1 ( Betyg 3 uppgift )

Uppgift 1a (Aktiekurser utan poster)

Tentamen, EDAA10 Programmering i Java

DD1361 Programmeringsparadigm. Carina Edlund

Turingmaskiner och oavgörbarhet. Turingmaskinen. Den maximalt förenklade modell för beräkning vi kommer använda är turingmaskinen.

Grammatik. BNF-grammatik

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Objektorienterad modellering och diskreta strukturer. 13. Problem. Sven Gestegård Robertz. Datavetenskap, LTH

Inlämningsuppgift 1, Digsim

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Klassdeklaration. Metoddeklaration. Parameteröverföring

Föreläsning REPETITION & EXTENTA

TDDC77 Objektorienterad Programmering

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

Dynamisk programmering

Definition. Mängden av reguljära uttryck på alfabetet Σ definieras av. om α och β är reguljära uttryck så är (α β) ett reguljärt uttryck

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

Programmering för språkteknologer II, HT2011. Rum

Uppgift 1 ( Betyg 3 uppgift )

Objektorienterad Programmering (TDDC77)

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Pascal... Pascal. Pascal... Pascal...

Grundläggande datalogi - Övning 9

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

kl Tentaupplägg

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

Skolan för Datavetenskap och kommunikation PROGRAMMERINGSTEKNIK FÖRELÄSNING 18

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

DAB760: Språk och logik

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

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Parsning. TDP007 Konstruktion av datorspråk Föreläsning 6. Peter Dalenius Institutionen för datavetenskap

Rekursion och induktion för algoritmkonstruktion

DD1314 Programmeringsteknik

F4. programmeringsteknik och Matlab

Tentamen Grundläggande programmering

Labora&on 2 Funk&oner, if och loop övningar/uppgi:er

12. Relationer och funktioner

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

TDIU01 - Programmering i C++, grundkurs

Föreläsning 11 - Automater, textsökning, tillstånd

Objektorienterad Programmering (TDDC77)

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

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Dagens program. Programmeringsteknik och Matlab. Viktiga datum. Ett första exempel. Programmall, vad behöver vi i ett javaprogram?

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Tentamen i. TDDC67 Funktionell programmering och Lisp

Föreläsning 2 5/6/08. Reguljära uttryck 1. Reguljära uttryck. Konkatenering och Kleene star. Några operationer på språk

kl Tentaupplägg

Laboration: Whitebox- och blackboxtesting

Tentamen i. Programmering i språket C

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Föreläsning 10. Besiktningsprotokollet

Transkript:

VK Viggo Kann 1997-01-22 A NADA Laborationer i 2D172 Artificiella språk och syntaxanalys våren 1997 Namn... Personnr... Labb 1 Godkänt den... Kvitteras... Timmar... Labb 2 Godkänt den... Kvitteras... Timmar... Labb Godkänt den... Kvitteras... Timmar... Labb 4 Godkänt den... Kvitteras... Timmar... Labb 5 Godkänt den... Kvitteras... Timmar... 1

Laboration 1 i Artificiella språk och syntaxanalys, våren 1997 Simulering av NFA I denna laboration ska du skriva ett program som simulerar en ickedeterministisk ändlig automat. Du kommer att behöva detta program i laboration 4 senare i kursen. En ickedeterministisk ändlig automat (förkortat NFA) beskrivs av en femtupel som består av: alfabetet Σ, mängden tillstånd Q, starttillståndet q 0 Q, mängden accepterande tillstånd F Q och övergångsrelationen N : Q Σ {ε} Q. Vad allt detta står för beskrivs i avsnitt 2. och 2.4 i Introduction to compiler construction. Vid simuleringen ställer vi för enkelhets skull några extra krav på automaten. Tillstånden är numrerade med naturliga tal där tillstånd nummer noll är speciellt och är både starttillståndet och det enda accepterande tillståndet. Högst MAXSTATES=100 tillstånd får finnas. Från varje tillstånd får det antingen gå en teckenövergång, en epsilonövergång eller två stycken epsilonövergångar, det vill säga en ickedeterministisk förgrening. Detta är ingen svår begränsning alla ickedeterministiska ändliga automater kan enkelt skrivas om på ett sånt sätt. Från tillstånd noll går en epsilonövergång till det första egentliga tillståndet och när (och om) automaten återvänder till tillstånd noll så accepterar den, även om det finns inmatning kvar. Det får inte finnas någon loop med bara epsilonövergångar i automaten. ÖvergångsrelationenN ska realiseras med dom tre vektorerna nextch[], next1[] och next2[]. q 8, A,q 17 N ska lagras som nextch[8] = A, next1[8] = 17; och q 5,ε,q 2 N lagras som nextch[5] =, next1[5] = 2; Om det finns två epsilonövergångar från tillstånd q 5 används next2[5] för att lagra den andra (i annat fall ska next2[5] vara 1). Här följer ett exempel på en automat och hur automaten lagras i vektorerna. A 5 6 C 0 4 B D 7 8 9 0 2 A 1 0 1 2 4 5 6 7 8 9 nextch A B A C D next1 4 2 7 5 6 7 8 9 0 next2-1 -1 1-1 2-1 -1-1 -1-1 2

Idén är att man samtidigt ska komma ihåg alla tillstånd som automaten i ett visst läge av inmatningen kan befinna sig i. För att hålla reda på dessa behöver man implementera en lek (deque). Denna abstrakta datastruktur fungerar som en stack som man kan pusha och poppa element från i båda ändarna. I början av leken ska numren på dom tillstånd automaten befinner sig i ligga; därefter kommer ett staket (t ex markerat med talet 1), följt av dom tillståndautomaten kan hamna i efter att ha läst nästa tecken. För varje tillstånd före staketet kollar man om det finns några övergångar därifrån. Om det finns epsilonövergångar lägger man till dom nya tillstånden före staketet, det vill säga till mängden tillstånd som man kan befinna sig i. Om det finns en teckenövergång och tecknet stämmer överens med det inmatade tecknet lägger man till nästa tillstånd efter staketet. När alla tillstånd före staketet har betats av läser man in nästa inmatningstecken och flyttar staketet sist i leken. Så håller man på tills man når ett accepterande tillstånd, det inte finns några möjliga tillstånd kvar eller inmatningen är slut. Om det finns cykler av epsilonövergångar i automaten kommer man in i en oändlig slinga. Ditt program behöver inte klara av att hantera detta problem. Uppgifter 1. Skriv i valfritt programspråk en modul Deque som innehåller rutiner för hantering av leken. På nästa sida finns en C-inkluderingsfil som specificerar gränssnittet. Leken ska representeras som en vektor (se nedanstående beskrivning). Modulen Deque ska separatkompileras. 2. Skriv i en annan modul en procedur Automat() som simulerar en automat lagrad såsom beskrivits ovan. På nästa sida finns en algoritmbeskrivning. Se till att du förstår algoritmen!. Skriv ett huvudprogram som frågar efter en fil som innehåller en automat, läser in den automaten i dom tre vektorerna samt anropar simuleringsproceduren. Automaten i exemplet ovan finns ifilen/info/syntax97/labbar/1/labb1.exempel. Titta på den för att se hur dom tre vektorerna lagras på fil. Testa exempelautomaten med några inmatningar. Ditt program ska tala om ifall inledningen av raden accepteras och i så fall om den kortaste matchningen är hela inmatningsraden eller bara början av den. Vilket reguljärt uttryck motsvarar det språk exempelautomaten accepterar? Vektorrepresentation av en lek En lek med plats för maxdeq element kan representeras som en vektor v[0..maxdeq] och två index fp och bp. fp är indexet för det första elementet i leken och bp är indexet för det sista elementet i leken. Om det bara finns ett element i leken är alltså fp bp. Om det finns två element i leken är fp 1 bp, och allmänt, om det finns k element i leken är fp k 1 bp. Ombp faller utanför vektorn, det vill säga om bp > maxdeq så låter vi leken gå runt och fortsätta från index 0, det vill säga bp fp k 1 mod maxdeq 1. Följande figurer visar hur det kan se ut i olika fall.

En lek med ett element...... En lek med flera element...... fp bp fp bp En tom lek...... En full lek...... fp bp fp bp Algoritmbeskrivning för simulatorn D DEQUE-NEW(2 MAXSTATES) state next1[0] stop FALSE READ(ch) if ch \n then DEQUE-PUSH-FRONT(D, FENCE) repeat if statefence then READ(ch) if ch \n then DEQUE-PUSH-BACK(D, FENCE) else if nextch[state] then DEQUE-PUSH-FRONT(D, next1[state]) if next2[state] 1 then DEQUE-PUSH-FRONT(D, next2[state]) else if nextch[state]ch then DEQUE-PUSH-BACK(D, next1[state]) if not DEQUE-POP-FRONT(D, state) then stop TRUE until state0 or stop return state0 4

Gränssnitt för modulen Deque /* Gr nssnitt f r datastrukturen deque. */ /* Filen finns i /info/syntax96/labbar/1/deque.h */ #ifndef boolean #define boolean int #endif #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif typedef struct deque *dequetype; typedef int dequeelementtype; /* DequeNew skapar en ny lek med plats f r maxdeque element. */ extern dequetype DequeNew(int maxdeque); /* DequeFull talar om ifall leken r full. */ extern boolean DequeFull(dequetype d); /* DequeEmpty talar om ifall leken r tom. */ extern boolean DequeEmpty(dequetype d); /* DequePushFront stoppar in elementet x f rst i leken och returnerar TRUE */ /* om det g r bra, dvs leken inte r full. */ extern boolean DequePushFront(dequetype d, dequeelementtype x); /* DequePushBack stoppar in elementet x sist i leken och returnerar TRUE */ /* om det g r bra, dvs leken inte r full. */ extern boolean DequePushBack(dequetype d, dequeelementtype x); /* DequePopFront poppar det f rsta elementet i leken och l gger det p den */ /* plats dit p pekar. Om leken var tom returneras FALSE, annars TRUE. */ extern boolean DequePopFront(dequetype d, dequeelementtype *p); /* DequePopBack poppar det sista elementet i leken och l gger det p den */ /* plats dit p pekar. Om leken var tom returneras FALSE, annars TRUE. */ extern boolean DequePopBack(dequetype d, dequeelementtype *p); 5

Laboration 2 i Artificiella språk och syntaxanalys, våren 1997 Lexikal analys med Flex Lex/Flex är ett utmärkt verktyg om man vill göra lexikala ändringar i en text. I denna laboration ska du utnyttja Flex för att extrahera information ur en enkel databas över redovisningsbokningar och skapa en bokningslista. Databasen för bokningssystemet är på textformat och har följande utseende: NYBOK 15.00 AVBOK 1.00 RTID 0 >970115;8.00;10.00;Brun;viggo :1;x94-pan;Andersson, Peter :2;y9_mad;Arvehed, Melitta :;x94-bjo;johansson, Bojan >970124;1.00;15.00;Brun;viggo >97011;1.00;15.00;Brun;viggo :1;x94-gmy;Mysk, Gottwolf :;x94-lbo;bonn, Lissa :4;y94_ntn;Tessin, Nisse Först i databasen kommer deklarationer av några variabler. Den enda som är intressant för bokningslistan är variabeln RTID som anger hur många minuter en redovisning tar. Efter deklarationerna följer bokningshuvuden och bokningar. Varje bokningshuvud är en rad som inleds med tecknet > och följs av datum, starttid och sluttid för ett redovisningspass. Sist på raden kommer en sträng som anger i vilken sal redovisningarna ska äga rum och vem som ska ta hand om redovisningarna. Fälten skiljs av semikolon. Efter bokningshuvudet kommer dom bokningar som hittills är gjorda till det redovisningstillfället, en bokning per rad. Varje bokningsrad inleds med tecknet : och följs av ordningsnumret (bokning 1 börjar på redovisningstillfälletsstarttid, bokning2 börjar RTID minuter senare och så vidare), användarnamn samt vanligt namn på den som bokat in sig på tiden. Utmatningen från programmet ska vara en bokningslista som anger namn, datum och tid för varje bokning. Ovanstående bokningsfil ska producera följande lista: Andersson, Peter 970115 8.00 Arvehed, Melitta 970115 8.0 Johansson, Bojan 970115 9.00 Mysk, Gottwolf 97011 1.00 Bonn, Lissa 97011 14.00 Tessin, Nisse 97011 14.0 Din uppgift är att skriva en sådan översättare i Flex. Programmet behöver inte hantera felaktiga indata. Använd Flex möjlighet att märka dom reguljära uttrycken med startvillkor (se avsnittet Start conditions i Flexmanualen i Info i Emacs och tal 2.6 i exempelsamlingen). Inför till exempel ett startvillkor för bokningshuvuden och ett för bokningar. Indatafilen i exemplet ovan heter /info/syntax97/labbar/2/bokning.db. 6

Laboration i Artificiella språk och syntaxanalys, våren 1997 Rekursiv medåkning Rekursiv medåkning (eng. recursive descent) är en metod att direkt från en grammatik skriva en enkel syntaxanalysator i ett vanligt programspråk, se avsnitt. i Introduction to compiler construction. I denna laboration ska du modifiera och bygga ut en rekursiv medåkningsanalysator för en enkel räknedosa. Du ska utgå från filen /info/syntax97/labbar//casio.c som innehåller en räknedosa med dom fem räknesätten addition, subtraktion, multiplikation, division och exponentiering enligt nedanstående EBNF-grammatik. Denna analysator gås igenom på föreläsning 7. <start> ::= ENDSYM \n <start> <expr> \n <start> <expr> ::= <term> { ( + - ) <term> } <term> ::= <factor> { ( * / ) <factor> } <factor>::= <prim> [ ^ <factor> ] <prim> ::= NUMBERSYM - <prim> ( <expr> ) Uppgifter 1. Se till att du förstår den givna analysatorn i detalj. 2. Bygg ut analysatorn med variabler och en tilldelningssats enligt följande tillägg till grammatiken: <start> ::= LET <variable> = <expr> \n <start> <prim> ::= <variable> <variable> ::= VARIABLESYM Du måste alltså lägga till tre symboler LETSYM, ASSIGNSYM och VARIABLESYM till den lexikala analysatorn. Du får själv bestämma hur en variabel ska få se ut, men det räcker om du tillåter enbokstavsnamn. Du måste också hålla reda på variablernas värden i en symboltabell med hjälp av någon lämpligt vald datastruktur. 7

Laboration 4 i Artificiella språk och syntaxanalys, våren 1997 Reguljära uttryck med Flex och Bison Denna laboration är en tillämpning av teorin för reguljära uttryck och kontextfria grammatiker. Du ska med hjälp av Flex och Bison skriva ett program som syntaxanalyserar ett reguljärt uttryck och skriver ut en beskrivning av en ickedeterministisk ändlig automat som känner igen språket som det reguljära uttrycket beskriver. När programmet är klart ska man kunna köra det och skriva in ett reguljärt uttryck, till exempel x(uv w)* som motsvarar xuv w med bokens notation. Programmet ska då på fil beskriva en ickedeterministisk ändlig automat som accepterar detta språk. Därefter ska man kunna använda programmet som du skrev i laboration 1 för att simulera automaten och testa om olika inmatningssträngar accepteras. Reguljära uttryck beskrivs i avsnitt 2.6 i Introduction to compiler construction. Grammatiken för reguljära uttryck kan i BNF skrivas på följande sätt. <expression>::= <term> <expression> <term> <term>::= <factor> <term><factor> <factor>::= ( <expression> ) <factor> * v Lexikala regler: v betyder en bokstav (A Ö eller a ö); blanka får förekomma var som helst i uttrycket. Grammatiken ovan har medvetet skrivits vänsterrekursiv för Yaccs och Bisons skull, se sida 14 i Introduction to compiler construction och avsnittet Recursion i kapitlet Bison Grammar Files i Bisonmanualen i Info i Emacs. Uppgifter 1. Skriv om dom kontextfria grammatiska reglerna ovan i Bison. Inför en extra regel <regexp> ::= <expression> och låt regexp vara startsymbol. Som lexikal analysator yylex() ska Flex användas. Låt LETTER vara slutsymbolen som motsvarar en bokstav. Låt huvudprogrammet bara kolla värdet av yyparse() och skriva korrekt (om det var ett riktigt reguljärt uttryck) eller felaktigt beroende på om värdet var 0 eller 1. Programmet är nu en färdig syntaxanalysator (parser) som känner igen språket av (korrekta) reguljära uttryck. Kör Flex och Bison, kompilera och prova att mata in några riktiga och felaktiga reguljära uttryck. För att tala om att ett uttryck är färdiginmatat måste man kanske (beroende på hur yylex() ser ut) trycka på CTRL-D, dvs filslut, först på en rad. 2. Nu ska syntaxanalysatorn byggas ut till en översättare, som givet ett reguljärt uttryck skapar och matar ut en ickedeterministisk automat. Uppgiften är alltså att skapa vektorerna nextch[], next1[] och next2[] (från laboration 1). Låt state vara en heltalsvariabel som håller reda på indexet för den första oanvända platsen i tillståndsvektorerna. Sätt state = 1 från början. Starttillståndet, som har nummer 0, kommer att tillverkas sist av allt. Läs om hur reguljära uttryck kan översättas till ändliga igenkännare i avsnitt 2.7 i Introduction to compiler construction. Varje regel i din grammatik känner igen ett reguljärt uttryck som är ett deluttryck i det hela reguljära uttrycket. Låt regeln bilda den delautomat som motsvarar det reguljära uttrycket. Denna delautomat har ett starttillstånd och ett sluttillstånd. För att delautomaten ska kunna kopplas ihop med andra automater måste dess starttillstånd och sluttillstånd 8

bli kända för dom andra reglerna. Detta går att göra genom att regeln som semantiskt värde returnerar en post som innehåller dom två heltalen enterstate och exitstate som anger numren på delautomatens starttillstånd och sluttillstånd. Alltså måste varje regel sätta värden på $$.enterstate och $$.exitstate. När nu reglerna expression, term och factor ska returnera semantiska värden som är en post istället för ett tecken (som returneras från LETTER) så måste den semantiska typen vara en union av en teckentyp och en posttyp. Deklarationen kan göras i Yaccfilen på följande sätt. %union { char letter; struct { int enterstate; int exitstate; } states; } Skapa ett nytt tillstånd genom att anropa proceduren void setstate(int state, char c, int n1, int n2) { nextch[state] = c; next1[state] = n1; next2[state] = n2; } När man skapar en delautomats sluttillstånd vet man inte ännu vart uthoppet ska gå, utan övergången måste sättas av den regel som senare kombinerar den aktuella delautomaten med nästa delautomat. Enklast blir det för den regeln om du alltid ser till att uthoppet från delautomaten går från next1[]. Initiera uthoppsövergången till 1 så är det lätt att se på automaten om något uthopp förblir otilldelat. Figuren nedan talar om för varje regel hur motsvarande ändliga automat kan byggas. Alla övergångar är epsilonövergångar utom den som läser en bokstav i den nedersta automaten. expression expression term term term factor term factor factor * factor v v 9

För att se till att tillstånd nr 0 är det första och sista tillståndet enligt specifikationen i laboration 1 kan man använda sig av följande Yaccregel. regexp : ; expression { setstate(0,, $1.enterState, -1); next1[$1.exitstate] = 0; } När vektorerna är färdiguppbyggda återstår bara att skriva ut dom på fil. Detta kan till exempel göras i main() efter anropet av yyparse(). När programmet är klart ska det kunna producera filer som kan läsas av simulatorn från laboration 1. Prova några reguljära uttryck och kolla att allt fungerar. Det är inte nödvändigt med någon felhantering. Syntaxanalysatorn behöver inte klara av reguljära uttryck som innehåller en onödig stjärna, tex A. Den givna beskrivningen ger nämligen en slinga av enbart epsilonövergångar för sådana reguljära uttryck, och det klarar inte simulatorn från laboration 1 av. Den som vill får givetvis råda bot på problemet genom att inte tillverka några nya tillstånd för onödiga stjärnoperatorer. 10

Laboration 5 i Artificiella språk och syntaxanalys, våren 1997 En valfri översättare I denna laboration ska du få tillämpa det du har lärt dig i kursen på en egen praktiskt användbar översättare. Du ska antingen skriva en översättare från en välkänd notation till en annan eller en granskare som kollar syntaxen och ger vettiga felmeddelanden om inmatningen är felaktig. Du får själv välja uppgift bland förslagen nedan. Ditt program ska använda något syntaxanalyseringsverktyg, men det är din sak att välja mellan till exempel Yacc, Bison, Ox, Jack, PCCTS och liknande verktyg. Kom ihåg att du inte kan förvänta dig att du alltid kan få hjälp av handledarna med andra verktyg än dom som använts i kursen. Uppgift 1. Välj en av nedanstående uppgifter. Skriv ner en kravspecifikation för programmet. Eftersom uppgiftsformuleringarna är korta och vaga så finns det en hel del detaljer som bör fyllas i. Om du har valt någon av dom fria uppgifterna (dom två sista i listan) så måste du visa upp din specifikation för någon av lärarna för att få klartecken att göra uppgiften. Annars så räcker det att du tar med specifikationen när du redovisar programmet. Det är viktigt att du begränsar uppgiften så att den inte blir för stor. Uppgiften bör högst ta 20 timmar att göra. Om det är ett stort språk du ska analysera kan du ta bort delar av grammatiken som är mindre viktiga och inte tillför uppgiften någon extra svårighet utan bara merarbete. 2. Ta reda på grammatiker för dom språk ditt program ska behandla. Sök gärna information i Internet. På kursens sida i www finns en del pekare till användbar information. Du kanske till och med kan hitta en färdig grammatik i det format som det syntaxanalyseringsverktyg du valt vill ha. Däremot får du förstås inte kopiera färdiga program det är du som ska lösa uppgiften och inte någon annan.. Skriv med hjälp av det syntaxanalyseringsverktyg du valt ett program som löser uppgiften (det vill säga uppfyller kravspecifikationen). Programmet måste hålla god kvalitet (vara korrekt, effektivt, lättläst, flexibelt och robust). 4. Skriv en enkel användarhandledning för programmet. Förslag på uppgifter 1. Konvertering av HTML till TEX/LATEX. 2. Konvertering av RTF (Rich text format) till HTML.. Konvertering av RTF till TEX/LATEX. 4. Konvertering av Framemaker till HTML. 5. Konvertering av KTHs lässchema i textform till veckoscheman i HTML, LATEX eller liknande. 6. Konvertering av tupelkalkyl till SQL. Kvantifikatorn för alla behöver inte implementeras. 11

7. Konvertering av relationsalgebra till SQL. 8. Granskning av SQL. 9. Granskning av HTML. 10. Programförskönare för C-kod, Javakod eller liknande. 11. Programstatistikgenerator för C, Pascal, ADA, Java eller något liknande språk. Statistiken kan bestå av antal parametrar per funktion, antal lokala och globala variabler, antal direkta och indirekta funktionsanrop etcetera. 12. Automatisk konstruktion av prototypdeklarationer i C. Programmet bör klara både funktioner med ANSI-C-syntax och gammal K&R-C-syntax. 1. Förbättrad Yacc-syntax. Uppfinn en snyggare och behändigare syntax till Yaccfiler och skriv en syntaxanalysatorsom översätter filer med den nya syntaxen till Yaccfiler som kan stoppas in i Yacc eller Bison. 14. Konvertera mellan två andra notationer. Välj själv vilka, men du måste få specifikationen godkänd av någon av lärarna innan du gör uppgiften. 15. Definiera ett eget programspråk och gör en granskare för det. Du måste få specifikationen godkänd av någon av lärarna innan du gör uppgiften. 12