Có thể thiết kế một ngôn ngữ không có lỗi cú pháp? [đóng cửa]


14

Nói cách khác, một ngôn ngữ mà mọi chuỗi có thể là cú pháp hợp lệ?

EDIT : Đây là một câu hỏi lý thuyết.
Tôi không có hứng thú sử dụng ngôn ngữ như vậy; Tôi chỉ hỏi liệu nó có thể không.

Chỉnh sửa thêm

Tôi đã đi trước một ngôn ngữ được thiết kế như vậy. Xem ErrorFree


2
Nếu chúng ta có thể làm điều đó, chúng ta đã tạo ra AI.
Michael K

5
@Michael: Không; Tôi không nghĩ vậy.
SLaks

7
!!! Xin lỗi !!!

8
Tôi phản đối mạnh mẽ câu hỏi đang bị đóng cửa! Nó không chủ quan cũng không mang tính xây dựng !!!
Felix Dombek

1
tại sao không sử dụng ngôn ngữ hợp ngữ với: exacly 256 hướng dẫn, 128 thanh ghi và cú pháp chung instruction operand*, trong đó toán hạng có thể là thanh ghi hoặc một số trong khoảng 0-127 (và mọi thứ ở trên được coi là thanh ghi) và nếu là toán hạng bị thiếu đối với một hướng dẫn đa năng, '0' được giả sử.
Felix Dombek

Câu trả lời:


8

Có, nếu bạn xem xét điều này theo một cách rất hậu môn, tạo ra một Máy Turing xác định luôn dừng ở trạng thái cuối cùng tốt cho mỗi chuỗi của một ngôn ngữ nhất định, thì bạn sẽ có thể hủy bỏ điều đó. Việc phá hủy khá đơn giản, bạn phải có một TM thông thường có chức năng chuyển đổi chỉ với một lần chuyển đổi, trông giống như sau:

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

Nó đã được chỉ định rằng một TM có sức mạnh tính toán giống như bất kỳ máy tính thực tế nào, vì vậy điều này là hoàn toàn có thể


1
Điều này có nghĩa là gì đối với chúng ta? 'W', 'e', ​​'L', 'q', 'Q', 'Qa', 'Qr', 'F', 'TF' là gì? Không có bất kỳ trong số này được xác định, tôi không có khung tham chiếu.
Berin Loritsch

1
Xin lỗi nhưng không có cách nào dễ dàng để giải thích cách tiếp cận Turing Machine cho câu trả lời này. Kiểm tra liên kết này để làm rõ một chút: en.wikipedia.org/wiki/Turing_machine
guiman

16

Vâng, tất nhiên là có thể, nó thậm chí còn dễ dàng.

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

Tôi không hiểu làm thế nào bất cứ ai có thể nói "không". Điều đó nói rằng, có thể khá khó để xác định một ngữ nghĩa có ý nghĩa cho một ngôn ngữ như vậy, nhưng điều đó cũng có thể. Chỉ cần nhìn vào khoảng trắng .


Vì vậy, nếu ngôn ngữ bỏ qua nó, đó là systax hợp lệ? và không phải là "tabtabspace" một chuỗi hợp lệ?
Michael K

1
Các ngữ nghĩa của ngôn ngữ là vấn đề của tôi với nó, nhưng thực sự không thể thảo luận về nó mà không đi lạc đề với triết học / ngôn ngữ học.
StuperUser

2
Michael: Chính xác. Mọi thứ đều có giá trị về mặt cú pháp, nhưng nó có thể là NOP (không có ý nghĩa đặc biệt). Không có gì sai với một ngôn ngữ bỏ qua rất nhiều thứ. Chỉ cần nhìn vào tất cả những điều C bỏ qua trong chương trình mẫu này: int main () {3 ;;; / * bình luận * /}
user281377

Nhiều người nói "không" bởi vì họ không có sự phân biệt mang thai giữa cú pháp và ngữ nghĩa. "Nó không biên dịch? Phải là một lỗi cú pháp!"
dòng chảy

Nhiều người nói "không" bởi vì không có ý nghĩa thực sự trong việc này. Ngay khi bạn thêm cấu trúc (tức là nhiều hơn một quy tắc phân tích cú pháp tự đệ quy), bạn có khái niệm cú pháp. Vi phạm cấu trúc là một lỗi cú pháp gây ra. Lỗi do cú pháp gây ra là Lỗi Cú pháp, cho dù trình phân tích cú pháp có đánh dấu nó như vậy hay không.
Berin Loritsch

5

Tôi đoán nó phụ thuộc vào những gì bạn có nghĩa là cú pháp hợp lệ.

Bạn có thể thiết kế một ngôn ngữ chấp nhận bất kỳ chuỗi nào nhưng bỏ qua mọi thứ không được quy định cụ thể. Điều này về cơ bản tương đương với câu nói "Tôi sẽ thoát khỏi lỗi cú pháp nhưng nói rằng chúng không phải là lỗi" - khá vô nghĩa và cực kỳ không mong muốn vì nhiều lý do.

