[ Pobierz całość w formacie PDF ]
.Można nastÄ™pnie użyć tej wartoÅ›ci wyrażenia w wyÅ›wietlanym komunikacie sygnalizujÄ…cym przypisanie, jeżeli tylko o to zadbamy.Aby takie zadanie wykonać, musimy być pewni, że wszystkie alternatywy w regule opisujÄ…cej to wyrażenie bÄ™dÄ… zwracaÅ‚y wartość liczbowÄ….W naszym przypadku jest to speÅ‚nione.Do oznaczenia zwracanej wartoÅ›ci struktury niezakoÅ„czonej używamy skrótu $$ (bÄ™dzie to w tym konkretnym wypadku expression).Do wartoÅ›ci podwyrażeÅ„ w wyrażeniach zÅ‚ożonych odnosimy siÄ™ tak jak poprzednio — za pomocÄ… skrótów $1 i $3.W tym prostym przykÅ‚adzie dla identyfikatorów zwracana jest wartość zerowa.W peÅ‚nej aplikacji można by wyszukiwać wartość zmiennej w tablicy symboli.Można także przechować wartość elementu e, jeÅ›li stwierdzimy, że ma ona być użyta w instrukcji przypisania.W niektórych przypadkach może być potrzebna wartość struktury niezakoÅ„czonej, której typ nie należy do grupy typów używanych dla elementów.Jako przykÅ‚ad można podać budowÄ™ struktury danych odpowiadajÄ…cej strukturze wejÅ›ciowej, a nastÄ™pnie przetwarzanie otrzymanej struktury jako caÅ‚oÅ›ci (a nie stopniowe budowanie wyniku).Taka sytuacja może wystÄ…pić przy tworzeniu aplikacji kalkulatora.Można tak postÄ…pić, ale należy dodać inny typ do deklaracji %union i zadeklarować, że nasza struktura niezakoÅ„czona bÄ™dzie mieć taki typ.ZakoÅ„czmy nasz przykÅ‚ad rozbioru programu w jÄ™zyku Pascal, tworzÄ…c drzewo skÅ‚adni (wewnÄ™trznÄ… strukturÄ™ danych) i wyÅ›wietlajÄ…c je po odczytaniu peÅ‚nej instrukcji.BÄ™dzie to struktura klasycznego, abstrakcyjnego typu danych, czyli drzewo binarne.StrukturÄ™ takÄ… tworzÄ… wÄ™zÅ‚y.Każdy wÄ™zeÅ‚ jest okreÅ›lonego typu i ma dwa rozgaÅ‚Ä™zienia reprezentujÄ…ce poddrzewa.Kilka pokazanych niżej przykÅ‚adów wyjaÅ›ni to lepiej.Wyrażenie fred - 7 > 34 bÄ™dzie wiÄ™c reprezentowane jako:Instrukcja przypisania bÄ™dzie zawierać wÄ™zeÅ‚ typu t_assign i dwa rozgaÅ‚Ä™zienia.Jedno z nich jest identyfikatorem, a drugie przypisanym wyrażeniem.Instrukcja if-then-else bÄ™dzie siÄ™ skÅ‚adać z dwóch wÄ™złów:Część {else} bÄ™dzie równa NULL, jeżeli w instrukcji nie wystÄ™puje sÅ‚owo else.A oto kod tree.h, definiujÄ…cy interfejs dla naszych funkcji tworzÄ…cych drzewo:/* tree.h - definicje drzewa skÅ‚adni *//* Tree types */typedef enum {t_block, /* Dla bloku instrukcji */t_join, /* Dla instrukcji wewnÄ…trz bloku */t_if, /* Dla instrukcji if */t_else, /* Dla instrukcji zawartych w częściach else */t_assign,/* Dla przypisaÅ„ */t_op, /* Dla wyrażeÅ„ z operatorem */t_num, /* Dla liczb */t_id, /* Dla identyfikatorów */} treetype;typedef struct t {treetype type;int op;union {int numval;char *idval;} value;struct t *left;struct t *right;} tree;tree *mknum(int);tree *mkid(char *);tree *mknode(treetype, int, tree *, tree *);A oto kod tree.c, zawierajÄ…ce funkcje sÅ‚użące do tworzenia wÄ™złów z innych wÄ™złów i symboli koÅ„cowych (takich jak liczby i identyfikatory):/* Definicje funkcji drzewa */#include <stdio.h>#include <stdlib.h>#include "tree.h"tree *mkdir(char *id){tree *t = mknode(t_id, 0, NULL, NULL);t -> value.idval = id;return t;}tree *mknum(int num){tree *t = mknode(t_num, 0, NULL, NULL);t -> value.numval = num;return t;}tree *mknode(treetype, int op, tree *l, tree * r){tree *t = malloc(sizeof(tree));t -> type = type;t -> op = op;t -> left = l;t -> right = r;return t;}print_tree(tree *t){/* BÄ™dzie zdefiniowane później */}Aby skrócić powyższy przykÅ‚ad, pominiÄ™to w nim sprawdzanie bÅ‚Ä™dów i funkcje uwalniania pamiÄ™ci używanej przez struktury wÄ™złów [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • blondiii.htw.pl
  •