Jak zdefiniować gramatykę dla języka programowania

Jak zdefiniować gramatykę (bez kontekstu) dla nowego języka programowania (imperatywnego języka programowania), który chcesz zaprojektować od podstaw.

Innymi słowy: jak postępować, gdy chcesz stworzyć nowy język programowania od podstaw.

Author: Book Of Zeus, 2010-02-23

5 answers

Krok po kroku.

No poważnie, zacznij od wyrażeń i operatorów, pracuj w górę do instrukcji, potem do funkcji / klas itp. Zachowaj listę znaków interpunkcyjnych, które są używane do czego.

Równolegle Definiuj składnię odwołującą się do zmiennych, tablic, hashów, liter liczbowych, literałów łańcuchowych, innych wbudowanych literałów. Równolegle zdefiniuj model nazewnictwa danych i reguły zakresów.

Aby sprawdzić, czy Twoja gramatyka ma sens, skoncentruj się na poziomie (literal/zmienna, operator, wyrażenie, instrukcja, funkcja itp.) i upewnij się, że znaki interpunkcyjne i tokeny z innych poziomów przeplatane lub dołączone/poprzedzone nie będą powodować dwuznaczności.

Na koniec zapisz to wszystko w EBNF i uruchom przez ANTLR lub podobne.

Również najlepiej nie odkrywać koła na nowo. Zwykle zaczynam od wyboru sekwencji do bloków i funkcji początkowych i końcowych instrukcji oraz operatorów matematycznych, które są zwykle zasadniczo podobne do C, ECMAScript, Basic, oparte na liście poleceń lub oparte na XML. To bardzo pomaga, ponieważ ludzie są przyzwyczajeni do pracy z tym.

Oczywiście musisz wymyślić dość przekonujący powód, aby nie porzucać pisania nowego języka i po prostu trzymać się C, ECMAScript lub Basic, które są dobrze przetestowane i często używane.

Często zacząłem definiować nowy język tylko po to, aby znaleźć kogoś, kto już zaimplementował funkcję gdzieś w jakimś istniejącym języku.

Jeśli twoim celem jest szybkość rozwoju dla niektórych konkretny projekt, może być lepiej prototypowania w czymś takim jak Python, Lua lub SpiderMonkey, jeśli chcesz dostać się do pracy szybko i chcesz zmniejszyć ilość wpisywania niezbędne w większości skompilowanych języków.

 29
Author: martinr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-23 18:20:57

Będziesz chciał rzucić okiem na EBNF (Rozszerzona forma Backus-Naur ).

(zakładając, że chcesz napisać gramatykę bez kontekstu, czyli.)

 9
Author: Chris Tonkinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-23 17:53:55

Jeśli masz na myśli definiowanie gramatyki, najlepiej byłoby zacząć od istniejącego języka i zmodyfikować jego gramatykę, aby pasowała do tego, czego szukasz. Tworzenie specyfikacji gramatycznej jest dość mechanicznym ćwiczeniem, wykorzystującym zestaw wzorów we własnej głowie. Na przykład, jak wygląda deklaracja if? Czy to wygląda jak C

if <- if(exp) block

if <- if(exp) block else block2

Lub jak ML?

if <- if exp then block else block end

A może chcesz użyć elseifs jak Lua:

if <- if exp then exp end

if <- if exp then exp (elseif exp)* else exp end

Gramatyka i semantyka kodyfikują te decyzje. Zauważ, że żaden z nich nie nadaje się jeszcze do implementacji w generatorze kompilatora LALR lub LL (*) I musi być masowany do implementacji, ponieważ są niejednoznaczne.

Pragmatyka języka programowania autorstwa Michaela Scotta jest dobrym wprowadzeniem do projektowania języków programowania. Jest on dostępny na Amazon tutaj

 2
Author: Joel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-23 18:08:45

Spójrz na Bizon , może właśnie tego szukasz?

 1
Author: tanascius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-23 17:50:46

Zanim zaczniesz je projektować, musisz wiedzieć sporo o językach programowania. Polecam języki programowania: Application and Interpretation by Shriram Krishnamurthi .

 1
Author: David Kanarek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-23 18:06:41