프로그래밍 가능한 언어의 경우 컨텍스트 프리 문법을 기반으로해야합니다.


23

실제로, 시스템 레벨 명령어로 컴파일 / 변환 될 수있는 언어의 경우 문맥이없는 문법이어야합니까?

예 : 모든 프로그래밍 / 스크립팅 언어는 무료 문법입니까? Java는 CFG를 기반으로하지만 실제로 모든 프로그래밍 언어가 CFG를 기반으로하는 경우입니까?

필수 사항은 아니지만 이해에는 차이가 있습니다.

질문에 대한 문맥 : 문법 규칙을 제공하는 Java 언어 사양을보고있었습니다 . 이것은 내가이 질문에 대해 생각하게했습니다.


1
일반적으로 컴파일 문제를 계산할 수 있기를 원하며 CFG 구문 분석이 쉽고 쉽다고 생각합니다. 예를 들어 유효한 perl 프로그램을 인식하는 것은 실제로 계산할 수없는 문제라는 주장을 들었습니다.
Janne H. Korhonen

2
실제로 실제로 필요한 것은 튜링 결정 가능한 구문입니다 (모든 CFG). 당신은 또한 수 있습니다 그 구문 튜링 decidable하지 않는 프로그래밍 언어를 만들지 만, 당신이 할 때 유효한 구문의 여부를 결정하려고하는 동안 컴파일러 오타 a는 멈추지 않을 수 있습니다. 이것은 실제로 유용하지 않다
래칫 괴물

@ratchet, 구문을 반복적으로 열거 할 수 있다고 가정합니까?
David Harris

4
@JanneKorhonen : 구체적으로, Perl은 정적으로 구문 분석 될 수 없습니다 . 즉, 실행되지 않고 구문 분석 될 수 없습니다. 상기 실행이 종료되지 않을 수 있기 때문에, Perl을 정적으로 파싱하면 Halting Problem을 해결할 수 있습니다.
Jon Purdy

@janne 내 말은, 전처리 후 계산이 가능하거나 불가능할 수있는 문제를 수반 할 수있다. 이는 일반적으로 프로그램의 유효성을 검사하는 최종 문법에 컨텍스트가없는 경우이다. 좀 더 구체적으로, 사전 처리 후, 일련의 토큰에 맞는 규칙을 식별하려면 시퀀스를 둘러싼 다른 토큰을 살펴 봐야합니다. 이해가되는지 모르겠습니다. 죄송합니다. 나는 실제로 약간 혼란 스럽다.
sandeepkunkunuru

답변:


20

두 번 아니

첫째, 대부분의 HPL에는 컨텍스트가 없습니다. 이들은 일반적으로 CFG를 기반으로하는 구문을 가지고 있지만 사람들은 정적 의미론 (구문이라는 용어에도 포함됨)이라고하는 것을 가지고 있습니다. 여기에는 올바른 프로그램을 체크 아웃해야하는 이름과 유형이 포함될 수 있습니다. 예를 들어

class A {
  String a = "a";
  int b = a + d;
}

구문 상 올바른 Java 프로그램이지만 d정의 a되지 않았으며 피팅 유형이 없기 때문에 컴파일 되지 않습니다.

둘째, 컨텍스트가없는 언어를 구문 분석 할 수 있습니다 (컴파일러의 존재로 명백히 입증 됨). CFG를 효율적으로 구문 분석 할 수있는 반면 CSG는 일반적으로 분석 할 수 없습니다. 그러나 효율성을 유지하면서 상황에 맞지 않는 특정 기능을 추가 할 수 있습니다.

컴파일러는 종종 첫 번째 토큰 화 (일반), 컨텍스트가없는 구문 분석, 이름 및 유형 분석 (문맥에 따라, 때로는 더 어려워 짐)의 단계로 실행됩니다. 나타나는 오류 메시지 종류에 따라 해당 동작을 관찰 할 수 있습니다.


3
잊지 마세요 public class Program { public static void main(String[] args) { ... } }... Java는 그렇게 쉽게 벗어날 수 없습니다. :-)
Roy Tinker 5

기술적으로 class A { ... }javac실제로 실행할 수없는 항목 (진입 지점이 없음) 을 컴파일 하기 때문에 충분 합니다. 그러나 그렇습니다.
Raphael

20

6
이 : 펄 농담의 뒤통수 때리는 웃긴해야 같은 느낌
수레 쉬 벤 카트

