Sözdizimi hatası olmayan bir dil tasarlamak mümkün müdür? [kapalı]


14

Diğer bir deyişle, mümkün olan her dizenin geçerli sözdizimi olduğu bir dil?

EDIT : Bu teorik bir soru. Böyle bir dili kullanmakla
ilgilenmiyorum ; Sadece bunun mümkün olup olmadığını soruyorum.

Daha fazla düzenleme

Böyle bir dili tasarladım. Bkz hatadan muaf


2
Bunu yapabilseydik, yapay zekâ yaratırdık.
Michael K

5
@Michael: Hayır; Ben öyle düşünmüyorum.
SLaks

7
!!! Perl !!!

8
Sorunun kapatılmasına şiddetle karşıyım! Ne öznel ne de yapıcı değil !!!
Felix Dombek

1
neden aşağıdakilerle bir montaj dili almıyorsunuz: tam olarak 256 komut, 128 kayıt ve genel bir sözdizimi instruction operand*, burada bir işlenen bir kayıt olabilir veya 0-127 (ve yukarıdaki bir kayıt olarak kabul edilen her şey) arasında bir sayı olabilir ve bir işlenen çoklu güvenlik talimatı için eksik, '0' olduğu varsayılır.
Felix Dombek

Yanıtlar:


8

Evet, buna çok analitik bir şekilde bakarsanız, belirli bir dilin her bir dizesi için her zaman iyi bir son durumda duran bir Deterministik Turing Makinesi yaratırsanız, mümkün olduğunu göstereceksiniz. Gösterme oldukça basittir, sadece bir geçişe sahip bir geçiş işlevine sahip normal bir TM'ye ihtiyacınız vardır, şuna benzer:

TF(w,q) -> (w,Qa) 

Considerations:
    L = { w | w is any possible string }
    w e L
    q e Q
    F is a set with all good final states {Qa,Qr}
    Qa e F

Bir TM'nin herhangi bir gerçek yaşamdaki bilgisayarla aynı hesaplama gücüne sahip olduğu gösterildi, bu yüzden bu kesinlikle mümkün


1
Bu bizim için ortak katiller için ne anlama geliyor? 'W', 'e', ​​'L', 'q', 'Q', 'Qa', 'Qr', 'F', 'TF' nedir. Tanımlananlardan herhangi biri olmadan referans çerçevem ​​yoktur.
Berin Loritsch

1
Maalesef Turing Machine yaklaşımını bu cevaba açıklamanın kolay bir yolu yok. Biraz açıklığa kavuşturmak için bu bağlantıyı kontrol edin: en.wikipedia.org/wiki/Turing_machine
guiman

16

Evet, elbette mümkün, hatta çok kolay.

<programm> ::= char | char <program> |

Kimsenin nasıl "hayır" diyebileceğini anlamıyorum. Bununla birlikte, böyle bir dil için anlamlı bir semantik tanımlamak oldukça zor olabilir, ancak bu da mümkündür. Sadece boşluğa bak .


Eğer dil onu görmezden gelirse, geçerli bir sistaks mı? ve "tabtabspace" geçerli bir dize değil mi?
Michael K

1
Dilin anlambilimi onunla ilgili sorunumdu, ancak felsefeye / dilbilime uygun bir konuya girmeden onu gerçekten tartışamaz.
StuperUser

2
Michael: Kesinlikle. Her şey sözdizimsel olarak geçerlidir, ancak muhtemelen bir NOP olabilir (özel bir anlamı yoktur). Birçok şeyi görmezden gelen bir dil ile yanlış bir şey yok. Sadece bu örnek programda C'nin göz ardı ettiği her şeye bakın: int main () {3 ;;; / * yorum * /}
user281377

Birçok kişi "hayır" der çünkü sözdizimi ve anlambilim arasında kavramsal bir ayrımları yoktur. "Derleme değil mi? Bir sözdizimi hatası olmalı, o zaman!"
fredoverflow

Birçok insan "hayır" der, çünkü bunun gerçek bir anlamı yoktur. Yapıyı ekler eklemez (yani özyinelemeli bir ayrıştırma kuralından daha fazlası) sözdizimi kavramına sahip olursunuz. Yapının ihlali sözdiziminden kaynaklanan bir hatadır. Sözdizimi kaynaklı hata, ayrıştırıcı bu şekilde işaretlesin ya da işaretlemesin bir sözdizimi hatasıdır.
Berin Loritsch

5

Sanırım geçerli sözdizimi ile ne demek istediğinize bağlı.

Herhangi bir dizeyi kabul eden, ancak belirli bir anlama getirilmeyen herhangi bir şeyi göz ardı eden bir dil tasarlayabilirsiniz. Bu temelde "Sözdizimi hatalarından kurtulacak ama hata olmadığını söyleyeceğim" demeye eşdeğerdir - pek çok nedenden dolayı oldukça anlamsız ve son derece istenmeyen bir durum.

