정규식


16

Type 3 Grammar를 사용하는 경우 스택에서 작업을 수행하지 않고 푸시 다운 오토 마톤으로 표현할 수 있으므로 컨텍스트없는 언어를 사용하여 정규식을 표현할 수 있습니다. 그러나 구문 분석 테이블을 구성하지 않고 유형 3 문법이 , L L ( 1 ) , S L R ( 1 ) 등인지 알 수 있습니까?LR(1)LL(1)SLR(1)

답변:


15

모든 일반 언어에는 LL (1) 문법이 있습니다. 이러한 문법을 ​​얻으려면 정규 언어에 대한 DFA (아마도 정규 표현식에서 얻은 NFA에 대한 하위 집합 구성을 수행)를 사용하여 올바른 재귀 정규 문법으로 변환하십시오. 이 문법은 LL (1)입니다. 동일한 비 터미널에 대한 모든 생산 쌍이 다른 기호로 시작하거나 하나가 ε을 생성하고 $를 예측 토큰으로 사용하기 때문입니다. 따라서 모든 LL (1) 문법이 LR (1)이므로 모든 일반 언어도 LR (1)입니다. 또한 이 백서의 중요한 결과를 사용 하면 모든 LR (1) 언어에 SLR (1) 문법이 있음을 알 수 있습니다. 이는 모든 일반 언어에 SLR (1) 문법이 있음을 의미합니다.

그러나 일반 언어는 모두 LR (0) 이 아닙니다 . LR (0) 언어에는 매우 특정한 속성이 있습니다. 특히 접두사가 없어야합니다. 따라서 정규 언어 {a, aa}는 분명히 규칙적이지만 (regex a | (aa)) LR (0)이 아닙니다. 그러나 LR (0) 언어는 일반 언어에 제대로 포함되어 있지 않습니다. {0 n 21 n에 대한이 문법 | n ≥ 1}은 LR (0)이지만 언어는 규칙적이지 않습니다.

S -> E
E -> 0E1 | 2

도움이 되었기를 바랍니다!


2
올바른 정규 문법이 정규 언어 세트를 정확하게 받아 들인다는 사실은 보통 수업 (또는 연습)에서 이루어 지므로 그 대답은 훨씬 더 즉각적입니다.
Raphael

2

(구식) 정규 표현식 구문 ( "표시"라고 함)은 LR (0)입니다. 정규식을 나타내는 문자열을 구문 분석하기 위해 미리보기가 필요하지 않습니다. 정규 표현식에 대한 문법에서 파서 생성기를 실행하여이를 쉽게 결정할 수 있습니다. LL (0) 인 것은 LR (0)입니다.

Perl과 같은보다 복잡한 소위 "정규 표현식"의 구문이 이와 같은지 모르겠습니다. 그러나 Perl의 정규 표현식은 정규 표현식보다 훨씬 강력하므로 일반 정규 정규 표현식이 아닙니다.

문법에 속성이 있는지 확인하려면 일종의 조건자를 실행해야합니다. 그것이 (S) LR (k)인지 확인하려면 해당 속성을 확인할 수있는 조건자를 실행해야합니다. 실제로 이러한 술어는 정의 된 방식으로 인해 구문 분석 테이블을 실제로 빌드해야합니다.


펄 정규 표현식은 NFA에서 작동합니다

문제는 Perl 정규 표현식이 어떻게 작동했는지에 관한 것이 아닙니다. 특정 기술로 (Perl?) 정규 표현식을 구문 분석 할 수 있는지 여부에 관한 것이 었습니다. Perl 정규 표현식이 NFA를 사용하여 상황에 맞는 다른 데이터 캡처와 함께 일치를 수행한다고 생각할 수 있지만 질문과 관련성이 없습니다.

3
-1 정규식이 LR (0) 이 아닙니다 . LR (0) 언어는 접두사가 없어야하지만 정규식 a|(aa)은 접두사가없는 언어를 나타냅니다. 또한 LR (0) 언어는 엡실론 프로덕션에서 문법을 처리 할 수 ​​없으므로 일반 언어 {epsilon, a}는 LR (0)이 아닙니다. 그러나 일반 언어 LL (1)이므로 일반 문법으로 작성할 수 있으므로 모두 LR (1)입니다. LR (1) 언어에는 SLR (1) 문법이 있으므로 모든 일반 언어는 SLR (1)입니다.
templatetypedef

1
LL (0)에 대해서는 다른 방법이 있습니다. LL (0) 언어는 정규 언어의 적절한 하위 집합입니다. LL (0)은 다른 파생을 결정하는 데 미리보기를 사용하지 않음을 의미합니다. 기본적으로 결정이없고 언어는 단일 단어로 구성됩니다. 대조적으로 LR (0)은 유용한 클래스입니다. 다시 한번 당신은 lookahead를 사용하여 결정하지 않습니다 (여기서는 축소를 위해). 그러나 변화가 다른 프로덕션을 구별 할 수 있기 때문에 여전히 다양성이 있습니다.

1
@ IraBaxter- 정규 표현식의 접두사가 없기 때문에 정규 표현식의 구문은 LR (0)이 아닙니다. LL (0) 언어는 단일 문자열 만 포함하거나 문자열을 포함 할 수 없으므로 LL (0)도 아닙니다.
templatetypedef
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.