2014-06-05 5 views
2

[Porcelli] (https://github.com/porcelli/plsql-parser)에 의해 주어진 PLSQL 파서를 수정했습니다. 이 파서를 사용하여 Plsql 파일을 구문 분석합니다. 구문 분석이 성공적으로 끝나면 대서양 표준시를 인쇄합니다. 이제, AST를 편집하고 원래의 plsql 소스를 편집 된 정보로 다시 인쇄하려고합니다. 이것을 어떻게 할 수 있습니까? 어떻게 주석, 줄 바꿈 및 공백으로 AST에서 소스 파일을 얻을 수 있습니다. 또한 서식도 원본 파일로 남아 있어야합니다. 이쪽으로 향하는 것이 도움이 될 것입니다.ANTLR : AST에서 소스 파일 생성

+0

구문 분석에서 미적 새 줄/공백 및 주석이 손실됩니다. 너는 AST 혼자서 이것들을 돌려받지 않을 것이다. – Xophmeister

+0

@Xophmeister : 절대적으로 순수한 대서양 표준시에서 돌아올 수없는 것들이 많이 있습니다. 다시 가져 오려면 AST가 파싱하는 동안 수집 할 수있는 몇 가지 추가 정보를 가지고 있어야합니다. 내 대답을 보라. –

답변

1

간단한 대답은 "나무를 걷고 노드에 해당하는 텍스트를 내뱉습니다"입니다. ANTLR 도움의 기본 일종의 "StringTemplates"를 제공하고 있지만, 사실은 언급 할 필요가 섬세한 디테일이 많이있다 :

들여 쓰기, 리터럴과 형식, 코멘트, ... 그래서 내를에 답변보기 Compiling an AST back to source code 자세한 내용은

파일의 원래 문자 인코딩을 재현해야하는 일반적인 경우가 있습니다. 가능하다면 ASCII 파일을 가지고 있지만 유니 코드 문자가 포함 된 문자열을 삽입 할 수없는 경우가 있습니다.

1

AST의 각 노드에는 입력 스트림의 토큰 위치 (실제로 토큰 스트림)를 제공하는 색인 ​​구성원이 있습니다. AST에서 색인을 검사하면 거기에 모든 색인이 나타나지는 않을 것입니다 (발생 색인에 구멍이 있음). 이들은 필터링 된 위치 (일반적으로 공백과 주석)입니다.

그러나 입력 스트림은 주어진 색인에서 토큰을 제공 할 수 있으며, 중요한 것은 토큰이있는 채널에 관계없이 발견 된 모든 토큰을 제공하는 것입니다. 따라서 귀하의 전략은 토큰을 통해 반복 할 수 있습니다 당신의 토큰 스트림을 찾아서 인쇄하십시오. 또한 AST에서 현재 색인을 검사하여 대신 다른 출력을 생성해야하는지 또는 추가 출력을 추가해야하는지 확인할 수 있습니다.

+0

질문은 "AST에서 원본 인쇄 방법"입니다. 말하길, "토큰 반복 ..."; OP는 합리적으로 이들이 사라 졌다고 가정합니다. –

+1

@IraBaxter OP는 원래 소스 코드를 다시 생성하고 AST에 추가 된 일부 변경 사항을 재생하려고합니다. 행간을 읽다. 글쎄, 정말 분명해. 선들 사이를 실제로 읽을 필요는 없어. –

관련 문제