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

Relevanta dokument
Introduktion C-programmering

En kort text om programmering i C.

Kompilatorer och interpretatorer

kind spelling Scanning

TDIU01 - Programmering i C++, grundkurs

Repetition C-programmering

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

HI1024 Programmering, grundkurs TEN

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

Programmeringsteknik med C och Matlab

Programmering i C, 7,5 hp

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

Pekare och arrayer. Indexering och avreferering

Alfabeten, strängar och språk. String

Klassdeklaration. Metoddeklaration. Parameteröverföring

HI1024 Programmering, grundkurs TEN

Planering Programmering grundkurs HI1024 HT 2014

TDDC77 Objektorienterad Programmering

Kompilatorer och interpretatorer

Programmeringsteknik med C och Matlab

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

Objektorienterad Programmering (TDDC77)

Enkla datatyper minne

Användning av stack: evaluera uttryck i RPN

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

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

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

C-programmering, föreläsning 2 Jesper Wilhelmsson

Raspberry Pi och Tellstick, ett program i C.

*Pekarvärden *Pekarvariabler & *

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

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

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

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

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

Poster ( structar ) Postdeklarationer

HI1024 Programmering, grundkurs TEN

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Typkonvertering. Java versus C

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

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

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

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Programmering A. Johan Eliasson

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

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

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

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

#include <stdio.h> #include <string.h>

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

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

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

TDIU01 - Programmering i C++, grundkurs

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Variabler och konstanter

Objektorienterad Programmering (TDDC77)

Planering Programmering grundkurs HI1024 HT data

... Funktionsanrop. Vad händer när man kör ett program?

TDIU01 - Programmering i C++, grundkurs

Föreläsning 7: Syntaxanalys

C++ Slumptalsfunktioner + switch-satsen

Grundkurs Programmering

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

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

Grammatik. BNF-grammatik

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

Användarhandledning Version 1.2

C++ - En introduktion

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

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

SMD 134 Objektorienterad programmering

Arrays (indicerade variabler) Föreläsning 6

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

Planering Programmering grundkurs HI1024 HT TIDAA

Exempel ( )

Föreläsning 3: Booleans, if, switch

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

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Programmering Grundkurs (HI1900) Teoridel

Inlämningsuppgift MiniPlotter

tentamensdags och lab 3

Föreläsning 7: Syntaxanalys

Programmering i C. Christer Sandberg, Gunilla Eken, Stefan Bygde Olof Andersson Linus Källberg Caroline Uppsäll Johan Hägg

Funktionens deklaration

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

Twincat: PLC Control

Tentamen OOP

Det finns många flaggor till g++,

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript?

HI1024 Programmering, grundkurs TEN

Introduktionslaboration

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Transkript:

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, strängar, operatorer Problem i tex FORTRAN, jämför DO 5 I = 1.25 DO 5 I = 1,25 specifikation av tokens mha reguljära uttryck bl a tillståndstabell för ändlig automat lex källkod lex.l lexikalanalysator lexkompilator lex.yy.c lex.yy.c C- kompilator a.out input a.out sekvens av tokens

Används oftast tillsammans med Yacc GNUs varianter heter Flex och Bison (ev gflex, gbison) Den speciella variabeln yylval definieras av Yacc Lex genererar en lexikalanalysator som heter yylex()så varje gång man vill ha ett token anropar man denna funktion. För att få med en del nödvändiga saker ska programmet länkas med lex-biblioteket. gcc lex.yy.c ll Ett lexprogram består av tre delar: deklarationer översättningsregler hjälpfunktioner kodat i C, direkt till lex.yy.c deklarationer kan vara %{ konstanter variabler %} reguljära definitioner, tex letter [A-Za-z]

översättningsregler reguljärt uttryck, mönster för ett token C-kod, utförs när p 2 matchar input. Returnerar vanligen token till parsern. En global variabel yylval används för att returnera attribut. yytextpekar på första bokstaven i lexemet yyleng längden på lexemet Om flera mönster matchar 1) Längsta lexeme väljs (t ex väljer <= och inte <) 2) Första mönstret väljs Lookaheadoperatorn Mönstret r1/r2 betyder matcha r1 endast om match för r2 följer därefter.