Ngoài ra, cách duy nhất bạn có thể có một ngôn ngữ không có lỗi cú pháp là mọi chuỗi có thể có một hướng dẫn / sử dụng hợp lệ được liên kết với nó. Cách duy nhất tôi có thể thấy để làm điều đó là có tất cả các hoạt động dưới dạng một ký tự và để đảm bảo rằng mọi ký tự đơn đều có một thao tác được gán cho nó.

Có một triệu điều sai với điều này - rõ ràng là không có từ dành riêng, tất cả là về nơi nó được sử dụng trong ngữ cảnh và kết quả là về cơ bản nó sẽ không thể đọc được và, trong khi miễn dịch với các lỗi cú pháp sẽ có nhiều khả năng gặp phải mọi loại khác lỗi

Về mặt lý thuyết là có thể (AmmoQ đặt nó gọn gàng hơn nhiều so với tôi) nhưng hoàn toàn không mong muốn.


Tôi đã đọc rằng TECO là như thế, mỗi nhân vật được gán một ý nghĩa.
David Thornley

3
Mã máy hoạt động khá nhiều theo cách đó. Mọi sự kết hợp có thể của các byte có thể được xem như là một chương trình thực hiện một cái gì đó , ngay cả khi tất cả những gì nó làm là gây ra sự gián đoạn.
dùng281377

David, đó là những gì tôi đã nghĩ, rất thích TECO. Mặc dù đầu vào IIRC TECO có thể chứa lỗi cú pháp. Nhưng nó cho thấy sự khó khăn của một ngôn ngữ dày đặc như vậy - rất khó đọc và dễ mắc lỗi khó hiểu.
Omega Centauri

@ user281377: Trên 6502, có khá nhiều hướng dẫn không có ý nghĩa xác định. Một số có hành vi phù hợp, hữu ích và không có sẵn với bất kỳ hướng dẫn tài liệu nào (sở thích của tôi có biệt danh là "DCP" - giảm địa chỉ bộ nhớ và so sánh kết quả với bộ tích lũy, đặt cờ phù hợp), nhưng một số có hành vi phụ thuộc vào định thời xe buýt theo những cách kỳ lạ và kỳ quái, và một số sẽ khóa bộ xử lý đủ mạnh để yêu cầu thiết lập lại (ngay cả một ngắt "không thể che dấu" sẽ không giúp ích). Tôi nghĩ rằng các hướng dẫn sau có thể được coi là "lỗi cú pháp".
supercat

5

Mã trong ngôn ngữ lập trình không dựa trên văn bản có thể không có lỗi cú pháp.

Tôi đang nghĩ về một ngôn ngữ hình ảnh như BYOB . Bạn không thể vô tình gõ "if x ten other foo" vì "cú pháp" được xác định bởi các khối đồ họa.


3

Mục đích chính của cú pháp là phân biệt giữa hợp lệ và không hợp lệ theo cách nhanh hơn và hiệu quả hơn so với thực thi mã. Cú pháp chỉ là một tối ưu hóa, những gì đi vào nó và những gì đi vào ngữ nghĩa là tùy ý.

Thông thường bạn muốn hoàn toàn ngược lại: làm cho cú pháp kéo dài hết mức có thể để tiết kiệm nhiều thời gian hơn, nhưng tất nhiên bạn có thể bỏ qua cú pháp hoàn toàn và khai báo mọi lỗi là một ngữ nghĩa: bạn sẽ kết thúc với trình thông dịch không mã hóa.


0

Ahbefiasdlk aslerhsofa; f jwi [asdfasdf] một lần nữa / & Q! @ # $} {;-P

Vậy điều đó có ý nghĩa gì?

Miễn là ngôn ngữ có cấu trúc và ngữ pháp, sẽ luôn có khái niệm về lỗi cú pháp. Câu hỏi là liệu bạn có thực thi nó hay không. Mọi người sẽ mắc lỗi và lỗi cú pháp là điều mà hầu hết các nhà thiết kế ngôn ngữ tiếp cận để giúp các lập trình viên tránh những sai lầm ngu ngốc.

Lỗi cú pháp là một lỗi được giới thiệu bởi các lập trình viên viết mã không có ý nghĩa với ngôn ngữ.

Không thể thoát khỏi lỗi cú pháp dựa trên định nghĩa trên. Tất cả chúng ta đều nhận dạng sai chính tả, chúng ta đều có tên phương thức sai. Có ngôn ngữ âm thầm chấp nhận sai chính tả và vui vẻ không làm gì không phải là ý tưởng của tôi về một trải nghiệm thú vị.

Có thể thiết kế một ngôn ngữ có thể sử dụng bất kỳ ký tự unicode hợp lệ (hoặc chuỗi ký tự) nào làm định danh. Có những thách thức, chẳng hạn như bình thường hóa các ký tự / chuỗi ký tự tương đương để chúng được công nhận là cùng một thứ - nhưng điều đó là có thể. LƯU Ý: có bốn loại chuẩn hóa unicode .


1
Sự cần thiết cho cấu trúc không yêu cầu một ngữ pháp. Xem xét Piet nơi cấu trúc nằm ở vị trí của nhân vật (hoặc màu sắc) trong một lưới, chứ không phải mối quan hệ của nó với các nhân vật khác trong một hình thái.
Mike Samuel

1
Vi phạm cấu trúc và điều gì xảy ra?
Berin Loritsch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.