Wprowadźmy do naszego interpretera instrukcję warunkową IF .. THEN .. ELSE. Instrukcja IF sprawdza prawdziwość warunku znajdującego się po niej i w zależności od wyniku wykonuje instrukcje. Jak można zauważyć nasz parser nie posiada jeszcze możliwośći ewaluacji warunków. Czytaj dalej »
Category Archives: interpreter
Zbudujmy interpreter (9) – instrukcja PRINT
Dodajmy do naszego interpretera pierwszą instrukcję – PRINT. Czytaj dalej »
Zbudujmy interpreter (8) – drzewo składniowe
Powoli nadchodzi czas aby rozbudować nasz interpreter o obsługę instrukcji. Zanim jednak to zrobimy wprowadzimy do naszego interpretera drzewo składniowe. Czytaj dalej »
Zbudujmy interpreter (7) – funkcje wbudowane
Skoro dodaliśmy obsługę stałych do naszego interpretera to nic nie stoi na przeszkodzie aby dodać również możliwość korzystania z funkcji wbudowanych (np. trygonometrycznych). Czytaj dalej »
Zbudujmy interpreter (6) – stałe
Dodajmy do naszego interpretera obsługę stałych (np. PI) z których będziemy mogli korzystać podczas wyliczania wyrażeń. W tym celu zmodyfikujmy wprowadzoną ostatnio strukturę:
struct { char *name; symbolEnum type; double val; struct Symbol *next; } Symbol;
Zbudujmy interpreter (5) – zmienne jeszcze raz
Dotychczas nas interpreter obsługiwał zmienne oznaczane w kodzie jedną literą (w sumie mogliśmy wykorzystać 26 zmiennych – od a do z). Dzisiaj dodamy możliwość używania zmiennych, których identyfikator będzie zawierał więcej niż jeden znak. Wykorzystany tu mechanizmy w kolejnych wpisach użyję do wbudowania stałych (np. PI) i funkcji (np. sin() w moim interpreterze) Czytaj dalej »
Zbudujmy interpreter (4) – liczby rzeczywiste
Mój interpreter do tej pory wykonywał jedynie działania na liczbach całkowitych. Dzisiaj przyszedł czas na dodanie obsługi liczb rzeczywistych. Zacznijmy od modyfikacji leksera. Czytaj dalej »
Zbudujmy interpreter (3) – zmienne
W kolejnym kroku budowy interpretera dodam obsługę zmiennych (dla ułatwienia przyjąłem, że zmienne będą oznaczone jedną literą – w sumie możemy wykorzystać 26 zmiennych – od a do z). Chciałbym aby można było przypisywać wartość liczbową do zmiennej oraz wykorzystywać zmienne do obliczeń. Parser i lekser muszę uzupełnić o obsługę wyrażenia:
<zmienna> = <wyrażenie>
Zbudujmy interpreter (2) – kolejny krok
Poprzednio pokazałem jak można zbudować „kadłubek” parsera i leksera z wykorzystaniem narzędzi yacc i flex. W tym wpisie uzupełnię parser (plik parse.y) i lekser (plik scan.l) o interpretacje następujących wyrażeń:
<liczba> * <liczba> <liczba>/<liczba> -<liczba> (<wyrażenie>)
Zbudujmy Interpreter (1) – yacc i flex w akcji
W kolejnych wpisach pokażę jak zbudować własny, prosty interpreter. Na początek zacznę od budowy interpretera, który będzie interpretował wyrażenia:
<liczba> + <liczba> <liczba> - <liczba>
Jako <liczba> będzie można wprowadzić liczbę naturalną. Ilość działań na razie ograniczyłem do dwóch (dodawanie i odejmowanie).
Aby zbudować interpreter będę potrzebował parser oraz lekser. Do budowy parsera wykorzystam narzędzie yacc, a do budowy leksera narzędzie flex. Czytaj dalej »