CFG (context-free grammar)가 무엇인지 설명하려고하는 자료의 양을 감안할 때, 나는 그 문법이 왜 "문맥- 비어 있는". 그리고 내 마음에, 아무도 그렇게하지 못했습니다.
제 질문은 왜 문맥이없는 문법이 문맥이없는 것입니까? "컨텍스트"란 무엇입니까? 컨텍스트가 현재 분석 된 구문을 둘러싼 다른 언어 구문 일 수 있다는 직관이 있었지만 실제로는 그렇지 않습니다. 누구나 정확한 설명을 제공 할 수 있습니까?
CFG (context-free grammar)가 무엇인지 설명하려고하는 자료의 양을 감안할 때, 나는 그 문법이 왜 "문맥- 비어 있는". 그리고 내 마음에, 아무도 그렇게하지 못했습니다.
제 질문은 왜 문맥이없는 문법이 문맥이없는 것입니까? "컨텍스트"란 무엇입니까? 컨텍스트가 현재 분석 된 구문을 둘러싼 다른 언어 구문 일 수 있다는 직관이 있었지만 실제로는 그렇지 않습니다. 누구나 정확한 설명을 제공 할 수 있습니까?
답변:
그것은 모든 생산 규칙 이 왼쪽에 단일 비 터미널 이 있음을 의미합니다 .
예를 들어 일치하는 괄호 ( "()", "() ()", "(()) ()", ...)의 문자열을 인식하는 이 문법 에는 컨텍스트가 없습니다.
S → SS
S → (S)
S → ()
모든 규칙의 왼쪽은 단일 비 단말기로 구성됩니다 (이 경우 항상 S
이지만 더 많을 수 있음).
이제 {a ^ nb ^ nc ^ n : n> = 1} 형식의 문자열을 인식하는 다른 문법 을 고려 하십시오 (예 : "abc", "aabbcc", "aaabbbccc").
S → abc
S → aSBc
cB → WB
WB → WX
WX → BX
BX → Bc
bB → bb
비 터미널 B
앞에 터미널 / 리터럴 문자 c
가 있으면 해당 용어를 다시 WB
쓰지만 앞에 오는 경우 대신 b
확장 bb
됩니다. 이것은 아마도 문맥에 민감한 문법의 문맥 감도가 암시하는 것입니다.
문맥이없는 언어는 푸시 다운 오토 마톤 으로 인식 될 수 있습니다 . 유한 상태 머신은 보조 스토리지를 사용하지 않는 반면, 결정은 현재 상태 및 입력만을 기반으로하는 반면, 푸시 다운 오토 마톤은 스택을 처리하고 스택 상단을 통해 결정을 내릴 수 있습니다.
실제로는 중첩 된 괄호를 왼쪽에서 오른쪽으로 이동하고 스택이 발생할 때마다 왼쪽 괄호를 스택에 밀어 넣고 오른쪽 괄호가 나타날 때마다 터지는 방식으로 구문을 분석 할 수 있습니다. 빈 스택에서 팝을 시도하지 않고 문자열 끝에 스택이 비어 있으면 문자열이 유효합니다.
상황에 맞는 언어의 경우 PDA로는 충분하지 않습니다. 사용 가능한 테이프의 양이 입력에 비례하지만 테이프가 무제한이 아닌 튜링 기계와 같은 선형 경계 자동 기계 가 필요합니다 . 컴퓨터를 잘 묘사한다는 점에 유의하십시오. 우리는 컴퓨터를 튜링 머신이라고 생각하지만 실제로는 RAM 미드 프로그램을 임의로 더 많이 잡을 수 없습니다. LBA가 PDA보다 강력하다는 것이 확실하지 않은 경우 LBA는 테이프의 일부를 스택으로 사용하여 PDA를 에뮬레이션 할 수 있지만 다른 방법으로 테이프를 사용하도록 선택할 수도 있습니다.
(Finite State Machine이 무엇을 인식 할 수 있는지 궁금하다면 대답은 정규식입니다. 그러나 프로그램 그룹에서 볼 수있는 캡처 그룹과 룩 앤비 / 룩-헤드가있는 스테로이드의 정규식은 아닙니다. 같은 연산자 [abc]
, |
, *
, +
,와 ?
. 당신은 볼 수 abbbz
정규식과 일치 ab*z
그냥 아무 스택이 필요하지 문자열과 정규 표현식에있는 당신의 현재 위치를 유지하여.)
정확하고 정확하더라도 다른 답변은 상당히 길다. 이것은 짧은 버전입니다.
문자열 (터미널 및 비 터미널)이 있고 문자열에서 비 터미널을 바꾸려는 경우 컨텍스트없는 문법을 사용하면 비 터미널을 둘러싼 문자에 관계없이이를 수행 할 수 있습니다.
다음 규칙을 고려하십시오 (소문자는 터미널이고 대문자는 터미널이 아닙니다).
A -> a
AB -> a
첫 번째 규칙에서는 A
주변에 나타나는 내용 (문맥)에 관계없이 바꿀 수 있습니다 . 두 번째 규칙에서는 뒤에을 붙이지 A
않으면 바꿀 수 없습니다 B
. 이 경우 두 비 터미널이 교체되지만 중요한 점은 A
문제를 둘러싼 비 터미널이 있다는 것 입니다. 하나는 대체 할 수 BA
와 함께 a
, 또는 B
함께 a
: 만 A
다음 B
순서 때문에 상황 비끝의이 중요하다. 이는 두 번째 규칙에서 비 터미널 문제의 컨텍스트를 의미하므로 상황에 따라 달라지며 첫 번째 규칙에는 컨텍스트가 없습니다.
a
에서 AB
하지 않는 한 A
뒤에 B
당신이 대체 할 수 대신 말하는" A
실제로 당신이 대체하고 있기 때문에 가능하지 않을 수도있는 " AB
아니다 그것은?
A
또는 AB
두 번째 규칙 (문맥에 따라 다름)을 의미 합니까? 나는 당신이 A
당신의 대답에서 말한 것처럼 여전히 대체 를 시도하고 있다고 생각합니다 .
구별과 용어를 더 잘 이해하려면, n b n 과 같은 문맥없는 언어와 n b n c n 과 같은 문맥 인식 언어를 대조하는 것이 좋습니다 . (표기 A, B, C는 여기 리터이며 지수 n을 문자 그대로 반복하는 수단 N 개의 회, n은 0>라고한다.) 예를 들어, aabbc
또는 aabbbcc
반면, 후자의 언어가 아닌 aabbcc
것이다.
맥락없는 언어에 대한 수용체는 n 개의 B의 N은 한 쌍의 계약 수 a
와 b
관계없이 (즉,에 관계없이 AB가 표시되는 상황의) 주위 무엇과 언어 만 문자열을 받아들이고 무엇을 거부 올바르게 작동합니다 즉 문법은 S -> aSb | ab
입니다. 프로덕션 왼쪽에는 터미널 이 없습니다 . (두 가지 프로덕션 규칙이 있지만 간단히 작성하고 있습니다.) 수락자는 기본적으로 컨텍스트가없는 로컬 결정을 내릴 수 있습니다.
대조적으로, 문맥 인식 언어 a n b n c n에 대해 이와 같은 것을 수행 할 수 없습니다. 후자의 경우 문맥을 어떻게 든 기억해야합니다. 즉, 수축과 일치시키기 위해 얼마나 많은 ab 수축을해야합니까? 기원전. 후자의 언어에 대한 문법은
S -> abc | aBSc
Ba -> aB
Bb -> bb
마지막 두 규칙에서 왼쪽에 터미널과 비 터미널이 모두 있습니다. 왼쪽의 터미널은 비 터미널을 확장 할 수있는 컨텍스트입니다.
"계약"과 "확장"용어 등에 관한 부트 노트 : 공식적인 문법은 [공식적으로] 생성되지만, 실제로 구문 분석기에서 구현되는 방식은 실제로는 축소 적입니다. 즉, 기본적으로 모든 것을 비 터미널에 접촉합니다 "역순으로"규칙을 적용하기 때문에, 위에서 주어진 첫 번째 문법조차도 프로그램에서 실용적이지 않습니다 (어떤 규칙을 적용할지 결정할 수 없기 때문에 유명한 교대 감소 갈등을 줄 것입니다). 문맥이없는 것과 문맥에 따른 구별을 설명하기에 충분합니다. 문맥없는 문법의 모호성 문제는 다소 복잡하며 실제로이 질문의 주제는 아니므로 특히 Wikipedia에 적절한 기사가 있음을 알기 때문에 여기서 더 이상 말하지 않겠습니다.. 반대로 문맥이없는 기사와 특히 문맥에 민감한 언어의 기사는! @ # $ @! # $입니다. 특히 주제에 익숙하지 않은 경우 ... TODO 목록에 더 많은 것 같습니다.
위의 답변은 그것이 무엇인지에 대한 아주 좋은 정의를 제공합니다. 내가 직접 말로 표현할 수 있는지 살펴보면 20 대신 23 개의 설명이 필요합니다. 문법의 모든 목적은 특정 문장이 주어진 언어로 된 문장인지 알아내는 것입니다. 그러나 문법과 파싱을 실제로 사용하는 것은 문장의 의미를 알아내는 것입니다. 그것은 당신이 학교에서 영어 수업을 다시하거나하지 않은 문장의 오래된 다이어그램과 같습니다. 문장은 주제 부분과 술어 부분으로 구성되며, 주제 부분에는 명사와 어쩌면 일부 형용사가 있고, 술어 부분에는 동사와 어휘 명사가 있으며, 더 많은 형용사 등이 있습니다.
영어 문법이 있고 (컴퓨터 과학적 의미가 없다고 생각하지 않는 경우), 프로덕션이라는 다음 형식의 규칙을 갖게됩니다.
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
기타...
그런 다음 프로그램을 작성하고 문장을 전달할 수 있으며 프로그램은 문법을 사용하여 각 단어의 문장 부분과 서로 어떤 관계가 있는지 알아낼 수 있습니다.
모든 프로덕션에서 왼쪽에 한 가지만 있으면 문장에서 오른쪽을 볼 때마다 왼쪽을 대체 할 수 있습니다. 예를 들어 형용사 명사를 볼 때마다 해당 문구 이외의 내용에주의를 기울이지 않고 "That 's a SubjectPart"라고 말할 수 있습니다.
그러나 영어 (위의 영어에 대한 간단한 설명조차도)는 상황에 따라 다릅니다. "형용사 명사"가 항상 SubjectPart 인 것은 아니며 PredicatePart의 명사구가 될 수 있습니다. 상황에 따라 다릅니다. 의사 영어 문법을 조금 확장 해 봅시다 :
Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun
VerbPhrase 바로 다음에 나오는 경우에만 ObjectNounPhrase에 "형용사 명사"를 작성할 수 있습니다.
기본적으로 프로덕션이 있고 원하는 경우 언제든지 적용 할 수 있으면 컨텍스트가 없습니다.
문법에 컨텍스트가 없는지 언제든지 알 수 있습니다. 화살표 왼쪽에 둘 이상의 기호가 있는지 확인하십시오.
모든 언어는 하나 이상의 문법으로 설명 될 수 있습니다. 언어에 대한 일부 문법에 컨텍스트가없는 경우 언어에 컨텍스트가 없습니다. 문맥에 맞지 않는 문법이 없다는 것이 일부 언어에서 입증 될 수 있습니다. 위에서 설명한 단순화 된 의사 영어 하위 집합에 대한 컨텍스트가없는 문법이 있다고 가정합니다.
중요한 이유는 문맥이없는 문법을 파싱하려면 더 간단한 종류의 프로그램이 필요합니다. 다른 답변에서 언급했듯이 상황에 맞지 않는 문법을 파싱하기 위해 튜링 머신의 모든 기능이 필요하지 않습니다. 특정 컨텍스트 프리 문법에 대한 lookahead LR (1) 파서 (푸시 다운 기계의 일종)는 문장의 길이에 선형으로 시간과 공간에서 해당 문법의 문장을 구문 분석 할 수 있습니다. 문장이 언어로되어 있으면 파서는 문장의 각 기호가 의미하는 바 (또는 구조에서 어떤 부분을 담당하는지)를 식별하는 구조 트리를 생성합니다. 문장이 문법에 없으면 구문 분석기는 문법과 선행 기호와 일치 할 수없는 첫 번째 기호 (첫 번째 "오류")를 인식하고 중지합니다.
더 좋은 점은 문법에 대한 설명을 제공 할 수있는 프로그램과 각 파트로 수행 할 작업에 대한 지침 목록 (각 프로덕션에 "의미"를 첨부하는 의미)이 있고 프로그램이 파서를 작성한다는 것입니다. 당신을 위해. 프로그램은 문장을 구문 분석하고 구조를 찾은 다음 구조의 각 부분에 대한 지침을 실행합니다. 이러한 종류의 프로그램을 파서 생성기 또는 컴파일러 컴파일러라고합니다.
이러한 종류의 언어 분석은 영어와 같은 자연어 자동 분석을 위해 고안되었지만 컴퓨터 언어를 분석하는 데 가장 유용합니다. 언어 디자이너는 새 언어를 캡처하는 문법을 작성한 다음 파서 생성기를 통해 언어를 구문 분석하고 원하는 경우 번역, 해석, 컴파일, 실행 등을 수행하는 프로그램을 작성할 수 있습니다.
실제로 대부분의 경우 실제로이 작업을 수행 할 수 없습니다. 예를 들어, 균형 괄호는 문맥이없는 언어이지만 사용하기 전에 모든 변수를 선언해야하는 언어는 문맥에 따라 다릅니다. 파서는 컴파일러의 일부이지만 이러한 다른 요구 사항을 적용하려면 추가 논리가 필요합니다. 그런 다음 가능한 많은 언어를 캡처하는 문법을 작성하고 파서 생성기를 통해 실행 한 다음 나머지 요구 사항 (기호 테이블 처리기 등)을 적용하는 코드를 작성해야합니다.
일반적으로 상황에 맞는 문법은 훨씬 더 잘 지원되지 않기 때문에 사용하지 않습니다. 상황에 맞는 언어의 LR (k) 파서 생성기와 동등한 지 여부를 모르겠습니다. 예, 튜링 머신 (또는 선형 바운드 머신)이 하나를 파싱 할 수는 있지만 상황에 맞는 문법을 튜링 머신의 프로그램으로 바꾸는 일반적인 알고리즘이 있는지는 모르겠습니다. ) 생성기는 푸시 다운 머신에 대한 구문 분석 테이블을 작성합니다. 내 생각에 파서의 기초가되는 테이블은 기하 급수적으로 커질 것입니다. 어쨌든, CS 학생들 (나와 같이)은 대개 문맥이없는 문법과 YACC와 같은 LR (1) 파서 생성기를 배웁니다.
컨텍스트가없는 문법은 프로덕션 규칙에 대한 컨텍스트를 고려하지 않습니다. 컨텍스트 는 터미널 또는 비 터미널입니다.
따라서 문맥이없는 문법은 생산 규칙의 왼쪽에 단 하나의 비 터미널 만 있습니다.