Pisanie interpretera poleceń

SZ
  • Rejestracja: dni
  • Ostatnio: dni
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:

Kopiuj
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

BB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 16
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

LN
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1398
0

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

  • Rejestracja: dni
  • Ostatnio: dni
0

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

SZ
  • Rejestracja: dni
  • Ostatnio: dni
0

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

  • Rejestracja: dni
  • Ostatnio: dni
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.