문맥없는 문법에 매개 변수를 추가하면 무엇을 얻을 수 있습니까?


13

나는 indendation에 민감한 언어에 대한 문법을 ​​생각하고 있었고 CF 문법이 매개 변수와 결합되면 트릭을 수행하는 것처럼 보입니다. 예를 들어, ANTLR과 유사한 형식의 단순화 된 Python 문법에 대해이 단편을 고려하십시오.

// on top-level the statements have empty indent
program  
    : statement('')+
    ;

// let's consider only one compound statement and one simple statement for now
statement(indent) 
    : ifStatement(indent)
    | passStatement(indent)
    ;

passStatement(indent)
    : indent 'pass' NEWLINE
    ;

// statements under if must have current indent plus 4 spaces
ifStatement(indent)
    : indent 'if' expression ':' NEWLINE (statement(indent '    ')+)
    ;

내 질문 : 이런 종류의 문법 (매개 변수가있는 CFG)에 이름이 있습니까?

이 문법에 대해 재귀 강하 파서를 작성하는 것이 어렵지 않은 것으로 보입니다 (매개 변수는 기본적으로 파서이어야 함). 이 접근법의 어려움은 무엇입니까?

매개 변수를 추가하면 지원되는 언어 클래스가 컨텍스트없이 증가합니까?


1
매개 변수가 취할 수있는 값 집합이 유한하면 컨텍스트가 거의 없습니다 (모든 값을 반복하고 모두 쓸 수 있음).
ratchet freak

1
귀하의 제안은 들여 쓰기가 고정 된 들여 쓰기에 민감한 언어에 대한 것입니다. 파이썬 (및 다른 언어들)은 이런 식으로 제한되지 않습니다. 그들은 사용자가 원하는 들여 쓰기를 받아들입니다. 그것은 구문 분석에 영향을 미치지 않지만 (탭 문자 처리 제외) 적어도 내가 이해 한대로 제안으로 표현하기가 어려울 것입니다.
rici


@HendrikJan, 속성 문법은 의미 론적 행동으로 문법에 주석을다는 방법으로, 구문 분석을 제어하지 않습니다.
AProgrammer

1
들여 쓰기를 처리하는 것이 목표라면 파서보다는 토크 나이저에 더 적합합니다. 들여 쓰기 레벨이 변경 될 때 토크 나이저가 가상 INDENT 및 UNINDENT 토큰을 방출하도록하십시오. 그런 다음 들여 쓰기에 대한 정보로 언어 문법을 보강 할 필요가 없습니다.
John Kugelman

답변:


14

저명한 문법 (매개 변수가없는 문맥없는 문법)은 저명한 네덜란드 컴퓨터 과학자 Cornelis HA Koster에 의해 광범위하게 연구되었으며, 그의 1962 년 논문 "영어의 일부를위한 생성 문법", LGLT Meertens와 공동으로 작성되었습니다. 1970 년에 그는 개념의 형식주의를 만들었다. 유용한 개요는 1971 년 논문 "Affix Grammars for Programming Languages"에서 확인할 수 있으며, Citeseer 에서 찾은 버전입니다 .

이 논문에서 Koster는 그의 형식주의 (및 다른 유사한 것)를 Van Wijngaarden 2 단계 문법 과 비교하여 그것들이 매우 유사하다는 것을 발견했습니다.

구문 분석 기술에 대한 Dick Grune의 주석이 달린 주석 서지 목록 에는 접두어 문법 및 기타 비 Chomskyian 형식에 대한 많은 유용한 참고 문헌이 포함되어 있습니다. (참조 참고 문헌의 섹션 18.2.6, 다른 섹션에 유용 논문이 있기는하지만.) Grune 커버가에서 문법 간단히 부착 실무 가이드 : 구문 분석 기법의 두 번째 버전의 §15.3.2 초판 (더욱 간단하게 하향식 (및 기타) 구문 분석 기술을 쉽게 적용 할 수 있다는 사실을 언급하면서 온라인에서 볼 수 있습니다.

Algol 68 보고서의 편집자이기도 한 Koster 는 접두사 문법에 대한 그의 아이디어를 기반으로 컴파일러 설명 언어 (CDL) 의 최초 개발자였습니다 . 이 툴킷과 그 파생 상품은 몇 년 동안 생산에 사용되었습니다. Google 검색에서 찾 었으며 영구성을 보증 할 수없는 이 페이지 에는 CDL3의 설명서 및 다운로드 사이트 링크가 있습니다.


CDL 언어는 속성 문법 과 비슷하다고 생각합니다. 속성 값은 외부 정의 함수로 계산할 수 있습니다. 확장 접두사 문법 과 같이 접두사 (속성) 값 사이의 관계가 형식주의 내에 정의 된 경우 이름 접두사 문법 을 예약합니다 .
reinierpost 2006 년

@reinierpost : 물론 자신의 용어를 사용할 자격이 있습니다. 특권은 의인화 란에 국한되지 않습니다. 그러나 CDL 매뉴얼 자체는 "CDL3은 접두어 문법에 기반한 구현 언어"라고 주장합니다. ( ftp.cs.kun.nl/pub/cdl3/cdl3-manual-1.2.7.pdf 에서 매뉴얼을 볼 수 있습니다 ). 이것이 제가 대답 한 바에 의하면 CDL은 Koster의 접두사 문법에 기초한 것입니다. Grune이 지적했듯이 접두사와 속성 문법의 차이는 미미합니다. 그의 특징은 접두사가 구문 적 유효성을 결정하는 데 사용되는지 여부입니다.
rici

(따옴표는 매뉴얼의 첫 페이지에서 인용 한 것입니다.)
rici

나도 알아 .. 네 말이 맞아 내 의견은 당신과 모순되지 않았습니다.
reinierpost 2006 년

6

CFG의 펌핑 보조 정리를 살펴보십시오 .

문법을 봅시다

S -> A("")
A(p) -> p 
      | p '\n' A(p"*") '\n' p 

이것은 별 삼각형을 설명합니다.

*
**
***
**
*

V엑스와이{V엑스와이|>0}V엑스

즉, 별 삼각형은 상황에 맞는 언어가 아닙니다.

또는 더 간단한 예 :

S-> B("")
B(p)-> p 'a' p 'a' p
     | B(p 'b')

{|0}


3

나는 정확하게 "파라미터는 기본적으로 파서이어야한다"라는 정의에 대한 세부 사항에 따라이 형식주의가 제시된 것을 본 적이 없다 (그런의 파싱 ​​기법 과 같은 것조차도 ). 제한없는 위상 구조 문법 (즉, 상황에 맞는 것보다 강력 함)



Koster와 그의 연구팀은 내가 아는 한 두 가지 유형의 접두어 문법을 연구했다. 1) 제한된 형태의 반 Wijngaarden 문법. 2) CDL 언어, 명백한 접미사 값 조작은 없지만 대상 언어 (예 : 어셈블러)에서 규칙을 정의하는 옵션이있는 실제 컴파일러 설명 언어로 튜링을 완료합니다.
reinierpost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.