Bunun ötesinde, sözdizimi hatası olmayan bir dile sahip olmanın tek yolu, olası her dizenin kendisiyle ilişkilendirilmiş geçerli bir talimat / kullanıma sahip olması olacaktır. Bunu yapabilmemin tek yolu, tüm işlemlerin tek karakter olması ve her karakterin kendisine atanmış bir işlem olmasını sağlamaktır.

Bununla ilgili bir milyon şey yanlış - açıkçası ayrılmış kelimeler yok, her şey bağlamda nerede kullanıldığı hakkında ve sonuç olarak temelde okunaksız olacak ve sözdizimi hatalarından etkilenmeyen her türlü deneyimi yaşama olasılığı daha yüksek olacak hata.

Bu yüzden teorik olarak mümkün (AmmoQ onu benden çok daha düzgün bir şekilde koyuyor) ama tamamen istenmeyen.


TECO'nun böyle olduğunu okudum, her karaktere bir anlam verilmiştir.
David Thornley

3
Makine kodu hemen hemen bu şekilde çalışıyor. Her olası bayt kombinasyonu, tek yaptığı bir kesintiye neden olsa bile , bir şey yapan bir program olarak görülebilir .
user281377

David, böyle düşünüyordum, TECO gibi. Her ne kadar IIRC TECO girişi sözdizimi hataları içerebilir. Ancak bu kadar yoğun bir dilin zorluğunu gösterir - okunması çok zor ve anlaşılması zor hatalara eğilimlidir.
Omega Centauri

@ user281377: 6502'de, tanımlanmış anlamı olmayan oldukça az sayıda talimat vardır. Bazıları tutarlı, kullanışlı ve belgelenmiş herhangi bir talimatla mevcut olmayan davranışlara sahiptir (favorim "DCP" olarak adlandırılır - bir bellek adresini azaltır ve sonucu akümülatörle karşılaştırır, bayrakları uygun şekilde ayarlar), ancak bazılarının veri yolu zamanlamaları tuhaf ve tuhaf yollarla ve bazıları işlemciyi sıfırlama gerektirecek kadar kilitler ("maskelenemeyen" kesinti bile yardımcı olmaz). İkinci talimatların "sözdizimi hataları" olarak değerlendirilebileceğini düşünüyorum.
supercat

5

Metin tabanlı olmayan bir programlama dilinde kod sözdizimi hatalarına sahip olmayabilir.

BYOB gibi görsel bir dil düşünüyorum . "Sözdizimi" grafiksel bloklar tarafından tanımlandığından, yanlışlıkla "x on else foo" yazarsanız yazamazsınız.


3

Sözdiziminin amacı, kodu yürütmekten daha hızlı ve daha etkili bir şekilde geçerli ve geçerli olmayan arasında ayrım yapmaktır. Sözdizimi sadece bir optimizasyondur, içine giren ve semantiğe giren şey keyfidir.

Genellikle tam tersini yapmak istersiniz: daha fazla zaman kazanmak için sözdizimini mümkün olduğunca uzatmak, ancak elbette sözdizimini tamamen atlayabilir ve her hatayı anlamsal bir şekilde bildirebilirsiniz: tokenleştirici olmayan bir yorumlayıcı ile sonuçlanırsınız.


0

Ahbefiasdlk aslerhsofa; f jwi [ asdfasdf ] yeni / & Q! @ # $} {;-P

Peki bunun anlamı nedir?

Dilin yapısı ve dilbilgisi olduğu sürece, her zaman bir sözdizimi hatası kavramı olacaktır. Soru, onu uygulayıp uygulamadığınızdır. İnsanlar hatalar yapacak ve sözdizimi hataları, programcıların aptal hatalardan kaçınmasına yardımcı olmak için çoğu dil tasarımcısının ulaştığı şeydir.

Sözdizimi hatası, dil için hiçbir anlamı olmayan kod yazan programcılar tarafından sunulan bir hatadır.

Yukarıdaki tanıma dayalı sözdizimi hatalarından kurtulmak imkansızdır. Hepimiz yanlış yazılan tanımlayıcıları, hepimiz yanlış yazılmış yöntem adlarını kullandık. Dilin sessizce yanlış yazmayı kabul etmesi ve mutlu bir şekilde hiçbir şey yapmaması keyifli bir deneyim fikrim değildir.

Tanımlayıcı olarak geçerli herhangi bir unicode karakteri (veya karakter dizisini) kullanabilen bir dil tasarlamak mümkündür. Aynı şey olarak tanınmaları için eşdeğer karakterleri / karakter dizilerini normalleştirme gibi zorluklar vardır - ancak bu mümkündür. NOT: dört standart unicode normalizasyonu vardır .


1
Yapı ihtiyacı bir dilbilgisi gerektirmez. Yapının bir biçimdeki diğer karakterlerle değil, bir ızgaradaki karakterin (veya rengin) konumunda olduğu Piet'i düşünün.
Mike Samuel

1
Yapıyı ihlal eder ve ne olur?
Berin Loritsch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.