2012-09-20 2 views
15

역방향을 구현하는 구문 분석기 생성기가 있습니까? 즉, 동일한 문법 사양에서 도메인 객체를 구문 분석하지 않는 것 (예 : 예쁜 인쇄)이 있습니까? 내가 아는 한 ANTLR은 이것을 지원하지 않습니다.결합 된 비파 문자/파서 생성기

+0

임의의 동작이있을 때 다소 힘들어 보이지만 속성 문법으로는 충분 해 보입니다 ... 나는 똑똑한 대답으로 겸손해질 때까지 기다릴 수 없습니다 : D – delnan

+0

@delnan : 사실, 속성 문법은 "충분히 쉽다". 내 대답을 보라. prettyprinter 스펙은 재미있는 구문을 가진 속성 문법입니다. –

답변

0

일반적으로 불가능합니다.

인쇄가 어떻게됩니까? 공백, 탭 또는 줄 바꿈이 해당 위치에 있으면 인쇄가 멋지게 인쇄됩니다.

대부분의 문법은 공백을 무시합니다. 대부분의 언어에서 공백이 중요하지 않기 때문입니다. 파이썬과 같은 예외가 있지만 일반적으로 문항으로 공백을 사용하는 것이 좋은지 아닌지는 여전히 논란의 여지가 있습니다. 그리고 대부분의 문법은 구문으로 공백을 사용하지 않습니다.

추상 구문 트리에 공백이 포함되어 있지 않은 경우 파서가이를 버렸기 때문에 발전기를 사용하여 AST를 인쇄 할 수 없습니다.

+0

나는 이것을 생각하고 있었다. 일부 문법 (C와 같은 문법)은 공백과 같은 것들에 많은 유연성을 허용합니다. 그러나 일부 문법은 그렇지 않으므로 모든 프린터가 자동으로 예쁜 프린터가됩니다. 그러나 아마도 여러분이 아마도 선택 사항 중 어느 것이 "예쁜"것인지에 관한 정보로 문법에 주석을 달 수 있고, 그런 다음 예쁜 프린터를 생성 할 수있는 것처럼 보입니다. –

1

우리의 DMS Software Reengineering Toolkit은 정확하게 이것을 수행하며 (코드 분석/변환에 대한 추가 지원을 많이 제공합니다.)

DMS가 문법에 기반한 트리를 생성한다는 것을 알 수 있습니다.

각 DMS 문법 규칙은 소위 "사전 인쇄"규칙과 쌍을 이룹니다. 각 prettyprinting 규칙은 해당 규칙에서 인식하는 구문 요소를 "미리 인쇄하는"방법을 설명합니다. prettyprinting 프로세스는 본질적으로 직사각형의 텍스트 상자를 수평 또는 수직으로 결합하고 (선택적인 들여 쓰기 사용) 잎의 문자 값 (키워드, 연산자, 식별자, 상수 등)을 포함하는 단위 높이 상자를 만듭니다.

다음과 같이

for (i=x*2; 
     i--; i>-2*x) { a[x]+=3; 
     b[x]=a[x]-1; } 

하고 prettyprint :

statement = 'for' '(' assignment ';' assignment ';' conditional_expression ')' 
      '{' sequence_of_statements '}' ; 
<<PrettyPrinter>>: 
    { V(H('for','(',assignment[1],';','assignment[2],';',conditional_expression,')'), 
     H('{', I(sequence_of_statements)), 
     '}'); 

이 다음과 같은 구문 분석됩니다, 하나는 다음 DMS 문법 및 prettyPrinting를 규칙을 작성할 수 있습니다

for (i=x*2;i--;i>-2*x) 
    { a[x]+=3; 
     b[x]=a[x]-1; 
    } 

DMS는 주석을 캡처하여 AST 노드에 첨부하고 출력시 다시 생성합니다. 대부분의 파서가 주석을 처리하지 않기 때문에 구현이 이색 적이지만 활용도는 "무료"여야합니다. 코멘트는 원래의 장소에 미리 인쇄 된 결과에 자동으로 삽입됩니다.

DMS는 "충실도"모드로 인쇄 할 수도 있습니다. 이 형식에서는 구문 분석 된 토큰의 행에 열 오프셋을 유지하려고 시도합니다. 이로 인해 원본 텍스트가 재생성됩니다.

prettyprinters가 수행해야하는 작업에 대한 자세한 내용은 내 대답은 Compiling an AST back to source code입니다. DMS는 모든 주제를 명확하게 처리합니다.

이 기능은 완전한 IBM COBOL, PL/SQL, Java 1.8, C# 5.0, C (많은 방언) 및 C++ 14를 포함하여 실제 40 개 이상의 실제 언어에서 DMS에 의해 사용되었습니다.

1

언 파파의 구현을 포함하는 여러 파서 생성기가 있습니다. 그 중 하나는 context-free 문법을위한 nearley 파서 생성기입니다.