PARADYGMATY I JĘZYKI PROGRAMOWANIA. lex/flex i yacc/bison w- 4 (2014)

Wielkość: px
Rozpocząć pokaz od strony:

Download "PARADYGMATY I JĘZYKI PROGRAMOWANIA. lex/flex i yacc/bison w- 4 (2014)"

Transkrypt

1 PARADYGMATY I JĘZYKI PROGRAMOWANIA lex/flex i yacc/bison w- 4 (2014)

2 Kompilator 2 faza wstępna faza końcowa faza postkońcowa Skaner Parser Analizator semantyki Optymizator Generator kodu

3 lexer/scanner 3 Analiza leksykalna proces zamiany ciągów znaków na ciąg tokenów x = 4 3*2 LEKSEM TOKEN x ZMIENNA = PRZYPISANIE 4 LICZBA - O_MINUS 3 LICZBA * O_MUL 2 LICZBA

4 parser 4 Analiza syntaktyczna analiza ciągów tokenów (leksemów); ich struktura gramatyczna; błędy składni LEKSEM TOKEN x ZMIENNA = PRZYPISANIE 4 LICZBA - O_MINUS 3 LICZBA * O_MUL 2 LICZBA x = 4 3*2 = x - 4 * 3 2 ^ 4

5 Analizator semantyki 5 Analiza semantyczna znaczenie n np. sprawdzanie typów, wiązanie obiektów, etc. Kod: double a = "napis"; Błąd analizy semantycznej: error: incompatible types in initialization

6 Optymalizator 6 zmniejszenie/zwiększenie pewnych własności programu wynikowego np. przyspieszenie programu

7 Generator kodu 7 Generacja kodu proces, w którym kompilator zamienia program źródłowy na wykonywalny, maszynowy x = a + b * c load c! mul b! add a! store x!

8 8 lex/flex & yacc/bison

9 lex/flex 9 lex narzędzie do budowy analizatorów leksykalnych M.E. Lesk i E. Schmidt (Lex A Lexical Analyzer Generator) obecnie rzadko używany flex (fast lexical analyzer generator) Open source (darmowy)

10 yacc/bison 10 yacc narzędzie do tworzenia analizatorów syntaktycznych (S.C. Johnson. Yacc: Yet Another Compiler- Compiler) wygenerowany parser potrzebuje analizatroa leksykalnego obecnie rzadko używany bison Open source (darmowy)

11 ...związek z kompilacją 11 faza wstępna faza końcowa faza postkońcowa Skaner Parser Analizator semantyki Optymizator Generator kodu Lex/Flex (*.l skrypt) Yacc/Bison (*.y skrypt)

12 Schemat działania 12 KOD ŹRODŁOWY a = b + c * d WZORCE GRAMATYKA = id1 + id2 * id3 id4 ^ lex/flex yylex() ANALIZA LEKSYKALNA yyparse() yacc/bison ANALIZA SYNTAKTYCZNA KOD ASEMB. ======== load id3 mul id4 add id2 store id1

13 Schemat działania 13 skrypt.l skrypt.y lex flex yacc bison kod skanera skrypt.lex.c skrypt.tab.c kod parsera wejście a.out wyjście

14 Jak działa flex? 14 Flex używa skryptu *.l do generowania skanera *.l skrypt lex lex.yy.c skaner: czyta plik wejściowy (input file) przetwarza plik na ciąg tokenów tokeny przekazuje do parsera