5
Suresh : SIGBOVIK 2011의 "유해 할 수없는 프로그래밍 언어"( sigbovik.org/2011/proceedings.pdf-79 페이지- 82).
Rob Simmons

1
참고 : 펄 인터프리터가이 :) 사용자들에게 편안함을의 경우, 아직 비 결정적 아니다
로이 어설프게

15

파이썬의 문법에 컨텍스트가 없다고 생각하지 않습니다. 동일한 코드 블록의 줄에 같은 들여 쓰기 양이 있어야한다는 것은 컨텍스트 프리 문법이 잘 처리하는 것이 아닙니다.

더 정확하게 말하면, 형태의 파이썬 블록 언어에서 동질성이있는 것으로 보입니다.

조건 인 경우 :
     line1
     line2
     line3
그밖에:
     line4

0n10n10n


4
엄밀히는 맞지만 프로그래밍 언어의 맥락에서 우리는 토큰 화 라는 전처리 단계 후에 발생하는 언어를 컨텍스트없이 작성하려고합니다 . 나는 들여 쓰기가 그 전에 점검된다고 생각합니다.
Diego de Estrada

7
예, 파이썬 어휘 분석기 (토큰 라이저)는 압입 깊이의 스택을 가지고 있습니다. 토큰 스트림에는 각 블록의 시작 부분에 INDENT 기호가 있고 끝에는 DEDENT 기호가있어 컨텍스트없이 구문 분석 할 수 있습니다 (INDENT 및 DEDENT는 C의 중괄호와 매우 유사하게 작동합니다). C는 "알 수없는 경우 선언이나 표현"문제를 가지고있다 foo * bar;선언 foo에 대한 포인터로 bar또는 곱셈 foo시간은 bar?
최대

8
물론, 렉서에서 종종 유한 상태 변환기를 만드는 것보다는 동일한 복잡성을 숨기고 있습니다.
David Eppstein

1
@DavidEppstein : 공평하게 말하면, 복잡성은 결코 큰 것이 아닙니다.
Jon Purdy

1
어휘 분석기에서 INDENT / DEDENT를 처리하는 것 외에도 파이썬은 매우 간단한 LL (1) 문법을 가지고 있습니다.
rmmh dec

13

Bodo Manthey와 Martin Böhme은 모든 C ++ 컴파일러가 반드시 Turing을 완료했음을 보여줍니다. 즉 컴파일 타임에 부분 재귀 함수를 계산할 수 있습니다 . 따라서 상황에 맞는 것보다 훨씬 나쁩니다.

http://wwwhome.math.utwente.nl/~mantheyb/journals/BotEATCS_BoehmeManthey_CompilingCPP.pdf


예, 그러나 컴파일러는 컨텍스트가없는 문법 일뿐입니다. 컴파일러가 아닌 문법 자체에 대해 논의해야합니다.
Jeff Burdges

@ Jeff : 내 대답에 "컴파일 시간"은 "주어진 C + 소스 코드가 올바른지 확인"을 의미합니다. 이 논문의 구성을 약간 수정하면 모든 결정 가능한 언어를 모든 올바른 C ++ 프로그램 세트로 줄일 수 있습니다.
Markus Bläser

7

변수 를 사용하기 전의 선언 과 OOP 언어 의 함수 다형성 은 컨텍스트 프리 문법으로는 처리 할 수없는 프로그래밍 언어 사양의 다른 예 라고 생각합니다 .

int myfun(int a) { ... }
int myfun(int a, int b) { ... }
int myfun(int a, int b, int c, ...) { ... }
...
int I_m_I_cfg = myfun(1,2);
...

좀 Google 검색을했고 나는이 문서 발견 " 부울 문법 간단한 부울 언어에 대한 " A.Okhotin하여을 (2004); 그에 따르면 실제 문제는 공식 문법으로 완전히 설명 된 프로그래밍 언어를 찾는 것입니다 .

완구 절차 적 프로그래밍 언어가 정의되고, 이 언어로 잘 구성된 프로그램 세트에 대한 부울 문법 이 구성됩니다. 이것은 분명히 공식 문법에 의한 프로그래밍 언어의 첫 번째 사양입니다.

이 기사의 소개 섹션은 짧지 만 명확합니다.


6

