Pisanie interpretera poleceń

0

Hi, chciałbym w przyszłości napisać prosty interpreter jakiegoś języka programowania. Teraz jednak chciałbym napisać coś znacznie prostszego - coś na wzór powłoki.

Podstawowym problemem jaki sobie obecnie uświadomiłem jest sposób analizy łańcuchów, które poda użytkownik. Czy mam po prostu analizować łańcuch w taki sposób:

while True:
    s = raw_input('>')
    if s[0:7] == "printf(" and s[len(s)-2:] == ");":
        print s[8:len(s)-3]

Czy może w inny sposób? Jaki?

Pozdrawiam

0

Tu masz amatorski artykuł o tworzeniu języka skryptowego: http://darkcult.nazwa.pl/wiki/images/3/36/Artykul_skrypty.zip
A jeśli myślisz poważniej o tym interpreterze to polecam przeczytać ostatni rozdział książki: http://helion.pl/ksiazki/c-sztuka-programowania-herbert-schildt,cpszpr.htm
(mimo, że na helionie jej nie dostaniesz, sprawdź inne księgarnie)
Dodatkowo sprawdź tę stronę tu też jest o tym materiał: http://informatyka.wroc.pl/node/391
Możesz również przyjrzeć się czemuś gotowemu, akurat Łukasz Czerwiński na swojej stronie opublikował kod własnego interpretera i kompilatora pisanego w C++ - sprawdź: http://www.lukaszczerwinski.pl/projects.html

0

Poczytaj o gramatykach, o drzewach składni, AST i narzędziu ANTLR :)

0

Dodatkowo autor wątku powinien porządnie nauczyć się języka programowania, którym się posługuje. Przytoczony kod to, cóż, przykry widok.

0

Hi, dziękuję za przydatne linki i wskazówki.
Cóż nie tak w tym kodzie?

1

Tniesz str bez potrzeby, niepotrzebnie liczysz jego długość, kiepsko posługujesz się slice'ami.

  • slice'y wspierają indeksowanie ujemne, pozwalające indeksować elementy od końca, tj. s[len(s)-2:] to wolniejsza wersja s[-2:]
  • każdy argument slice'a jest opcjonalny, s[0:7] jest równoważne s[:7]
  • str posiada szybsze i czytelniejsze od cięcia metody startswith i endswith, s[0:7] == "printf(" and s[len(s)-2:] == ");" to mniej czytelna i wolniejsza postać s.startswith('printf(') and s.endswith(');')
  • do naprawdę prostych parserów powinieneś użyć raczej tablicy wyrażeń regularnych lub opartego na generatorach tokenizera, nie drabinki ifów

To takie podstawy, które powinieneś mieć opanowane zanim weźmiesz się za poważniejsze pisanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1