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
1
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ā.
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.
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ī
5
BISON programmas struktūra
deklarācijas
%%
gramatikas likumi
%%
ārējās procedūras
Obligātā daļa
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
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} ;
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
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
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
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
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
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