13
1 Sintakses analizētāju ģeneratori

Sintakses analizētāju ģeneratori

  • Upload
    leon

  • View
    25

  • Download
    1

Embed Size (px)

DESCRIPTION

Sintakses analizētāju ģeneratori. Hierarhiskā analīze. Kompilatoru kontekstā hierarhisko analīzi sauc par sintakses analīzi . Angliski – parsing. - PowerPoint PPT Presentation

Citation preview

Page 1: Sintakses analizētāju  ģeneratori

1

Sintakses analizētāju ģeneratori

Page 2: Sintakses analizētāju  ģeneratori

2

Hierarhiskā analīze

Kompilatoru kontekstā hierarhisko analīzi sauc par sintakses analīzi. Angliski – parsing.

Sintakses analīzes procesā notiek vienumu grupēšana gramatiskās frāzēs, ko kompilators tālāk izmantos sintēzes procesā. Parasti izejas programmas gramatiskās frāzes tiek attēlotas koka formā.

Page 3: Sintakses analizētāju  ģeneratori

3

Sintakses analizētāju ģenerators BISON

Pārveido kontekstneatkarīgas LALR(1) gramatikas aprakstu C programmā, kas veic šai gramatikai atbilstošo sintakses analīzi.

Page 4: Sintakses analizētāju  ģeneratori

4

Sintakses analizētāja būve, izmantojot BISON

C kompilators

Analizētājaizpildāmsmodulis

Analizētāja izejas teksts valodā C

Izvaddati(analīzes rezultāts)

Ievaddati (analizējamais teksts)

Leksikas analizētājsyylex()

Analizētājaizpildāmsmodulis

Analizētāja ģenerētājs BISON

Analizētāja izejas teksts valodā C

BISON programma

Jāveido tieši šajā brīdī

Page 5: Sintakses analizētāju  ģeneratori

5

BISON programmas struktūra

deklarācijas

%%

gramatikas likumi

%%

ārējās procedūras

Obligātā daļa

Page 6: Sintakses analizētāju  ģeneratori

6

deklarācijas%%gramatikas likumi%%ārējās procedūras

Satur:• C valodas specifikācijas (starp %{ un %} ), kas jāiekļauj sintakses analizētāja sākumā• Vienumu deklarācijas (%token) %token IDENT NUMBER vienumiem tiks piešķirtas skaitliskas vērtības un tās izmantos lai sazinātos ar leksikas analizētāju. Ja ļoti vajag, skaitlisko vērtību var pats atklāti norādīt.Vienuma nosaukums nedrīkst sakrist ar C atslēgas vārdu. Ar “yy” sākumā arī var būt nepatikšanas.• Informāciju par operatoru prioritāti un asociativitāti• Gramatikas starta simbola aprakstu (%start) %start pirmais_likums

Page 7: Sintakses analizētāju  ģeneratori

7

deklarācijas%%

gramatikas likumi%%ārējās procedūras

Satur:• C valodas deklarācijas un/vai definīcijas (starp %{ un %} )• Gramatiku produkciju aprakstus formā

neterminālis: labā_puse_1 {semantiskā_akcija_1} | labā_puse_2 {semantiskā_akcija_2} … | labā_puse_n {semantiskā_akcija_n} ;

Page 8: Sintakses analizētāju  ģeneratori

8

deklarācijas%%

gramatikas likumi%%ārējās procedūras

Īpaši pseidomainīgie:• $$ ir vērtība, ko atdod gramatikas likums• $1, $2, … ir vērtības, ko atdod gramatikas likumu labās puses attiecīgās daļas

exp : ‘(‘ exp ‘)’ {$$ = $2;} ;Tiek atpazīta izteiksme iekavās un tās vērtība atdota kā izteiksmes vērtība

exp : NUMBER {$$ = $1;} ;Tiek atpazīts skaitlis un tā vērtība (ko saņem no leksikas analizētāja kā yylval) atdota kā izteiksmes vērtība

Page 9: Sintakses analizētāju  ģeneratori

9

bison -d -v mo_piem1.yflex mo_piem1.lexgcc -c mo_piem1_tab.c -o mo_piem1_tab.ogcc -c lex.yy.c -o lex.yy.ogcc -o mo_piem1 lex.yy.o mo_piem1_tab.o

Praktiskā darbināšana

izdrukā stāvokļus

veido .h failu

Page 10: Sintakses analizētāju  ģeneratori

10

%{

#define YYSTYPE double

%}

%token burts_a burts_b

%token beigas nelabs

%start input

%% /* Produkcijas un darbības */

input : /* empty */

| input line

;

line : S beigas { printf ("Der\n"); }

| Kluda beigas {printf ("Neder"); }

;

S : burts_a S { printf ("Satikts a\n"); }

| burts_b S { printf ("Satikts b\n"); }

| /*empty */ { printf ("Tukšums\n"); }

;

Kluda : S nelabs S {}

;

%%

int main () /* The ``Main'' function to make this stand-alone */

{

yyparse ();

}

#include <stdio.h>

yyerror (s) /* Called by yyparse on error */

char *s;

{

printf ("_%s_\n", s);

}

mo_piem1.y

Page 11: Sintakses analizētāju  ģeneratori

11

%option noyywrap

%{

#include "mo_piem1_tab.h"

%}

%%

a { printf("Flex saticis a\n"); return(burts_a);}

b { printf("Flex saticis b\n"); return(burts_b);}

\n { printf("Flex saticis rindas beigas\n"); return(beigas); }

. { printf("Flex saticis simbolu %s\n",yytext); return(nelabs);}

%%

mo_piem1.lex

Page 12: Sintakses analizētāju  ģeneratori

12

Ievads

abbca

Izvads

Flex saticis a

Flex saticis b

Flex saticis b

Flex saticis simbolu c

Tukšums

Satikts b

Satikts b

Satikts a

Flex saticis a

Flex saticis rindas beigas

Tukšums

Satikts a

Neder

Page 13: Sintakses analizētāju  ģeneratori

13

Ievads

abba

Izvads

Flex saticis a

Flex saticis b

Flex saticis b

Flex saticis a

Flex saticis rindas beigas

Tukšums

Satikts a

Satikts b

Satikts b

Satikts a

Der