구문 오류가없는 언어를 디자인 할 수 있습니까? [닫은]


14

즉, 가능한 모든 문자열이 유효한 구문 인 언어입니까?

편집 : 이것은 이론적 인 질문입니다. 그런 언어
사용 하는 데 관심이 없습니다 . 나는 그것이 가능한지 묻고 있습니다.

추가 편집

그런 언어를 디자인했습니다. ErrorFree 참조


2
그렇게 할 수 있다면 AI를 만들었을 것입니다.
Michael K

5
@ 마이클 : 아니요; 나는 그렇게 생각하지 않습니다.
SLaks

7
!!! !!!

8
질문이 닫히는 것에 강력히 반대합니다! 주관 적이지도 건설적이지 않습니다 !!!
Felix Dombek

1
instruction operand*피연산자가 레지스터 또는 0-127 사이의 숫자 (및 그 위의 모든 것을 레지스터로 취급 됨)와 피연산자 인 경우 정확히 256 명령어, 128 레지스터 및 일반적인 구문 다중 배열 명령어에 대해 '0'이 누락 된 것으로 가정합니다.
Felix Dombek

답변:


8

예, 특정 언어의 모든 단일 문자열에 대해 항상 좋은 최종 상태로 멈추는 결정적 튜링 머신을 만드는 매우 분석적인 방식 으로이 것을 보면 가능할 것입니다. 데모는 매우 간단합니다. 전환이 하나만있는 전환 기능이있는 정규 TM이 있어야합니다.

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

TM은 실제 컴퓨터 한 대와 동일한 컴퓨팅 성능을 가지고 있기 때문에 절대적으로 가능합니다.


1
이것이 평범한 평신도에게 어떤 의미입니까? 'w', 'e', ​​'L', 'q', 'Q', 'Qa', 'Qr', 'F', 'TF'는 무엇입니까? 이러한 정의가 없으면 참조 프레임이 없습니다.
Berin Loritsch

1
죄송하지만이 답변에 대한 Turing Machine의 접근 방식을 쉽게 설명 할 수있는 방법은 없습니다. 이 링크를 확인하면 조금 더 명확 해집니다. en.wikipedia.org/wiki/Turing_machine
guiman

16

예, 물론 가능합니다. 심지어 아주 쉽습니다.

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

나는 아무도 "아니오"라고 말할 수있는 방법을 이해하지 못한다. 즉, 그러한 언어에 의미있는 의미를 정의하는 것이 다소 어려울 수 있지만 가능합니다. 그냥보고 공백 .


언어가 그것을 무시하면 유효한 systax입니까? "tabtabspace"가 유효한 문자열이 아닙니까?
Michael K

1
언어의 의미는 내가 가진 문제 였지만, 철학 / 언어학에 대한 주제를 벗어나지 않으면 서 실제로 논의 할 수는 없다.
StuperUser

2
마이클 : 맞습니다. 모든 것이 구문 상 유효하지만 NOP 일 수 있습니다 (특별한 의미가 없음). 많은 것을 무시하는 언어에는 문제가 없습니다. 이 샘플 프로그램에서 C가 무시하는 모든 것을 살펴보십시오. int main () {3 ;;; / * comment * /}
user281377

많은 사람들이 구문과 의미론을 개념적으로 구분하지 않기 때문에 "아니오"라고 말합니다. "컴파일하지 않습니까? 그렇다면 구문 오류 여야합니다!"
fredoverflow

많은 사람들이이 말에 진정한 의미가 없기 때문에 "아니오"라고 말합니다. 구조를 추가하자마자 (즉, 자체 재귀 구문 분석 규칙 이상) 구문 개념이 있습니다. 구조 위반은 구문으로 인한 오류입니다. 구문 유발 오류는 구문 분석기가 플래그를 지정했는지 여부에 관계없이 구문 오류입니다.
Berin Loritsch

5

유효한 구문의 의미에 따라 다릅니다.

문자열을 허용하지만 특정 의미가 규정되지 않은 언어는 무시하는 언어를 디자인 할 수 있습니다. 이것은 기본적으로 "구문 에러를 제거하지만 에러가 아니라"라고 말하는 것과 같습니다. 여러 가지 이유로 무의미하고 크게 바람직하지 않습니다.

구문 오류가없는 언어를 가질 수있는 유일한 방법은 가능한 모든 문자열에 유효한 명령 / 사용법이있는 것입니다. 내가 볼 수있는 유일한 방법은 모든 작업을 단일 문자로하고 모든 단일 문자에 할당 된 작업이 있는지 확인하는 것입니다.

