Własny język programowania. Część 2: Parser + wyrażenia = kalkulator
11.07.2010 - Maciej Piróg
KonstruktorPonieważ ustawiamy wskaźnik za ostatnim znakiem danego "poziomu", warto, by wskaźnik zawsze na coś pokazywał. Dlatego dodamy na sam koniec analizowanego tekstu tzw. strażnika, który będzie znakiem (a więc zawsze będzie można odczytać kolejny znak), ale nie będzie rozpoznawany jako żaden operator, liczba ani nazwa zmiennej. Strażnik nazywa się EOS (ang. end of string). Konstruktor parsera bierze jako argument tekst do analizy, dodaje na jego końcu strażnika i ustawia wskaźnik na sam początek tekstu:
Pomijanie białych znakówPonieważ wyrażenie może zawierać białe znaki, warto mieć metodę, która przesunie wskaźnik na pierwszy element za ciągiem białych znaków, tak jak pokazuje poniższy obrazek (kolor zielony na obrazkach pokazuje "obszar zainteresowań" danej metody):
Implementacja samej metody jest bardzo prosta:
Oglądanie znaku pokazywanego przez wskaźnikCzęsto będziemy chcieli obejrzeć znak, który pokazywany jest przez wskaźnik. Będziemy to robić, żeby zobaczyć jaki jest następny interesujący znak, a że białe znaki nie są zbyt interesujące, warto połączyć podglądanie znaku z pomijaniem ich:
Parsowanie wyrażeńPonieważ wyrażenie jest "sumą", by sparsować wyrażenie, wystarczy sparsować sumę, a następnie sprawdzić czy kolejnym znakiem (oczywiście z pominięciem białych znaków) jest koniec tekstu. Pamiętajmy, że po sparsowaniu "sumy", wskaźnik pokazuje na pierwszy znak za "sumą":
Parsowanie "sum"Metoda parsowania "sum" interesuje się kolejnymi składnikami oddzielonymi operatorami '+' i '-':
Kod metody parsowania "sum" jest prosty. Najpierw parsujemy pierwszy składnik (każda "suma" ma przynajmniej jeden), a potem patrzymy na znak za składnikiem. Jeśli jest to '+' lub '-', to znaczy, że w "sumie" jest kolejny składnik. Jeśli nie, to kończymy:
Wiersz Parsowanie składnikówSkładnik to czynniki połączone znakami '*', '/' i '%':
Parsowanie czynników jest bardzo podobne do parsowania "sum":
(1 ocena) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com