15 Jak działa flex? 15 Skrypt dla flex- a: %{ #include <stdio.h> %} %% begin printf("started\n"); hello printf("hello!\n"); thanks printf( Welcome\n"); end printf("stopped\n"); %% KOMPILACJA i WYKONANIE $ flex examplea.l! $ gcc -o examplea lex.yy.c lfl! $./examplea! begin! Started! hello! Hello!! end! Stopped! thanks! Welcome! hello thanks! Hello!! Welcome!

16 Tokenizacja 16 %{ #include <stdio.h> #include <y.tab.h> %} %% begin return BEGIN; hello return HELLO; thanks return THANKS; end return END; %% Zamiast drukowania (printf(...)) dokonujemy identyfikacji TOKENU i zwracamy jego nazwę. Nazwa ta będzie używana przez program yacc, do opisu gramatyki.

17 Wyrażenia regularne 17 /* sekcja definicji */ %{ #include <stdio.h> %} %% /* sekcja reguł */ [a-z] printf("lowercase_word\n"); [A-Z] printf("uppercase_word\n"); [a-za-z] printf("word\n"); [0-9] printf("integer\n"); [0-9.] printf("float\n"); ";" printf("semicolon\n"); "(" printf( Left_parentheses\n"); ")" printf( Right_parentheses\n"); %%

18 Format reguł flex- a 18 dopasuj tekst z wejścia do wzorców (REGEX) zwracaj typ tokenów (TOKEN_TYPE) Format:! REGEX!{ /* Kod */!!!return TOKEN_TYPE;!!}!!!

19 Reguły flex- a 19 Flex dopasowuje tokeny o największej długości Wejście: abc Reguła: [a- z]+ Token: abc(nie "a" i nie "ab ) Flex używa zasady: pierwsza dobra reguła wejście: jeden Reguła_1: "jeden { printf("hello,"); Reguła_2: [a- za- z]+ { printf ("World!"); } à Wyjście: Hello, (nie World! )

20 Wymiana danych 20 yytext - przechowuje wartość przeczytaną przez lex yyval - jest używana do wymiany wartości między lex a yacc Przykład [0-9] yyval = atoi(yytext); return NUMBER; Tutaj pod yyval została wstawiona wartość otrzymana z konwersji napisu wejściowego, dopasowanego do wyrażenia regularnego, która pierwotnie została zapisana w zmiennej yytext. Prócz tego zwrócony został typ wartości (NUMBER) w ten sposób yacc dowie o typie i może go używać we własnych definicjach.

21 Wymiana danych 21 definicje tokenów metoda podstawowa inne informacje YYSTYPE (lex i yacc: definicje) %{ #define YYSTYPE double %} lex: deklaracje extern YYSTYPE yyval; yacc: deklaracje YYSTYPE yyval;

22 Ogólny skrypt lex- a 22 plik skryptu dla lex- a: /** sekcja definicji **/!...! %%! /** sekcja reguł **/!...! %%! /** Sekcja kodu C kopiowanego dosłownie **/!...

23 calc1.l 23! /* sekcja definicji */! %{! #include <stdlib.h>! #include <stdio.h>! #include "calc1.h"! void yyerror(char*);! extern int yylval;! %}!

24 calc1.l 24! /* sekcja definicji */! %{! #include <stdlib.h>! #include <stdio.h>! #include "calc1.h"! void yyerror(char*);! extern int yylval;! %}! nagłówek calc1.h

25 calc1.l 25! /* sekcja definicji */! %{! #include <stdlib.h>! #include <stdio.h>! #include "calc1.h"! void yyerror(char*);! extern int yylval;! %}! nagłówek funkcji błędów

26 calc1.l 26! /* sekcja definicji */! %{! #include <stdlib.h>! #include <stdio.h>! #include "calc1.h"! void yyerror(char*);! extern int yylval;! %}! zmienna komunikacyjna, zewnętrzna

27 calc1.l 27 /* sekcja reguł */! %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

28 calc1.l 28 /* sekcja reguł */! wyrażenia regularne, wzorce %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

29 calc1.l 29 /* sekcja reguł */! puste znaki %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

30 calc1.l 30 /* sekcja reguł */! cyfry; jedna lub więcej %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

31 calc1.l 31 /* sekcja reguł */! zwracana nazwa tokenu %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

32 calc1.l 32 /* sekcja reguł */! jeden znak; operator %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

33 calc1.l 33 /* sekcja reguł */! kropka oznacza dowolny znak (nie \n) %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

34 calc1.l 34 /* sekcja reguł */! reakcja na kropkę %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

35 calc1.l 35 /* sekcja reguł */! przekazywana zmienna i jej zawartość %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

36 calc1.l 36 /* sekcja reguł */! przekazywany typ tokenu %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

37 calc1.l 37 /* sekcja reguł */! funkcja błędów %%! [ \t]+ ;! [0-9]+ {yylval = atoi(yytext); return INTEGER;}! [-+*/] {return *yytext;}! "(" {return *yytext;}! ")" {return *yytext;}! \n {return *yytext;}!. {char msg[25]; sprintf(msg,"%s <%s>",! "invalid character",yytext); yyerror(msg);}!!

38 38 yacc/bison

39 Jak działa bison? 39 Bison używa skryptu z pliku *.y nazwa.tab.c nazwa.y bison nazwa.parse.c Parser czyta ciąg tokenów i próbuje zidentyfikować struktury gramatyczne zgodnie ze specyfikacją

40 Gramatyka 40 Gramatyka zbiór reguł formalnych dla napisów z danego języka. Reguły opisują zasady tworzenia napisów (tokenów) ze znaków zgodnie z zadaną składnią

41 41 Prosty przykład Leksem Token 3 LICZBA + O_PLUS 2 LICZBA - O_MINUS 1 LICZBA WEJŚCIE: E => E + E E E E * E E / E id Gramatyka

42 42 Prosty przykład Leksem Token 3 LICZBA + O_PLUS 2 LICZBA - O_MINUS 1 LICZBA WEJŚCIE: E => E + E E E E * E E / E id Gramatyka

43 43 Prosty przykład Leksem Token 3 LICZBA + O_PLUS 2 LICZBA - O_MINUS 1 LICZBA Startujemy z lewej strony.widzimy, że mamy id. WEJŚCIE: E => E + E E E E * E E / E id Gramatyka

44 44 Prosty przykład Leksem Token 3 LICZBA + O_PLUS 2 LICZBA - O_MINUS 1 LICZBA id jest wyrażeniem WEJŚCIE: E => E + E E E E * E E / E id Gramatyka

45 45 Prosty przykład Leksem Token 3 LICZBA + O_PLUS 2 LICZBA - O_MINUS 1 LICZBA Parser wie, że 3 jest wyrażeniem. W dalszych próbach oprze się na następnym znaczniku. WEJŚCIE: E => E + E E E E * E E / E id Gramatyka

46 46 Prosty przykład Leksem Token 3 LICZBA + O_PLUS 2 LICZBA - O_MINUS 1 LICZBA Produkcja z plus pasuje bo jest to następny token z wejścia. WEJŚCIE: E => E + E E E E * E E / E id Gramatyka

47 47 Prosty przykład Leksem Token 3 LICZBA + O_PLUS 2 LICZBA - O_MINUS 1 LICZBA Przesuwamy się do następnego tokenu, który jest id, a więc jest wyrażeniem (E) WEJŚCIE: E => E + E E E E * E E / E id Gramatyka

48 48 Prosty przykład Leksem Token 3 LICZBA + O_PLUS 2 LICZBA - O_MINUS 1 LICZBA Wiemy, że E + E to wyrażenie (E). Powtarzamy proces aż do wyczerpania możliwości... WEJŚCIE: E => E + E E E E * E E / E id Gramatyka

49 Gramatyka i format yacc 49 Gramatyka G = {{E, I}, T, P, E} 1. E => I! 2. E => E + E! 3. E => E * E! 4. E => ( E )! 5. I => a! 6. I => b! 7. I => Ia! 8. I = Ib! 9. I = I0! 10. I => I1!! T = {+, *, (, ), a, b, 0, 1} = s. terminalne P = {produkcje: 1-10}, E start Format programu yacc! Exp : Id {...}! Exp + Exp {...}! Exp * Exp {...}! ( Exp ) {...}! ;! Id : a {...}! b {...}! Id a {...}! Id 0 {...}! Id 1 {...}! ;!

50 calc1.y 50!! /* sekcja definicji */! %{! #include <stdlib.h>! #include <stdio.h>! int yylex(void);! #include "calc1.h"! %}! %token INTEGER!

51 calc1.y 51 %% /* sekcja REGUŁ */! program:! line program! line:! expr:! mulex:! term:! line! expr \n { printf("%d\n",$1); }! n! expr + mulex { $$ = $1 + $3; }! expr - mulex { $$ = $1 - $3; }! mulex { $$ = $1; }! mulex * term { $$ = $1 * $3; }! mulex / term { $$ = $1 / $3; }! term { $$ = $1; }! ( expr ) { $$ = $2; }! INTEGER { $$ = $1; }!

52 calc1.y 52 %% /* sekcja REGUŁ */! program:! line program! line:! expr:! mulex:! term:! line! expr \n { printf("%d\n",$1); }! n! expr + mulex { $$ = $1 + $3; }! expr - mulex { $$ = $1 - $3; }! mulex { $$ = $1; }! mulex * term { $$ = $1 * $3; }! mulex / term { $$ = $1 / $3; }! term { $$ = $1; }! ( expr ) { $$ = $2; }! INTEGER { $$ = $1; }! reguły gramatyczne

53 calc1.y 53 %% /* sekcja REGUŁ */! program:! line program! line:! expr:! mulex:! term:! line! expr \n { printf("%d\n",$1); }! n! akcje expr + mulex { $$ = $1 + $3; }! expr - mulex { $$ = $1 - $3; }! mulex { $$ = $1; }! mulex * term { $$ = $1 * $3; }! mulex / term { $$ = $1 / $3; }! term { $$ = $1; }! ( expr ) { $$ = $2; }! INTEGER { $$ = $1; }!

54 calc1.y 54 %% /* sekcja REGUŁ */! program:! line program! line:! expr:! mulex:! term:! line! expr \n { printf("%d\n",$1); }! n! expr + mulex { $$ = $1 + $3; }! expr - mulex { $$ = $1 - $3; }! mulex { $$ = $1; }! mulex * term { $$ = $1 * $3; }! mulex / term { $$ = $1 / $3; }! term { $$ = $1; }! ( expr ) { $$ = $2; }! INTEGER { $$ = $1; }! Kolejność operacji zapewnia kolejność produkcji: najpierw plus/minus co oznacza, że mulex jest realizowane jako pierwsze. Można deklarować łączność działań: %left PLUS MINUS! %right NOT!! etc.

55 calc1.y 55 %% /* sekcja REGUŁ */! program:! line program! line:! expr:! mulex:! term:! line! expr \n { printf("%d\n",$1); }! n! expr + mulex { $$ = $1 + $3; }! expr - mulex { $$ = $1 - $3; }! mulex { $$ = $1; }! mulex * term { $$ = $1 * $3; }! mulex / term { $$ = $1 / $3; }! term { $$ = $1; }! ( expr ) { $$ = $2; }! INTEGER { $$ = $1; }! zwykły wydruk; informacja

56 calc1.y 56 %% /* sekcja REGUŁ */! program:! line program! line:! expr:! mulex:! term:! line! expr \n { printf("%d\n",$1); }! n! $1 $2 $3 expr + mulex { $$ = $1 + $3; }! expr - mulex { $$ = $1 - $3; }! mulex { $$ = $1; }! mulex * term { $$ = $1 * $3; }! mulex / term { $$ = $1 / $3; }! term { $$ = $1; }! ( expr ) { $$ = $2; }! INTEGER { $$ = $1; }! specjalne zmienne przechowujące dopasowane wyrażenia z prawej strony produkcji

57 calc1.y 57 %% /* sekcja REGUŁ */! program:! line program! line:! expr:! mulex:! term:! line! expr \n { printf("%d\n",$1); }! n! expr + mulex { $$ = $1 + $3; }! expr - mulex { $$ = $1 - $3; }! mulex { $$ = $1; }! mulex * term { $$ = $1 * $3; }! mulex / term { $$ = $1 / $3; }! term { $$ = $1; }! ( expr ) { $$ = $2; }! INTEGER { $$ = $1; }! obliczona lewa strona produkcji i umieszczana na stosie

58 calc1.y 58 /* sekcja kodu C */! %%! void yyerror(char *s)! {! fprintf(stderr,"%s\n",s);! return;! }! int main(void)! {! /*yydebug=1;*/! yyparse();! return 0;! }! wywołanie głównej funkcji parsera

59 calc1.y 59 /* sekcja kodu C */! %%! void yyerror(char *s)! {! fprintf(stderr,"%s\n",s);! return;! }! int main(void)! {! /*yydebug=1;*/! yyparse();! return 0;! }! definicja funkcji błędów

60 Praktyka 60 uruchomić yacc/bison na pliku skryptowym z definicjami uruchomić lex/flex na pliku definicji syntaktycznych skompilować żródło wygenerowane przez yacc skompilować plik wygenerowany przez lex/flex skompilować inne potrzebne pliki połączyć wszystkie wynikowe pliki w plik wykonywalny

61 Przykład: poprawianie tekstu 61 lex/flex: Usuwanie zbędnych pustych linii, wielokrotnych spacji, spacji przed znakami przestankowymi takimi jak.,?! itd. /** definicje **/ punct [,.;:!?] text [a- za- Z] %% /** reguły **/ ) +/{punct} {printf( ) );} ) /{text} {printf( ) );} {text}+ +/ ) {while (yytext[yyleng- 1]== ) yyleng- - ; ECHO;} ({punct} {text}+)/ ( {ECHO; printf( );} ( +/{text} {while (yytext[yyleng- 1]== ) yyleng- - ; ECHO;} {text}+" "+/{punct} {while (yytext[yyleng- 1]== ) yyleng- - ; ECHO;} ˆ + ; + {printf( );}. {ECHO;} \n/\n\n ; \n {ECHO;}

62 Kalkulator (flex)[3] 62 %{! #include <stdlib.h>! #include "calc.tab.h"! %}! NUMBER [0-9]+! OP![+-/*]! %%! {NUMBER}!{ yylval.value =!!strtol(yytext, 0, 10); return NUMBER; }! ({OP} \n)!{ return yytext[0]; }!.!!{ ; }!

63 Praktyka - makefile 63 YFLAGS!= -d # header files! PROGRAM = calc! OBJS!= $(PROGRAM).tab.o lex.yy.o # + inne! SRCS CC!= $(PROGRAM).tab.c lex.yy.c # + inne!!= gcc! all: $(PROGRAM)!.c.o: $(SRCS)!!$(CC) -c $*.c -o $@ -O! $(PROGRAM).tab.c: $(PROGRAM).y!!bison $(YFLAGS) $(PROGRAM).y! lex.yy.c: $(PROGRAM).l!!flex $(PROGRAM).l! calc: $(OBJS)!!$(CC) $(OBJS) -o $@ -ll -lm! clean:;!rm -f $(OBJS) core *~ \#* *.o $(PROGRAM) \!!y.* lex.yy.* $(PROGRAM).tab.*!

64 Literatura Lesk, Schmidt. Lex A Lexical Analyzer Generator. 2. Johnson. Yacc Yet another compiler- compiler. 3. T. Niemann. LEX & YACC TUTORIAL (epaperpress.com) 4. M. Landwehr. Flex/bison tutorial. ( hgp:// 5. www/developerworks/aix/tutorials/au_lexyacc 6. Flex/Bison Tutorial. Aaron Myles Landwehr <aron+ta@udel.edu>

65 Pytania i dyskusja 65?

66 66 Dodatki na wszelki wypadek...

67 Kalkulator 67 Zadanie 1. Używając programów lex/flex oraz yacc/bison napisać program prostego kalkulatora z odwróconą notacją polską, z działaniami +,-,*,/. Zadanie 2. Niech T={0, 1, (, ), +, *,!, e} oznacza zbiór symboli terminalnych. Zaprojektować CFG (context free grammar), która generuje wyrażenia regularne nad alfabetem {0,1}. (Patrz: HopcroR, Rozdział 5. G={V, T, P, S}, gdzie V jest zbiorem zmiennych, T oznacza symbole terminalne, P jest zbiorem produkcji, S jest symbolem startowym). Zadanie 3. Rozważyć CFG zdefiniowaną produkcjami: S => asbs bsas ε. Udowodnić, że język L(G) jest zbiorem wszystkich napisów o równej liczbie symboli a i b.

68 calc.l [4] 68 %{ #define YYSTYPE double #include "calc.tab.h" #include <math.h> extern double yylval; %} D [0-9.] %% [ \t] { ; } log return LOG; pi return PIVAL; sin return SIN; cos tan and return COS; return TAN; return AND; not xor or reg ans fix sci eng const return NOT; return XOR; return OR; return REGA; return ANS; return FIX; return SCI; return ENG; return CONST; bintodec return BINTODEC; dectobin return DECTOBIN; {D}+ { sscanf( yytext, "%lf", &yylval ); return NUMBER ; } [a- za- Z_]+ return IDENT; "[" return OPENREG; "]" return CLOSEREG;

69 calc.l [4] cd. 69 "<<"!return LEFTSHIFT;! ">>"!return RIGHTSHIFT;! "++"!return INC;! "--"!return DEC;! "+"!return PLUS;! "-"!return MINUS;! "~"!return UNARYMINUS;! "/"!return DIV;! "*"!return MUL;! "^"!return POW;! "!!return FACT;! ("!return OPENBRACKET;! ")"!return CLOSEBRACKET;! "%"!return MOD;!!! "^^"!return XOR;! "("!return OPENBRACKET;! ")"!return CLOSEBRACKET;! "%"!return MOD;! "^^"!return XOR;! "!!"!return NOT;! "="!return ASSIGN;! "&&"!return LAND;! " "!return OR;! " "!return IOR;! "&"!return AND;! "~~"!return COMPLEMENT;! "\n"!return EOLN;!!

70 Metaznaki wzorców 70 Metaznak Dopasowanie. dowolny znak oprócz nowej \n newline * zero lub więcej kopii poprzedniego wyrażenia + jedna lub więcej kopii poprzedniego wyrażenia? zero lub jedna kopia poprzedniego wyrażenia ^ początek linii $ koniec linii a b a lub b (ab)+ jedna lub więcej kopii ab (grupowanie) "a+b" literał "a+b [] klasa znaków

71 Przykłady regexp i dopasowań 71 Wzorzec Dopasowanie abc abc abc* ab abc abcc abccc... abc+ abc abcc... a(bc)+ abc abcbc abcbcbc... a(bc)? a abc abcbc... [a- z] dowolna litera a, b,...,z [- az] - lub a lub z [a- za- Z0-9]+ jeden lub więcej znaków alfanumerycznych [ \t\n]+ biały znak (odstęp, tabulator, nowa linia) [^ab] wszystko oprócz a, b [a^b] a lub ^ lub b [a b] a lub lub b a b a lub b

72 Redukcja produkcji 72 gramatyka operacje na stosie E => E * E (r2) => E * z (r3) => E + E * z (r1) => E + y * z (r3) => x + y * z (r3) 1. x + y * z shig 2 x. + y * z reduce(r3) 3 E. + y * z shig 4 E +. y * z shig 5 E + y. * z reduce(r3) 6 E + E. * z shig 7 E + E *. z shig 8 E + E * z. reduce(r3) 9 E + E * E. reduce(r2) emit mulhply 10 E + E. reduce(r1) emit add 11 E. accept

73 73 za tydzień...!?

Generatory analizatorów

Generatory analizatorów Generatory analizatorów Generator analizatora leksykalnego flex ( http://www.gnu.org/software/flex/ ) Generator analizatora składniowego bison ( http://www.gnu.org/software/bison/ ) Idea ogólna Opis atomów

Bardziej szczegółowo

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki Analiza leksykalna 1 Teoria kompilacji Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Kod źródłowy (ciąg znaków) Analizator leksykalny SKANER Ciąg symboli leksykalnych (tokenów)

Bardziej szczegółowo

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki Analiza leksykalna 1 Języki formalne i automaty Dr inż. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Kod źródłowy (ciąg znaków) Analizator leksykalny SKANER Ciąg symboli leksykalnych

Bardziej szczegółowo

Zadanie analizy leksykalnej

Zadanie analizy leksykalnej Analiza leksykalna 1 Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Zadanie analizy leksykalnej Przykład: We: COST := ( PRICE + TAX ) * 0.98 Wy: id 1 := ( id 2 + id 3 ) * num 4 Tablica symboli:

Bardziej szczegółowo

Podstawy Kompilatorów

Podstawy Kompilatorów Podstawy Kompilatorów Laboratorium 3 Uwaga: Do wykonania poniższych zadań związanych z implementacją niezbędny jest program LEX oraz kompilator. Dla środowiska Linux mogą to być: Darmowa wersja generatora

Bardziej szczegółowo

Bison - generator analizatorów składniowych

Bison - generator analizatorów składniowych Bison - generator analizatorów składniowych Spis treści: 1. Wprowadzenie 2. Specyfikacja Deklaracje Reguły Procedury pomocnicze 3. Prosty przykład 4. Uruchamianie 5. Rozstrzyganie niejednoznaczności Konflikty

Bardziej szczegółowo

L E X. Generator analizatorów leksykalnych

L E X. Generator analizatorów leksykalnych L E X Generator analizatorów leksykalnych GENERATOR L E X Zadaniem generatora LEX jest wygenerowanie kodu źródłowego analizatora leksykalnego (domyślnie) w języku C; Kod źródłowy generowany jest przez

Bardziej szczegółowo

10. Translacja sterowana składnią i YACC

10. Translacja sterowana składnią i YACC 10. Translacja sterowana składnią i YACC 10.1 Charakterystyka problemu translacja sterowana składnią jest metodą generacji przetworników tekstu języków, których składnię opisano za pomocą gramatyki (bezkontekstowej)

Bardziej szczegółowo

Programy pomocnicze: diff, make, systemy rcs i cvs, debugger. Zarządzanie wersjami.

Programy pomocnicze: diff, make, systemy rcs i cvs, debugger. Zarządzanie wersjami. Programy pomocnicze: diff, make, systemy rcs i cvs, debugger. Zarządzanie wersjami. wer. 8 z drobnymi modyfikacjami Wojciech Myszka 2014-02-09 16:32:37 +0100 Co jest potrzebne programiście? 1. Umiejętność

Bardziej szczegółowo

Podstawy generatora YACC. Bartosz Bogacki.

Podstawy generatora YACC. Bartosz Bogacki. Podstawy generatora YACC Bartosz Bogacki Bartosz.Bogacki@cs.put.poznan.pl Witam Państwa. Wykład, który za chwilę Państwo wysłuchają dotyczy generatora analizatorów składniowych YACC. Zapraszam serdecznie

Bardziej szczegółowo

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ by Kapitol Team Flex a generatory skanerów C++ 2 sposoby wymuszenia stworzenia skanera w C++ flex -+ flexfile.l użycie %option

Bardziej szczegółowo

Flex - generator analizatorów leksykalnych

Flex - generator analizatorów leksykalnych Flex - generator analizatorów leksykalnych Spis treści: 1. Wprowadzenie Wyrażenia regularne Schemat specyfikacji Prosty przykład Uruchomienie Makefile 2. Rozstrzyganie niejednoznaczności 3. Rozpoznawanie

Bardziej szczegółowo

Metody Kompilacji Wykład 13

Metody Kompilacji Wykład 13 Metody Kompilacji Wykład 13 Prosty Translator Translator dla prostych wyrażeń Schemat translacji sterowanej składnią często służy za specyfikację translatora. Schemat na następnym slajdzie zostanie użyty

Bardziej szczegółowo

Podstawy Kompilatorów

Podstawy Kompilatorów Podstawy Kompilatorów Laboratorium 10 Translacja sterowana składnią w generatorze YACC. Zadanie 1: Proszę napisać program, który dla danej liczby całkowitej j oraz niepustego ciągu liczb naturalnych c

Bardziej szczegółowo

Generator skanerów Flex

Generator skanerów Flex Grzegorz Jacek Nalepa 17.7.2000, Kraków, Revision : 1.5 Streszczenie Artykuł prezentuje generator skanerów leksykalnych Flex, będący implementacją standardowego pakietu Lex. Zawarte jest krótkie wprowadzenie

Bardziej szczegółowo

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne

Ćwiczenia nr 11. Translatory. Wprowadzenie teoretyczne J.Nawrocki, M. Antczak, A. Hoffa, S. Wąsik Plik źródłowy: 08cw11-tr.doc; Data: 2009-01-15 09:47:00 Ćwiczenia nr 11 Translatory Wprowadzenie teoretyczne Wiele dokumentów wprowadzających do języków Lex oraz

Bardziej szczegółowo

Analiza leksykalna i generator LEX

Analiza leksykalna i generator LEX Analiza leksykalna i generator LEX Wojciech Complak Wojciech.Complak@cs.put.poznan.pl wprowadzenie generator LEX wyrażenia regularne i niejednoznaczności retrakcja definicje regularne atrybuty lewy kontekst

Bardziej szczegółowo

Podstawy Kompilatorów

Podstawy Kompilatorów Podstawy Kompilatorów Laboratorium 9 Uwaga: Do wykonania poniższych zadań związanych z implementacją niezbędny jest program LEX, program YACC oraz kompilator języka C. Dla środowiska Linux mogą to być:

Bardziej szczegółowo

Laboratorium z użyciem analizatora leksykalnego FLEX

Laboratorium z użyciem analizatora leksykalnego FLEX Laboratorium z użyciem analizatora leksykalnego FLEX Analizator leksykalny FLEX jest narzędziem służącym do tworzenia programów rozpoznających wzorce. FLEX na podstawie pliku wejściowego, za pomocą reguł

Bardziej szczegółowo

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT

Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd. Włodzimierz Bielecki WI ZUT Metody Kompilacji Wykład 8 Analiza Syntaktyczna cd Analiza Syntaktyczna Wstęp Parser dostaje na wejściu ciąg tokenów od analizatora leksykalnego i sprawdza: czy ciąg ten może być generowany przez gramatykę.

Bardziej szczegółowo

Metody Kompilacji Wykład 1 Wstęp

Metody Kompilacji Wykład 1 Wstęp Metody Kompilacji Wykład 1 Wstęp Literatura: Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman: Compilers: Princiles, Techniques, and Tools. Addison-Wesley 1986, ISBN 0-201-10088-6 Literatura: Alfred V. Aho,

Bardziej szczegółowo

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ Narzędzia, zastosowanie oraz próby rankingu.

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ Narzędzia, zastosowanie oraz próby rankingu. Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w C/C++ Narzędzia, zastosowanie oraz próby rankingu. Flex Flex wywodzi się jak cała rodzina tego typu narzędzi od jednego przodka:

Bardziej szczegółowo

KONSTRUKCJA KOMPILATORÓW

KONSTRUKCJA KOMPILATORÓW KONSTRUKCJA KOMPILATORÓW WYKŁAD Robert Plebaniak PLATFORMA PROGRAMOWA LINUX (może nie zawierać LLgen, wówczas instalacja ze strony http://tack.sourceforge.net); WINDOWS (używa się wtedy programu Cygwin,

Bardziej szczegółowo

Metody Kompilacji Wykład 7 Analiza Syntaktyczna

Metody Kompilacji Wykład 7 Analiza Syntaktyczna Metody Kompilacji Wykład 7 Analiza Syntaktyczna Parsowanie Parsowanie jest to proces określenia jak ciąg terminali może być generowany przez gramatykę. Włodzimierz Bielecki WI ZUT 2/57 Parsowanie Dla każdej

Bardziej szczegółowo

Translacja sterowana składnią w generatorze YACC

Translacja sterowana składnią w generatorze YACC Translacja sterowana składnią w generatorze YACC Wojciech Complak Wojciech.Complak@cs.put.poznan.pl 1 Plan wykładu zasady implementacji translacji sterowanej składnią w generatorze YACC korzystanie z atrybutów

Bardziej szczegółowo

Podstawy programowania C. dr. Krystyna Łapin http://www.mif.vu.lt/~moroz/c/

Podstawy programowania C. dr. Krystyna Łapin http://www.mif.vu.lt/~moroz/c/ Podstawy programowania C dr. Krystyna Łapin http://www.mif.vu.lt/~moroz/c/ Tematy Struktura programu w C Typy danych Operacje Instrukcja grupująca Instrukcja przypisania Instrukcja warunkowa Struktura

Bardziej szczegółowo

Semantyka i Weryfikacja Programów - Laboratorium 6

Semantyka i Weryfikacja Programów - Laboratorium 6 Semantyka i Weryfikacja Programów - Laboratorium 6 Analizator leksykalny i składniowy - kalkulator programowalny Cel. Przedstawienie zasad budowy i działania narzędzi do tworzenia kompilatorów języków

Bardziej szczegółowo

Zajęcia P2AM. Analizator składniowy (Flex + Bison, Linux)

Zajęcia P2AM. Analizator składniowy (Flex + Bison, Linux) Zajęcia P2AM. Analizator składniowy (Flex + Bon, Lux) 1. Cel ćwiczeń Celem ćwiczeń jest stworzenie analizatora składniowego dla języka będącego podzbiorem języka wysokiego poziomu (Ada lub Modula2). Przy

Bardziej szczegółowo

Języki formalne i gramatyki

Języki formalne i gramatyki J.Nawrocki, M. Antczak, A. Hoffa, S. Wąsik Plik źródłowy: 08cw10-jfig.doc; Data: 2008-10-22 13:29:00 Ćwiczenie nr 10 Języki formalne i gramatyki Wprowadzenie 1. Napisz analizator leksykalny (LEX) i analizator

Bardziej szczegółowo

Generator YACC: gramatyki niejednoznaczne

Generator YACC: gramatyki niejednoznaczne Plan wykładu Generator YACC: gramatyki niejednoznaczne Wojciech Complak Wojciech.Complak@cs.put.poznan.pl gramatyki jednoznaczne i niejednoznaczne zalety gramatyk niejednoznacznych opisywanie łączności

Bardziej szczegółowo

Generator analizatorów leksykalnych - Lex. Bartosz Bogacki.

Generator analizatorów leksykalnych - Lex. Bartosz Bogacki. Generator analizatorów leksykalnych - Lex Bartosz Bogacki Bartosz.Bogacki@cs.put.poznan.pl Witam Państwa. Wykład, który za chwilę Państwo wysłuchają dotyczy generatora analizatorów leksykalnych LEX. Zapraszam

Bardziej szczegółowo

Program We Kompilator Wy Źródłowy

Program We Kompilator Wy Źródłowy 1. Aho A.V., Ullman J.D. - The Theory of Parsing, Translation and Compiling.1972. 2. Foster J.M. - Automatyczna analiza składniowa. 1976 3. Gries D. - Konstrukcja translatorów dla maszyn cyfrowych, 1984

Bardziej szczegółowo

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania Przemysław Kobylański Wprowadzenie Każdy program w C musi zawierać przynajmniej funkcję o nazwie main(): Aby możliwe

Bardziej szczegółowo

Metody Kompilacji Wykład 3

Metody Kompilacji Wykład 3 Metody Kompilacji Wykład 3 odbywa się poprzez dołączenie zasad(reguł) lub fragmentów kodu do produkcji w gramatyce. Włodzimierz Bielecki WI ZUT 2 Na przykład, dla produkcji expr -> expr 1 + term możemy

Bardziej szczegółowo

automatem skończonym niedeterministycznym (ang. nondeterministic finite automaton) M N nazywamy system:

automatem skończonym niedeterministycznym (ang. nondeterministic finite automaton) M N nazywamy system: 4.3. Automaty skończone (skończenie stanowe) automatem skończonym niedeterministycznym (ang. nondeterministic finite automaton) M N nazywamy system: M N = < Q, Σ, δ, q 0, F > Q Σ skończony zbiór stanów

Bardziej szczegółowo

Języki programowania zasady ich tworzenia

Języki programowania zasady ich tworzenia Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie

Bardziej szczegółowo

Wstęp do Programowania, laboratorium 02

Wstęp do Programowania, laboratorium 02 Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite

Bardziej szczegółowo

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1 Pętle Pętla jest konstrukcją sterującą stosowaną w celu wielokrotnego wykonania tego samego zestawu instrukcji jednokrotne

Bardziej szczegółowo

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p. Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy Laboratorium 1 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Na podstawie: G. Perry, D. Miller, Język C Programowanie dla

Bardziej szczegółowo

Podstawy Kompilatorów

Podstawy Kompilatorów Podstawy Kompilatorów Laboratorium 12 Analiza zależności kontekstowych. Zadanie 1: Proszę napisać analizator zgodności typów dla podzbioru standardowych wyrażeń języka Pascal. Dla uproszczenia należy założyć,

Bardziej szczegółowo

Podstawy Kompilatorów

Podstawy Kompilatorów Podstawy Kompilatorów Laboratorium 1 Celem laboratorium jest zapoznanie się ze środowiskiem i sprawdzenie poprawności działania narzędzi. Nazwy programów i rezultaty będą takie same w systemie operacyjnym

Bardziej szczegółowo

1. Wprowadzanie danych z klawiatury funkcja scanf

1. Wprowadzanie danych z klawiatury funkcja scanf 1. Wprowadzanie danych z klawiatury funkcja scanf Deklaracja int scanf ( const char *format, wskaźnik, wskaźnik,... ) ; Biblioteka Działanie stdio.h Funkcja scanf wczytuje kolejne pola (ciągi znaków),

Bardziej szczegółowo

Generator LLgen. Wojciech Complak Generator LLgen - charakterystyka. Generator LLgen -składnia specyfikacji

Generator LLgen. Wojciech Complak Generator LLgen - charakterystyka. Generator LLgen -składnia specyfikacji Plan wykładu Wojciech Complak Wojciech.Complak@cs.put.poznan.pl charakterystyka generatora LLgen składnia specyfikacji analizatora składniowego dołączanie analizatora leksykalnego rozszerzenia składni

Bardziej szczegółowo

Programowanie Proceduralne

Programowanie Proceduralne Programowanie Proceduralne Makefile Bożena Woźna-Szcześniak bwozna@gmail.com Akademia im. Jana Długosza Wykład 14 Co to jest Makefile Makefile jest plikiem reguł dla programu make. Wykorzystywany jest

Bardziej szczegółowo

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1 Operatory Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1 Przypomnienie: operatory Operator przypisania = przypisanie x = y x y Operatory arytmetyczne

Bardziej szczegółowo

Podstawy Kompilatorów

Podstawy Kompilatorów Podstawy Kompilatorów Laboratorium 6 Generator LLgen. Zadanie 1: Proszę napisać akceptor dla języka a n b m (n, m > 0). Przykłady: aaabb powinniśmy otrzymać wynik: OK aaabba powinniśmy otrzymać komunikat

Bardziej szczegółowo

Wstęp do programowania

Wstęp do programowania Wstęp do programowania wykład 2 Piotr Cybula Wydział Matematyki i Informatyki UŁ 2012/2013 http://www.math.uni.lodz.pl/~cybula Język programowania Każdy język ma swoją składnię: słowa kluczowe instrukcje

Bardziej szczegółowo

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur. Języki i paradygmaty programowania 1 studia stacjonarne 2018/19 Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur. 1. Identyfikator funkcji,

Bardziej szczegółowo

Metody kompilacji Wykłady 4-5

Metody kompilacji Wykłady 4-5 Metody kompilacji Wykłady 4-5 Analiza Leksykalna Wstęp Analizator leksykalny odczytuje znaki z wejścia, rozpoznaje leksemy i produkuje tokeny. Wraz z symbolem terminalnym, który jest używany przez parser,

Bardziej szczegółowo

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik Wykład VII Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik Kompilacja Kompilator C program do tłumaczenia kodu źródłowego na język maszynowy. Preprocesor

Bardziej szczegółowo

Język C zajęcia nr 11. Funkcje

Język C zajęcia nr 11. Funkcje Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji

Bardziej szczegółowo

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p. Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Wskaźnik do pliku Dostęp do pliku: zapis, odczyt,

Bardziej szczegółowo

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście. Typy, operatory, wyrażenia. Wejście i wyjście. Typy, operatory, wyrażenia Zmienna: [] [ '[' ']' ] ['=' ]; Zmienna to fragment pamięci o określonym

Bardziej szczegółowo

JIP. Analiza składni, gramatyki

JIP. Analiza składni, gramatyki JIP Analiza składni, gramatyki Książka o różnych językach i paradygmatach 2 Polecam jako obowiązkową lekturę do przeczytania dla wszystkich prawdziwych programistów! Podsumowanie wykładu 2 3 Analiza leksykalna

Bardziej szczegółowo

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p. Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy Laboratorium 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Komentarze Funkcja printf() Zmienne Łańcuchy

Bardziej szczegółowo

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w Javie

Wybrane narzędzia do tworzenia analizatorów leksykalnych i składniowych w Javie Zwięzły opis narzędzi wraz konkretnymi przykładami, próba porównania i rankingu Do stworzenia parsera nie jest konieczne używanie zewnętrznych narzędzi można posłużyć się algorytmem tworzenia funkcji rekurencyjnych

Bardziej szczegółowo

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk

Plan wykładu. Kompilatory. Literatura. Translatory. Literatura Translatory. Paweł J. Matuszyk Plan wykładu (1) Paweł J. Matuszyk AGH Kraków 1 2 tor leksykalny tor syntaktyczny Generator pośredniego Generator wynikowego Hopcroft J. E., Ullman J. D., Wprowadzenie do teorii automatów, języków i obliczeń,

Bardziej szczegółowo

Gramatyki atrybutywne

Gramatyki atrybutywne Gramatyki atrybutywne, część 1 (gramatyki S-atrybutywne Teoria kompilacji Dr inŝ. Janusz Majewski Katedra Informatyki Gramatyki atrybutywne Do przeprowadzenia poprawnego tłumaczenia, oprócz informacji

Bardziej szczegółowo

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

Analizator syntaktyczny

Analizator syntaktyczny Analizator syntaktyczny program źródłowy analizator leksykalny token daj nast. token analizator syntaktyczny drzewo rozbioru syntaktycznego analizator semantyczny kod pośredni tablica symboli Analizator

Bardziej szczegółowo

Matematyczne Podstawy Informatyki

Matematyczne Podstawy Informatyki Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Stany równoważne Stany p i q są równoważne,

Bardziej szczegółowo

System operacyjny Linux

System operacyjny Linux Paweł Rajba pawel.rajba@continet.pl http://kursy24.eu/ Zawartość modułu 7 Język awk Wprowadzenie Schemat programu Konstrukcja wzorców Konstrukcja wyrażeń regularnych Struktury kontrolne Predefiniowane

Bardziej szczegółowo

Paradygmaty i języki programowania. Analiza leksykalna Skaner, RE, DAS, NAS, ε- NAS

Paradygmaty i języki programowania. Analiza leksykalna Skaner, RE, DAS, NAS, ε- NAS Paradygmaty i języki programowania Analiza leksykalna Skaner, RE, DAS, NAS, - NAS Etapy pracy kompilatora Character stream [Lexical Analyzer] token stream [Syntax Analyzer] syntax tree [SemanFc Analyzer]

Bardziej szczegółowo

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17 Wskaźniki Przemysław Gawroński D-10, p. 234 Wykład 2 8 marca 2019 (Wykład 2) Wskaźniki 8 marca 2019 1 / 17 Outline 1 Wskaźniki 2 Tablice a wskaźniki 3 Dynamiczna alokacja pamięci (Wykład 2) Wskaźniki 8

Bardziej szczegółowo

Zmienne, stałe i operatory

Zmienne, stałe i operatory Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe

Bardziej szczegółowo

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików. Spis treści 1 Krótkie wprowadzenie do makefile'a 1.1 Typowa reguła programu make 1.2 Zmienne w pliku Makefile 1.3 Zmienne standardowe 1.4 Zmienne automatyczne 1.5 Więcej o regułach 1.5.1 Reguły z wzorcem

Bardziej szczegółowo

2 Przygotował: mgr inż. Maciej Lasota

2 Przygotował: mgr inż. Maciej Lasota Laboratorium nr 2 1/7 Język C Instrukcja laboratoryjna Temat: Wprowadzenie do języka C 2 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do języka C. Język C jest językiem programowania ogólnego zastosowania

Bardziej szczegółowo

Podstawy Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja!

Podstawy Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja! Podstawy Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja! Krzysztof Grudzień kgrudzi@kis.p.lodz.pl! Zbigniew Chaniecki zch@kis.p.lodz.pl 1 program zajęć - wykład Podstawowe pojęcia

Bardziej szczegółowo

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą

Bardziej szczegółowo

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 1. Karol Tarnowski A-1 p. Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy Wykład 1 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan wykładów (1) Algorytmy i programy Proste typy danych Rozgałęzienia

Bardziej szczegółowo

1. Wprowadzenie do C/C++

1. Wprowadzenie do C/C++ Podstawy Programowania - Roman Grundkiewicz - 013Z Zaj cia 1 1 rodowisko Dev-C++ 1. Wprowadzenie do C/C++ Uruchomienie ±rodowiska: Start Programs Developments Dev-C++. Nowy projekt: File New Project lub

Bardziej szczegółowo

Wykład 10. Translacja sterowana składnią

Wykład 10. Translacja sterowana składnią Wykład 10 Translacja sterowana składnią Translacja sterowana składnią Z konstrukcjami języków programowania wiąże się pewną informację przez dołączenie atrybutów do symboli gramatyki reprezentujących te

Bardziej szczegółowo

Podstawy programowania w języku C++

Podstawy programowania w języku C++ Podstawy programowania w języku C++ Część siódma Przetwarzanie tablic znaków Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu,

Bardziej szczegółowo

Programowanie w języku C++ Grażyna Koba

Programowanie w języku C++ Grażyna Koba Programowanie w języku C++ Grażyna Koba Kilka definicji: Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i zasad

Bardziej szczegółowo

Funkcja (podprogram) void

Funkcja (podprogram) void Funkcje Co to jest funkcja? Budowa funkcji Deklaracja, definicja i wywołanie funkcji Przykłady funkcji definiowanych przez programistę Przekazywanie argumentów do funkcji Tablica jako argument funkcji

Bardziej szczegółowo

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout) OPERACJE WEJŚCIA / WYJŚCIA Funkcja: printf() biblioteka: wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout) int printf ( tekst_sterujący, argument_1, argument_2,... ) ;

Bardziej szczegółowo

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Temat 1: Podstawowe pojęcia: program, kompilacja, kod Temat 1: Podstawowe pojęcia: program, kompilacja, kod wynikowy. Przykłady najprostszych programów. Definiowanie zmiennych. Typy proste. Operatory: arytmetyczne, przypisania, inkrementacji, dekrementacji,

Bardziej szczegółowo

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p. Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy Wykład 12 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji (1) Obsługa łańcuchów znakowych getchar(), putchar()

Bardziej szczegółowo

Jerzy Nawrocki, Wprowadzenie do informatyki

Jerzy Nawrocki, Wprowadzenie do informatyki Jerzy Nawrocki, Jerzy Nawrocki Wydział Informatyki Politechnika Poznańska jerzy.nawrocki@put.poznan.pl Cel wykładu Programowanie imperatywne i język C Zaprezentować paradygmat programowania imperatywnego

Bardziej szczegółowo

Świat parserów. Krzysztof Leszczyński Polska Grupa Użytkowników Linuxa chris@camk.edu.pl

Świat parserów. Krzysztof Leszczyński Polska Grupa Użytkowników Linuxa chris@camk.edu.pl Świat parserów Krzysztof Leszczyński Polska Grupa Użytkowników Linuxa chris@camk.edu.pl Streszczenie Pisząc oprogramowanie, stykamy się bardzo często z potrzebą analizy języków programowania. Niniejsza

Bardziej szczegółowo

Wyrażenia regularne. Wyrażenia regularne 1/41

Wyrażenia regularne. Wyrażenia regularne 1/41 Wyrażenia regularne Wyrażenia regularne 1/41 Wyrażenia regularne 2/41 Po co wyrażenia regularne? Polecenie: $ grep est tekst.txt Zawartość tekst.txt To jest plik tekstowy. Testujemy narzędzie grep. Trzecia

Bardziej szczegółowo

Języki formalne i techniki translacji

Języki formalne i techniki translacji Języki formalne i techniki translacji Laboratorium - Projekt Termin oddania: ostatnie zajęcia przed 17 stycznia 2016 Wysłanie do wykładowcy: przed 23:59 28 stycznia 2016 Używając BISON-a i FLEX-a napisz

Bardziej szczegółowo

Tablice, funkcje - wprowadzenie

Tablice, funkcje - wprowadzenie Tablice, funkcje - wprowadzenie Przemysław Gawroński D-10, p. 234 Wykład 5 25 marca 2019 (Wykład 5) Tablice, funkcje - wprowadzenie 25 marca 2019 1 / 12 Outline 1 Tablice jednowymiarowe 2 Funkcje (Wykład

Bardziej szczegółowo

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35 Programowanie w C++ Wykład 3 Katarzyna Grzelak 12 marca 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35 Zakres ważności obiektów K.Grzelak (Wykład 1) Programowanie w C++ 2 / 35 Zakres ważności obiektów

Bardziej szczegółowo

Wskaźniki w C. Anna Gogolińska

Wskaźniki w C. Anna Gogolińska Wskaźniki w C Anna Gogolińska Zmienne Zmienną w C można traktować jako obszar w pamięci etykietowany nazwą zmiennej i zawierający jej wartość. Przykład: kod graficznie int a; a a = 3; a 3 Wskaźniki Wskaźnik

Bardziej szczegółowo

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1 Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem

Bardziej szczegółowo

Algorytm. a programowanie -

Algorytm. a programowanie - Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik

Bardziej szczegółowo

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++ Podstawy Informatyki Inżynieria Ciepła, I rok Wykład 10 Kurs C++ Historia Lata 70-te XX w język C (do pisania systemów operacyjnych) "The C programming language" B. Kernighan, D. Ritchie pierwszy standard

Bardziej szczegółowo

Programowanie w języku Python. Grażyna Koba

Programowanie w języku Python. Grażyna Koba Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i

Bardziej szczegółowo

1. Wprowadzenie do C/C++

1. Wprowadzenie do C/C++ Podstawy Programowania :: Roman Grundkiewicz :: 014 Zaj cia 1 1 rodowisko Dev-C++ 1. Wprowadzenie do C/C++ Uruchomienie ±rodowiska: Start Programs Developments Dev-C++. Nowy projekt: File New Project lub

Bardziej szczegółowo

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe Wykład 15 Wprowadzenie do języka na bazie a Literatura Podobieństwa i różnice Literatura B.W.Kernighan, D.M.Ritchie Język ANSI Kompilatory Elementarne różnice Turbo Delphi FP Kylix GNU (gcc) GNU ++ (g++)

Bardziej szczegółowo

Co nie powinno być umieszczane w plikach nagłówkowych:

Co nie powinno być umieszczane w plikach nagłówkowych: Zawartość plików nagłówkowych (*.h) : #include #define ESC 27 dyrektywy dołączenia definicje stałych #define MAX(x,y) ((x)>(y)?(x):(y)) definicje makr int menu(char* tab[], int ilosc); struct

Bardziej szczegółowo

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki Turbo Pascal jest językiem wysokiego poziomu, czyli nie jest rozumiany bezpośrednio dla komputera, ale jednocześnie jest wygodny dla programisty,

Bardziej szczegółowo

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h> Szablon programu: /* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include /* opcjonalne: deklaracja typów o rozmiarze jednego i dwóch

Bardziej szczegółowo

Wykład 5. Jan Pustelnik

Wykład 5. Jan Pustelnik Wykład 5 Jan Pustelnik Konstruowanie parsera Istnieje kilka podstawowych metod konstrukcji parsera bez nawracania Ze względów wydajnościowych parser bez nawracania jest jedynym sensownym rozwiązaniem (prawo

Bardziej szczegółowo

Metodyki i Techniki Programowania 1 1 1. MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

Metodyki i Techniki Programowania 1 1 1. MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA Metodyki i Techniki Programowania 1 1 ZAJ CIA 3. 1. MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA IDE zintegrowane środowisko programistyczne, zawierające kompilator, edytor tekstu i linker,

Bardziej szczegółowo

Języki programowania obiektowego Nieobiektowe elementy języka C++

Języki programowania obiektowego Nieobiektowe elementy języka C++ Języki programowania obiektowego Nieobiektowe elementy języka C++ Roman Simiński roman.siminski@us.edu.pl www.programowanie.siminskionline.pl Przetwarzanie tablic znaków Łańcuchy znakowe jako tablice znaków

Bardziej szczegółowo

Matematyczne Podstawy Informatyki

Matematyczne Podstawy Informatyki Matematyczne Podstawy Informatyki dr inż. Andrzej Grosser Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska Rok akademicki 2013/2014 Gramatyki bezkontekstowe I Gramatyką bezkontekstową

Bardziej szczegółowo

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury, , Programowanie, uzupełnienie notatek: dr Jerzy Białkowski , 1 2 3 4 , Wczytywanie liczb , Wczytywanie liczb 1 #include 2 #include < s t d l i b. h> 3 4 int main ( ) { 5 int rozmiar, numer

Bardziej szczegółowo