Drobne programowanie

Kaczuś zaprasza do opowieści o algorytmach, językach programowania i strukturach danych

Na stronie stosowane są pliki cookies. Więcej na podstronie.
odsłon: 1318

Prosty parser

Jak wspomniałem w poprzednim odcinku, że napiszę jeszcze jeden odcinek cyklu na zakończenie. Postanowiłem pokazać na przykładzie jakiegoś prostego programiku, jak wykorzystać niektóre z obiektowych cech przy tworzeniu programu.

Kilkanaście lat temu napisałem krótki artykuł do Magazynu Amiga, w którym pokazałem, jak napisać prosty parser w C++ (Magazyn Amiga 09/1998). Tu zaś pomyślałem, że może przedstawię, jak napisać taki parser w języku C. Dla przypomnienia - będzie to prosty parser wyrażeń matematycznych. Dla uproszczenia nie będziemy brać pod uwagę priorytetów operatorów.

Proponuję gramatykę zdefinować w następujący sposób:
A->Liczba B
B->Operator A|@
gdzie A, B to obiekty, a @ to słowo puste, oznaczające koniec znaków. Parser jest bardzo prosty, nie bierze pod uwagę priorytetów działań, ma zubożoną obsługę błędów (w zasadzie niedokończoną, ale to z rozmysłem, aby móc dać Wam możliwość lepszego zapoznania się z kodem uzupełniając taką obsługę).
Ponieważ kod z założenia nie ma być przeznaczony do modułowej rozbudowy, toteż główną jego część umieściłem w jednym pliku kacparser.c. Interface przeznaczony dla użytkownika jest prosty:
  • funckja parsująca, zwracająca obiekt, którego później będziemy używać
    struct TKacParser *doPreParse(const char *buf);
    
  • funkcja wypisująca jak został zinterpretowany wprowadzony ciąg znaków
    void doPrintInfo(FILE *afout, struct TKacParser *aobj);
    
  • funkcja obliczająca wartość wprowadzonego działania
    double doParserEvalue(struct TKacParser *aobj);
    
  • funkcja zwalniająca zasoby wzięte dla tego by parsować kod
    void FreeParserObject(struct TKacParser *aobj);
    
Jak państwo zauważą, "Liczbę" przyjąłem, że może zostać wprowadzona w 4 wariantach:
  • jako liczba zmiennoprzecinkowa,
  • jako liczba całkowita,
  • jako stała PI,
  • bądź jako stała E.
Stąd odpowiednie klasy. Dodatkowo mamy obiekt wskazujący na wystąpienie błędu.

Program obsługujemy w następujący sposób:
nazwa_programu działanie_do_wykonania

Czasami - w zależności od konsoli, może być konieczność umieszczenia argumentu w cudzysłowie.

I w sumie na tym skończyłbym ten artykuł i ten cykl.
Wynik działania programu przykładowego
Jeśli będziecie mieli jakieś pytania, to proszę o kontakt mailowy, albo skorzystajcie ze strony z formularzem kontaktowym. Gdy będą to ciekawe pytania, które uznam, że warto odpowiedź zamieścić na stronie, to tak uczynię. Zapraszam do czytania innych moich artykułów o programowaniu, zarówno na tej stronie, jak i w innych miejscach.

Pozdrawiam
Kaczuś

2014-03-01 19:39:43


parser język C C programowanie obiektowe