C의 문법은 기술적으로 컨텍스트가 없다고 생각합니다. 파서는 항상 컨텍스트가없는 기술을 사용하여 Duff의 장치 를 지원 합니다 .

들여 쓰기 기반 언어는 David가 말한 것처럼 자연스럽게 컨텍스트가 없지만 매개 변수화 된 들여 쓰기 토큰에 비해 컨텍스트가 없습니다.

Haskell을 사용하면 연산자 우선 순위를 infix 및 infixl로 변경할 수 있습니다. Perl의 엄격한 pragma 모듈은 어휘 설정 $ ^ H 및 % ^ H를 사용하여 구현되므로 컨텍스트가 없으며 다른 설정도 가능합니다.

TeX와 같은 매크로 확장 언어는 afaik 구문 분석이 실행하지 않으면 의미가 없습니다.

교차점이 문맥이 없지만 여전히 튜링 머신을 설명하는 문맥이없는 문법이 두 개있을 수 있습니다.

Java와 어셈블러는 아마도 자연스럽게 컨텍스트 가 없을 것입니다 .


2
(a)-bC의 상황 이 애매 모호하지 않습니까? ( a변수 또는 typedef 일 수 있습니다-다른 언어에서는 이러한 이유로 단항 빼기 식을 캐스팅 할 수 없습니다)
Random832

매우 지연된 의견에 대해 사과 드리지만 Duff의 기기에는 구문상의 편차가 없습니다. 버팀대가 올바르게 균형을 잡습니다. C에 컨텍스트가 없는지 여부에 대한 논의에서 C 기능이 가장 자주 무시되는 것은 전 처리기입니다. 비공식적이지만 "컨텍스트 프리 (context free)"라는 비공식적 인 해석이있어이를 사용하여 매크로 프로세서, 심지어 잘 동작하는 언어까지 언어를 설명 할 수 있습니다. 그리고 C 전처리 기는 잘 동작합니다.
rici

4

아닙니다. 많은 실용적인 언어는 문맥에 맞지 않습니다. 예를 들어 C ++ 문법은 그렇지 않습니다. 일부 상황에서는 문법이 문맥에 맞지 않는 정보 입력에 의존하기 때문입니다.


4

먼저 프로그래밍 언어의 구문과 언어 자체를 구분하겠습니다.

많은 언어의 구문은 (문법에 기초한 CFG (Context Free Grammar))를 잘 연구하고 있으며 CFG를 효율적으로 구문 분석 할 수있는 알고리즘과 CFG로 해결할 수없는 엣지 케이스를 특수하게 처리 할 수 ​​있기 때문에

그러나 많은 언어는 실제로 컨텍스트가 없습니다 (예 : java, C (++), D와 같이 선언 전 사용 기호가 사용되는 경우).

재미있는 사실 : D에는 Turing-complete 컴파일 타임 함수 평가 및 템플릿 확장 기능이있어 언어 자체를 튜링 결정이 불가능합니다. 그러나 언어를 만든 사람은 구문을 CFG로 만들기 위해 많은 노력을 기울였습니다.


이름 및 유형 분석은 일반적으로 컨텍스트가없는 작업을 수행합니다.
Raphael

C ++에서 템플릿 메타 프로그래밍이 완료되었습니다.
Jeff Burdges

3

"모든 프로그래밍 / 스크립팅 언어는 자유 문법입니까?" 문제는 정답입니다.

Re : "결국 시스템 레벨 명령어로 컴파일 / 변환 될 수있는 언어"에 대한 주요 질문은 왜 이것이 반드시 CFG 여야하는지 모르겠습니다. 그러나 더 나은 설명이 나올 수 있습니다.


1
Kris, 문맥이없는 문법 기반 프로그래밍 언어의 예를 들어 줄 수 있습니까? 전처리 후 계산이 가능하거나 불가능한 문제를 수반 할 수있는 후 처리, 프로그램에 대한 최종 문법.
sandeepkunkunuru

3

프로그래밍 언어는 어떤 종류의 문법 형식을 기반으로해야하며 그 중 CFG가 그 예입니다. 기가 사용될 수는 가장 일반적인 (그리고 univiersities에서 컴파일러 과정에서 배운 보통의 것입니다)하지만, 같은 더 많은 약 읽을 수있는 구문 분석 식 문법, 다른 형식주의가 여기 (PDF) 또는 위키 백과에 더 물린 크기의 읽기는.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.