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

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

Główna funkcja interpretera

Zadaniem funkcji main jest wczytanie pliku z programem, uruchomienie parsera, a następnie interpretera. Pomijając obsługę błędów:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main(int argc, const char* argv[])
{
  //...
 
  ifstream file;
  file.open(argv[1]);
 
  // ...
 
  string s;
  getline(file, s, (char)EOF);
  file.close();
 
  // ...
 
    Parser parser(s);
    Program* p = parser.parse_Program();
    Memory m;
    p -> eval(m);
 
  // ...
 
  return 0;
}

Wielki test

W końcu możemy napisać pierwszy prawdziwy program w naszym języku. Będzie on wypisywał po kolei wszystkie liczby pierwsze mniejsze od 40

p = 2
 
while 40 - p
{
  pierwsza = 1
  r = 2
  while p - r
  {
    if p % r
      skip
    else
      pierwsza = 0
    r = r + 1
  }
  if pierwsza
    write p
  else
    skip
  p = p + 1
}

Zapisujemy nasz program w pliku, np. pierwsze.txt i uruchamiany. W systemie Linux mogłoby to wyglądać tak:

$ \$ $ g++ interpreter.cpp -o interp
$ \$ $ ./interp pierwsze.txt
2
3
5
7
11
13
17
19
23
29
31
37

Co dalej?

Nasz język jest bardzo prosty, ale można dodać do niego przeróżne konstrukcje znane z innych języków programowania, takie jak inne typy danych, funkcje, struktury i obiekty. Wymaga to oczywiście odpowiednich zmian zarówno w strukturach przechowujących i interpretujących programy, jak i w parserze.

Ponieważ parsery można generować automatycznie z tzw. gramatyk, które opisują składnię konkretną języków, warto dowiedzieć się o nich więcej i nauczyć korzystać z jakiegoś generatora parserów.

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

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com