[regex] 문맥 자유 문법이란 무엇입니까?

누군가 문맥 자유 문법이 무엇인지 설명해 줄 수 있습니까? 위키피디아 항목과 형식 문법에 대한 위키피디아 항목을 살펴본 후, 나는 완전히 당황했습니다. 누군가가 이것들이 무엇인지 설명 할 정도로 친절할까요?

구문 분석과 정규식 엔진의 한계를 조사하고 싶기 때문에 궁금합니다.

이 용어가 직접 프로그래밍과 관련이 있는지 또는 일반적으로 언어학과 더 관련이 있는지 확실하지 않습니다. 그럴 경우 사과드립니다. 그렇다면 이동 될 수 있습니까?



답변

문맥 자유 문법은 특정 속성을 만족시키는 문법입니다. 컴퓨터 과학에서 문법은 언어를 설명합니다. 특히 공식 언어를 설명합니다.

형식 언어는 문자열 (기호의 시퀀스 … 단어 “문자열”의 프로그래밍 사용과 매우 유사)의 집합 (객체 모음에 대한 수학적 용어)입니다. 형식 언어의 간단한 예는 길이가 3 인 {000, 001, 010, 011, 100, 101, 110, 111}의 모든 이진 문자열 세트입니다.

문법은 문법에서 설명하는 언어로 문자열을 구성하기 위해 만들 수있는 변환을 정의하여 작동합니다. 문법은 시작 기호 (일반적으로 S)를 기호 문자열로 변환하는 방법을 알려줍니다. 이전에 주어진 언어의 문법은 다음과 같습니다.

S -> BBB
B -> 0
B -> 1

이 해석하는 방법은 그 말을하는 것입니다 S교체 할 수 있습니다 BBB, 그리고 B0으로 대체 할 수 있으며, B우리가 할 수있는 문자열 010을 구성 1. 그래서 교체 할 수 있습니다 S -> BBB -> 0BB -> 01B -> 010.

문맥없는 문법은 단순히 당신이 바꾸는 것 (화살표의 왼쪽)이 하나의 “비 터미널”기호 인 문법입니다. 비 터미널 기호는 최종 문자열에 나타날 수없는 문법에서 사용하는 기호입니다. 위의 문법에서 “S”와 “B”는 비 터미널 기호이고 “0”과 “1”은 “터미널”기호입니다. 같은 문법

S -> AB
AB -> 1
A -> AA
B -> 0

“AB-> 1″과 같은 규칙을 포함하므로 규칙적이지 않습니다.


답변

언어 이론은 계산 이론과 관련이 있습니다. 어떤 프로그램이 가능하거나 어떤 프로그램을 작성할 수 있는지, 어떤 유형의 문제를 해결하기 위해 알고리즘을 작성하는 것이 불가능한지 결정하는 컴퓨터 과학의 철학적 측면입니다.

정규식은 정규 언어를 설명하는 방법입니다. 정규 언어는 결정 론적 유한 자동화에 의해 결정될 수있는 언어입니다.

Finite State Machines에 대한 기사를 읽어야합니다 : http://en.wikipedia.org/wiki/Finite_state_machine

일반 언어 :
http://en.wikipedia.org/wiki/Regular_language

모든 정규 언어는 문맥 자유 언어이지만 정규적이지 않은 문맥 자유 언어가 있습니다. Context Free Language는 Context Free Grammer 또는 단일 스택이있는 Finite State Machine 인 Pushdown Automata에서 허용하는 모든 문자열 집합입니다. http://en.wikipedia.org/wiki/Pushdown_automaton#PDA_and_Context-free_Languages

문자열이 언어로되어 있는지 여부를 결정하기 위해 Turing Machine (컴퓨터에서 작성할 수있는 모든 프로그램)이 필요한 더 복잡한 언어가 있습니다.

언어 이론은 또한 P 대 NP 문제 및 기타 흥미로운 것들과 매우 관련이 있습니다.

컴퓨터 과학 입문 3 년차 교과서는이 내용을 잘 설명했습니다. 계산 이론 입문. Michael Sipser 작성. 하지만 새 제품을 사는데 160 달러 정도의 비용이 들었고 그리 크지는 않습니다. 중고 사본을 찾거나 도서관이나 도움이 될만한 사본을 찾을 수 있습니다.

편집하다:

정규 표현식과 고급 언어 수업의 한계는 지난 50 년 동안 많은 연구를 통해 이루어졌습니다. 일반 언어에 대한 펌핑 기본형에 관심이있을 수 있습니다. 특정 언어가 규칙적이지 않다는 것을 증명하는 수단입니다.

http://en.wikipedia.org/wiki/Pumping_lemma_for_regular_languages

언어가 정규적이지 않다면 Context Free 일 수 있습니다. 즉, Context Free Grammer가 설명 할 수 있거나 더 높은 언어 클래스에있을 수도 있습니다. Context Free를위한 펌핑 기본형에 의해 Context Free가 아님을 증명할 수 있습니다. 정규식과 유사한 언어.

언어는 결정 불가능할 수도 있습니다. 즉, 튜링 머신 (컴퓨터가 실행할 수있는 프로그램 일 수 있음)조차도 문자열을 언어에서 허용할지 아니면 거부 할지를 결정하도록 프로그래밍 할 수 없습니다.

가장 관심이있는 부분은 정규 표현식이 어떤 언어를 결정할 수 있는지 확인하는 유한 상태 머신 (결정 론적 및 결정 론적)과 어떤 언어가 규칙적이지 않은지 증명하는 펌핑 기본형이라고 생각합니다.

기본적으로 어떤 종류의 기억이나 계산 능력이 필요한 언어는 규칙적이지 않습니다. 예를 들어 괄호 일치의 언어는 규칙적이지 않습니다. 예를 들어 기계는 괄호를 닫아야하는지 여부를 알기 위해 괄호를 열 었는지 기억해야하기 때문입니다.

b가 3 개 이상 포함 된 a 및 b 문자를 사용하는 모든 문자열의 언어는 일반 언어입니다. a ba ba ba

a보다 b가 더 많은 문자 a와 b를 사용하는 모든 문자열의 언어는 규칙적이지 않습니다.

또한 모든 유한 언어가 규칙적이어서는 안됩니다. 예를 들면 다음과 같습니다.

a보다 더 많은 b를 포함하는 문자 a와 b를 사용하는 50 자 미만의 모든 문자열의 언어는 규칙적입니다. 왜냐하면 유한하기 때문에 (b | abb | bab | bba | aabbb | ababb |). ..) 가능한 모든 조합이 나열 될 때까지 ect.


답변