1 / 13

Sintakses analizētāju ģeneratori

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

leon
Télécharger la présentation

Sintakses analizētāju ģeneratori

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Sintakses analizētāju ģeneratori

  2. Hierarhiskā analīze Kompilatoru kontekstā hierarhisko analīzi sauc par sintaksesanalī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 Analizētāja ģenerētājs BISON Analizētāja izejas teksts valodā C BISON programma Jāveido tieši šajā brīdī Leksikas analizētājsyylex() Analizētājaizpildāmsmodulis Analizētāja izejas teksts valodā C C kompilators Analizētājaizpildāmsmodulis Ievaddati (analizējamais teksts) Izvaddati(analīzes rezultāts)

  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. Praktiskā darbināšana veido .h failu izdrukā stāvokļus bison -d -v mo_piem1.y flex mo_piem1.lex gcc -c mo_piem1_tab.c -o mo_piem1_tab.o gcc -c lex.yy.c -o lex.yy.o gcc -o mo_piem1 lex.yy.o mo_piem1_tab.o

  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. mo_piem1.lex %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);} %%

  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

More Related