Vissa tecken har speciell betydelse och måste omges av om man vill använda dem i sina mönster. (oftast fungerar \ också, tex \ ). $ ^ [ ] -? * + ( ) / { } < > Det mesta ser ut som vanliga reguljära uttryck, fast det finns en del utökningar, några exempel: [abc] [a-d] a b c a b c d. [0-9]+. [0-9]+ ^ $ ^ [ [ ] \ [^\ ]*\ {letter} %{ #include <strings.h> #define HELTAL 200 #define RELOP 201 #define LE 100 #define NE 101 #define LT 102 #define EQ 103 #define GE 104 #define GT 105 static int yylval; /* for standalone use */ %} /* Reguljära definitioner */ delim [ \t\n] ws {delim}+ digit [0-9] integer {digit}+ other.

{ws} { /* No action and no return */ } {integer} { yylval = atoi(yytext); return HELTAL; } "<" { yylval = LT; return RELOP; } "<=" { yylval = LE; return RELOP; } "=" { yylval = EQ; return RELOP; } "<>" { yylval = NE; return RELOP; } ">" { yylval = GT; return RELOP; } ">=" { yylval = GE; return RELOP; } {other} { /* ignore everything else */ }! int main(int argc, char *argv[]) { int ch; do { ch = yylex(); if (ch == HELTAL) { printf("tal = %d\n", yylval); } else if (ch == RELOP) { switch (yylval) { case LE: printf("mindre än el lika med\n"); break; case NE: printf("skiljt ifrån\n"); break; case LT: printf("mindre än\n"); break; case EQ: printf("lika med\n"); break; case GE: printf("större än el lika med\n"); break; case GT: printf("större än\n"); break; } } } while (1); }

" Skapa filen på Unix-systemet och använd lex, kompilera och kör. % lex exempel.l % gcc lex.yy.c ll % a.out bbbbb12bbbb tal = 12 <= mindre än el lika med #$$#%&& Yacc specification translate.y Yacc compiler y.tab.c y.tab.c C compiler a.out Input a.out Output Specificationen består av tre delar: y.tab.c

#$$ %{ C-deklarationer, direkt till y.tab.c %} Deklarationer av grammatiksymboler %token NUM (terminalsymboler från lexikal- %token ID analysator måste deklareras) %start program (grammatikens startsymbol) %left PLUS (vänsterass., högre prioritet) %left MULT Vid konflikter 1) shift-reduce - skifta 2) reduce-reduce - reducera enligt första produktionen #$$ ' Högersida: både terminaler och icketerminaler <left side> : <alt 1> {semantic action 1} <alt 2> {semantic action 2} icketerminal <alt n> {semantic action n} ; Allt som inte deklarerats som %token tolkas som icketerminaler Varje terminalsymbol har ett värde (returneras från lex i yylval) som kan användas i de semantiska reglerna (actions). Även icketerminaler kan ges värden. En följd av C-satser. Utförs när motsvarande produktion reduceras

#$$ ' $$ är vänstersidans värde och $i är värdet av den i:te symbolen på högersidan Defaultaction: { $$ = $1; } Semantiska regler kan också placeras mitt ibland högersidans symboler. A : B {z = 10;} C {x = $3;} Eftersom inget bibliotek liby.a (-ly), som för lex, finns måste följande rutiner finnas (t ex i tredje delen av yaccfilen) yyerror() main() $$ Minimala nödvändiga funktioner int main(int argc, char *argv[]) { return yyparse(); } int yyerror(char *s) { fprintf(stderr, %s\n, s); } yyparse(): Drivrutin för parsningen, skapas av yacc Anropar yylex (som skapas av lex) Returnerar 0 om allt OK, 1 om fel. yydebug: variabel med defaultvärde 0. Debugutskrifter som visar exakt vad parsern gör om 0. yychar: variabel som innehåller numret på senast lästa token (lookahead). Yacc tilldelar varje token ett nummer.

#$$ Om man anger optionen d vid anropet av yacc genereras en header-file y.tab.c som innehåller definitioner av de tokens som deklareras i yaccfilen, och de typer av värden som som symboler kan anta. Kan behöva inkluderas i vissa filer. #$$ Översättning från infix notation till postfix (beräkna även uttryckets värde) start expr \n expr expr + expr {print( + )} expr * expr {print( * )} ( expr ) num {print(num.value)} name {print(name.name)}

%{ #include y.tab.h %} delim [ \t] ws {delim}+ digit [0-9] int {digit}+ id [a-z] #$$ () {int} { yylval.value = atoi(yytext); return NUM; } [\+\*\(\)\n] { return yytext[0]; } {id} { yylval.id.value = yytext[0]-'a'+1; strcpy(yylval.id.name, yytext); return NAME; } {ws} { /* No action and no return */ } #$$ () %{ #include <string.h> #include <stdio.h> #include <stdlib.h> extern int yylex(); extern int yyparse(); extern int yyerror(const char *msg); %} %union { int value; struct { int value; char name[256]; } id; } %token <id> NAME %token <value> NUM %left '+' %left '*' %type <value> expr

#$$ () start : expr '\n { printf("\nval = %d\n", $1); exit(0); } ; expr : expr '+' expr { $$ = $1 + $3; printf("%c ", '+'); } expr '*' expr { $$ = $1 * $3; printf("%c ", '*'); } '(' expr ') { $$ = $2;} NUM { $$ = $1; printf("%d ", $1); } NAME { $$ = $1.value; printf("%s ", $1.name); } ; #$$ ()! int yyerror(const char *msg) { fprintf(stderr, "Error: %s\n", msg); return 0; } int main(int argc, char **argv) { yyparse(); return 0; }

#$$ ( % lex infix.l % yacc d infix.y % gcc y.tab.c lex.yy.c ll % a.out 12+3*4 12 3 4 * + val = 24 % a.out 10+b 10 b + val = 12 %