Własny język programowania. Część 4: Parser programów

15.07.2010 - Maciej Piróg
TrudnośćTrudność

Część 1.    Część 2.    Część 3.    Część 4.

W czwartej części dopełnimy dzieła i dołożymy ostatnią cegłę brakującą do pełnego interpretera. Nadamy w końcu naszemu językowi kształt, czyli składnię konkretną.

O składni

W poprzedniej części artykułu napisaliśmy interpreter, który uruchamiał programy przechowywane w pamięci w postaci drzew, czyli wewnętrznej reprezentacji w postaci struktur języka C++. Teraz pora wymyślić dla poszczególnych instrukcji jakąś postać tekstową, by programiści mogli w końcu normalnie pisać kod w naszym języku.

Nasz język jest bardzo prosty, więc proponuję bardzo prostą składnię opartą na składni jezyka C. Ponieważ wszystkie operatory w wyrażeniach są infiksowe (to znaczy, że każdy operator, na przykład '+', buduje wyrażenia postaci A + B), a nie ma operatorów prefikoswych (postaci ++A) ani postfikoswych (postaci A++), oraz nie budujemy wyrażeń poprzez konkatenację (czyli nie ma wyrażeń postaci A B, np. foo (x) w języku C), możemy zrezygnować ze średników kończących instrukcje proste i z nawiasów w instrukcjach if i while.

Instrukcje

Instrukcja przypisania będzie mieć postać:

zmienna = wyrażenie

Instrukcje read, write i skip będą mieć postać:

read x
write x
skip

Blok kodu (czyli seria instrukcji złożenia) niech ma postać:

{
  instrukcja_1
  instrukcja_2
  instrukcja_3
}

Instrukcja warunkowa:

if wyrażenie
  instrukcja
else
  instrukcja

Instrukcja pętli:

while wyrażenie
  instrukcja

Oczywiście wszelkie wcięcia i podział na wiersze przedstawiony jest jedynie dla czytelności. Równie dobrze moglibyśmy zapisać instrukcję warunkową jako:

Ciekawostka: W niektórych językach programowania wcięcia mają znaczenie, wydzielając bloki kodu. Takimi językami są np. Python i Haskell.

if wyrażenie instrukcja else instrukcja

Z powyższych reguł wynika, że program, który wypisuje liczby naturalne parzyste mniejsze od 20, mógłby wyglądać następująco:

i = 0
while 20 - i
{
  if i % 2 -1
    write i
  else
    skip
  i = i + 1
}

5
Twoja ocena: Brak Ocena: 5 (1 ocena)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com