답변:
모든 일반 언어에는 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
도움이 되었기를 바랍니다!
(구식) 정규 표현식 구문 ( "표시"라고 함)은 LR (0)입니다. 정규식을 나타내는 문자열을 구문 분석하기 위해 미리보기가 필요하지 않습니다. 정규 표현식에 대한 문법에서 파서 생성기를 실행하여이를 쉽게 결정할 수 있습니다. LL (0) 인 것은 LR (0)입니다.
Perl과 같은보다 복잡한 소위 "정규 표현식"의 구문이 이와 같은지 모르겠습니다. 그러나 Perl의 정규 표현식은 정규 표현식보다 훨씬 강력하므로 일반 정규 정규 표현식이 아닙니다.
문법에 속성이 있는지 확인하려면 일종의 조건자를 실행해야합니다. 그것이 (S) LR (k)인지 확인하려면 해당 속성을 확인할 수있는 조건자를 실행해야합니다. 실제로 이러한 술어는 정의 된 방식으로 인해 구문 분석 테이블을 실제로 빌드해야합니다.
a|(aa)
은 접두사가없는 언어를 나타냅니다. 또한 LR (0) 언어는 엡실론 프로덕션에서 문법을 처리 할 수 없으므로 일반 언어 {epsilon, a}는 LR (0)이 아닙니다. 그러나 일반 언어 는 LL (1)이므로 일반 문법으로 작성할 수 있으므로 모두 LR (1)입니다. LR (1) 언어에는 SLR (1) 문법이 있으므로 모든 일반 언어는 SLR (1)입니다.