여기에는 백만 가지 문제가 있습니다. 분명히 예약어가 없으며 문맥에서 사용되는 위치와 결과적으로 기본적으로 읽을 수 없으며 구문 오류의 면역이 다른 모든 종류를 경험할 가능성이 훨씬 큽니다. 오류

따라서 이론적으로 가능하지만 (AmmoQ는 I보다 훨씬 깔끔하게 정리하지만) 완전히 바람직하지 않습니다.


나는 TECO가 그와 같았다는 것을 읽었으며, 각 문자에는 의미가 부여됩니다.
David Thornley

3
머신 코드는 거의 그렇게 작동합니다. 바이트의 모든 가능한 조합이 수행하는 프로그램으로 볼 수있는 뭔가를 이 수행하는 모든 인터럽트를 일으키는 경우에도.
user281377

데이비드, 제가 생각한 것은 TECO입니다. IIRC TECO 입력에 구문 오류가있을 수 있습니다. 그러나 그것은 매우 조밀 한 언어의 어려움을 보여줍니다. 읽기가 매우 어렵고 오류를 이해하기가 어렵습니다.
Omega Centauri

@ user281377 : 6502에는 정의 된 의미가없는 명령이 꽤 있습니다. 일부는 일관성 있고 유용하며 문서화 된 지시 사항과 함께 사용할 수없는 동작을 가지고 있습니다 (내가 가장 좋아하는 것은 "DCP"라는 별명입니다-메모리 주소를 줄이고 결과를 누산기와 비교하고 플래그를 적절하게 설정합니다). 버스 타이밍은 이상하고 기괴한 방식으로, 일부는 재설정이 필요할 정도로 프로세서를 강제로 잠급니다 ( "마스킹 불가능"인터럽트도 도움이되지 않습니다). 후자의 지침은 "구문 오류"로 간주 될 수 있다고 생각합니다.
supercat

5

텍스트 기반이 아닌 프로그래밍 언어의 코드에는 구문 오류가 없을 수 있습니다.

BYOB 과 같은 시각적 언어를 생각하고 있습니다 . "구문"은 그래픽 블록으로 정의되므로 실수로 "if x ten else foo"를 입력 할 수 없습니다.


3

구문의 목적은 코드를 실행하는 것보다 더 빠르고 효과적인 방식으로 유효한 것과 유효하지 않은 것을 구별하는 것입니다. 구문은 최적화 일 뿐이며, 그 의미와 의미로 들어가는 것은 임의적입니다.

일반적으로 당신은 구문을 가능한 한 많이 늘려서 더 많은 시간을 절약하기 위해 반대편을 원하지만 물론 구문을 완전히 생략하고 모든 오류를 의미 론적으로 선언 할 수 있습니다.


0

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

이것이 무엇을 의미합니까?

언어에 구조와 문법이있는 한 항상 구문 오류의 개념이 있습니다. 문제는 당신이 그것을 시행할지 여부입니다. 사람들은 실수를 할 것이고, 문법 오류는 프로그래머가 어리석은 실수를 피하도록 돕기 위해 대부분의 언어 디자이너가 찾는 것입니다.

구문 오류는 언어에 의미가없는 코드를 작성하는 프로그래머가 도입 한 오류입니다.

위의 정의에 따라 구문 오류를 제거하는 것은 불가능합니다. 우리는 모두 철자가 틀린 식별자를, 모두 철자가 틀린 메소드 이름을 가졌습니다. 언어가 자동으로 잘못된 철자를 받아들이고 행복하게 아무것도하지 않는 것은 즐거운 경험에 대한 나의 생각이 아닙니다.

유효한 유니 코드 문자 (또는 문자 순서)를 식별자로 사용할 수있는 언어를 설계 할 수 있습니다. 동등한 문자 / 문자 시퀀스를 표준화하여 동일한 것으로 인식되도록하는 것과 같은 문제가 있지만 가능합니다. 참고 : 4 가지 표준 유형의 유니 코드 정규화가 있습니다.


1
구조의 필요성은 문법을 요구하지 않습니다. 형태소의 다른 문자와의 관계가 아니라 격자에서 문자 (또는 색상)의 위치에 구조가있는 Piet를 고려하십시오.
Mike Samuel

1
구조를 위반하면 어떻게됩니까?
Berin Loritsch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.