Innymi słowy, język, w którym każdy możliwy ciąg znaków jest poprawną składnią?
EDYCJA : To pytanie teoretyczne.
Nie jestem zainteresowany używaniem takiego języka; Pytam tylko, czy to możliwe.
Dalsza edycja
Udało mi się zaprojektować taki język. Zobacz ErrorFree
language-design
syntax
SLaks
źródło
źródło
instruction operand*
, gdzie operand może być rejestrem lub liczbą z przedziału od 0-127 (i wszystko powyżej, co jest traktowane jako rejestr) i jeśli operand brakuje dla instrukcji wielowarstwowej, przyjmuje się „0”.Odpowiedzi:
Tak, jeśli spojrzysz na to w bardzo analityczny sposób, tworząc Deterministyczną Maszynę Turinga, która zawsze zatrzymuje się w dobrym stanie końcowym dla każdego pojedynczego ciągu określonego języka, to możesz zdemoralizować to, co jest możliwe. Demostration jest dość prosty, musisz zwykłą TM z funkcją przejścia z tylko jednym przejściem, które wygląda następująco:
Udowodniono, że TM ma taką samą moc obliczeniową, jak każdy pojedynczy komputer z prawdziwego życia, więc jest to absolutnie możliwe
źródło
Tak, oczywiście, że jest to możliwe, nawet banalnie proste.
Nie rozumiem, jak ktokolwiek może powiedzieć „nie”. To powiedziawszy, może być trudno zdefiniować znaczącą semantię dla takiego języka, ale jest to również możliwe. Spójrz tylko na białe znaki .
źródło
Myślę, że to zależy od tego, co rozumiesz przez prawidłową składnię.
Możesz zaprojektować język, który akceptuje dowolny ciąg, ale ignoruje wszystko, co nie miało określonego znaczenia. Jest to w zasadzie odpowiednik powiedzenia „Pozbędę się błędów składniowych, ale powiedzenie, że nie są błędami” - dość bezcelowe i bardzo niepożądane z wielu powodów.
Poza tym jedynym sposobem, w jaki można mieć język, w którym nie występują błędy składniowe, jest powiązanie z każdym możliwym łańcuchem prawidłowej instrukcji / użycia. Jedyny sposób, w jaki mogę to zrobić, to mieć wszystkie operacje jako pojedyncze znaki i upewnić się, że każda pojedyncza postać ma przypisaną operację.
Jest w tym milion rzeczy nie tak - oczywiście nie ma słów zastrzeżonych, chodzi o to, gdzie jest użyte w kontekście, w wyniku czego byłby w zasadzie nieczytelny i, chociaż odporny na błędy składniowe byłby znacznie bardziej prawdopodobne, aby doświadczyć każdego innego rodzaju błędu.
Tak teoretycznie możliwe (AmmoQ stawia to o wiele bardziej starannie niż ja), ale całkowicie niepożądane.
źródło
Kod w nietekstowym języku programowania może nie zawierać błędów składniowych.
Mam na myśli język wizualny taki jak BYOB . Nie można przypadkowo wpisać „if x dziesięć else foo”, ponieważ „składnia” jest zdefiniowana przez bloki graficzne.
źródło
Głównym celem składni jest rozróżnienie między poprawnym a nieważnym w sposób, który jest szybszy i bardziej efektywny niż wykonywanie kodu. Składnia to tylko optymalizacja, co się w niej dzieje, a co w semantykę jest arbitralne.
Zwykle chcesz czegoś wręcz przeciwnego: aby rozciągnąć składnię tak daleko, jak to możliwe, aby zaoszczędzić więcej czasu, ale oczywiście możesz też całkowicie pominąć składnię i zadeklarować każdy błąd semantyczny: skończysz z interpreterem bez tokenizacji.
źródło
Więc, co to znaczy?
Tak długo, jak język ma strukturę i gramatykę, zawsze istnieje koncepcja błędu składniowego. Pytanie brzmi, czy to egzekwujesz, czy nie. Ludzie popełniają błędy, a błędy składniowe są tym, do czego dąży większość projektantów języków, aby pomóc programistom uniknąć głupich błędów.
Na podstawie powyższej definicji nie można pozbyć się błędów składniowych. Wszyscy źle wpisaliśmy identyfikatory, wszyscy błędnie wprowadziliśmy nazwy metod. Posługiwanie się językiem w ciszy i akceptowanie błędów w pisowni i na szczęście nic nie robienie nie jest moim pomysłem na przyjemne doświadczenie.
Możliwe jest zaprojektowanie języka, który może wykorzystywać dowolny prawidłowy znak Unicode (lub sekwencję znaków) jako identyfikatory. Istnieją wyzwania, takie jak normalizacja równoważnych znaków / sekwencji znaków, aby były one rozpoznawane jako to samo - ale jest to możliwe. UWAGA: istnieją cztery standardowe typy normalizacji Unicode .
źródło