2010-12-18 7 views
2

독점적 언어에 대한 AST를 작성하는 방법을 이해하려고합니다. AST를 작성해야 소스 코드에서 발생할 수있는 오류를 검사하기위한 규칙과 지침을 제공 할 수 있습니다.독점적 언어 용 AST를 작성하는 방법은 무엇입니까?

대서양 표준시 구축 방법은 무엇입니까? 저를 도와 줄 수있는 책이나 기사가 있습니까? 컴파일러에서 드래곤 북이 도움이됩니까?

저는 비보호 배경입니다.

감사합니다.

+1

기본 컴파일러 리소스 질문 : [컴파일러 작성법 배우기] (http://stackoverflow.com/q/1669/2509). Crenshaw 튜토리얼 (즉각적인 코드 생성을 수행하므로 AST가없는 ...)을 제외하고는 아무 것도 볼 수 없습니다. – dmckee

답변

2

이것은 상당히 큰 질문입니다. 나는 또한이 문제를 비 CS 배경에서 다루었 기 때문에 당신의 고통을 느낍니다. 그것은 내가 CS를 더 많이 감사하게 만들었습니다.

연구에서 많이 볼 수있는 한 가지는 EBNF (Extended Backus-Naur Form)입니다. 기본적으로 언어를 설명하는 방법입니다. 귀하의 언어에 대한 EBNF를 작성하면 컴퓨터가 구문 분석을 위해 수행해야하는 작업에 능숙하게 도움이됩니다.

수작업으로 문제 해결하기 : 아마도 렉서/파서를 사용하여 트리를 구성 할 것입니다.

전통적인 도구로는 lex와 yacc 또는 다소 현대적인 사촌 플렉스와 들소가 있습니다.

더 새로운 접근 방법은 Antlr입니다. 그것은 매우 추천 받았지만 내 머리 위로했다.

내가 발견 한 세 번째 접근법은 파이썬의 pyparsing 라이브러리입니다. 파이썬에 대한 친숙 함과 파싱에 필요한 내용을 설명하는 읽을 수있는 방식으로 궁극적으로갔습니다.

pyparsing에 사용할 수있는 plenty of examples이 있습니다. 필자가 파서를 만드는 데 가장 도움이되는 도구는 SimpleCalc입니다. 그러나 이것은 꽤 오래된 버전의 pyparsing을 기반으로하며 나중에 구현 된 pyparsing과 같은 강력한 작업 중 일부가 필요하기보다 복잡합니다. SimpleArith은 비슷하지만 새로운 버전입니다.

아직 실제로 pyparsing을 처리하지 않은 한 가지 구문 오류를 올바르게 분석하고 있습니다. 그러나 필요한 도구를 제공하는 것처럼 보입니다.

어쨌든이 질문에 대한 답변은 아니지만 적어도 몇 군데부터 시작하길 바랍니다. 복잡한 언어를위한 파서를 만드는 것은 쉽지 않습니다!

+0

파이썬의 문맥없는 문법을 살펴 보는 것이 도움이 될 것입니다. 파이썬은 다른 어떤 강력한 언어보다 더 단순하고 (더 강력한) 경향이있다. 왜냐하면 거의 모든 곳에서 (예 :'if' 블록 내부의'class','class'에서'if' 내부의'def') 거의 모든 것을 허용하기 때문입니다. 이것은 도움이되거나 방해가 될 수 있습니다. –

+0

ANTLR이 좋습니다. 더 많은 정보가 필요합니다. – codeanalyser

+1

파서를 작성하는 것이 작업의 가장 쉬운 부분입니다. 분석기를 만드는 것이 더 어렵습니다. 사람들은 이것을 이해하지 못하는 것 같습니다. –

1

코드 분석 엔진은 일반적으로 AST를 작성하는 것 이상의 정교함을 요구합니다.

심각한 코드 분석을 수행하려면 코드에서 식별자의 의미와 정의 방법 ("기호 테이블")을 알아야하며 프로그램에서 정보가 어떻게 이동하는지 (예 : 컨트롤 및 데이터 흐름 분석). 이 모든 것을 지원하기 위해서는 기계가 필요합니다. 그런 다음 기계를 독자적인 언어로 묶어야합니다.

에베레스트를 비유로 생각합니다. AST를 얻는 것은 10,000 피트 기본 캠프에 도달하는 것과 같습니다. 어떤 덩어리라도 기본적인 기술 (하이킹 부츠)을 사용하여 언덕을 걸어서 할 수 있습니다. 마지막 17,000 피트를 오르는 것은 완전히 다른 종류의 기술, 헌신 및 계획을 필요로하며, 첫 번째 10,000 피트를 걷은 대부분의 사람들은 나머지 여행을 준비하지 못합니다. (나는 약간의 경험을 여기에서 가지고있다, 나의 생체를 점검해라.)

이들은 모두 매우 세부적인 주제이며 CS 배경이 없다는 것은 당신을위한 길을 상당히 거칠게 만들 것입니다. (그러나 우리는 모두 어딘가에서 시작합니다. 그래서 이것은 정말로 야망의 문제입니다.) 드래곤 북은이 기계류가 무엇을하고 왜 필요로 하는지를 이해하는 데 도움이되는 훌륭한 자료입니다. 많은 다른 훌륭한 컴파일러 서적들이 존재하며 일반적으로 잘 작동 할 것입니다. 그러나 당신은 심각한 독서를 할 준비가되어 있어야합니다.

커브를 얻는 한 가지 방법은 이러한 도구를 제작하는 데 많은 경험을 가진 수많은 컴퓨터 과학자가이 기계류의 대부분을 이미 고려하여 구현 한 도구를 사용하는 것입니다. 그렇다면 문제는 상당히 감소합니다. 필요한 것만 알아 내려고 (대부분의 사람들은 AST 단계를 지나치지 않고) 필요한 모든 지원 기계를 구현하기보다는 제공된 것을 사용하는 방법을 배우기 만하면됩니다.

ANTLR (이미 언급했는데 꽤 좋은 CS 교수가 작성 했음)은 일종의 구문 분석 기능을 제공하므로 AST 작성 방법과 결과 AST를 절차 적으로 올라갈 수있는 방법을 정의 할 수 있습니다. 그러나 그것은 당신이 당신의 업무에 필요한 다른 것들을 많이 제공하지는 않습니다.

우리의 DMS Software Reengineering Toolkit은 첫 번째 단락에서 언급 한 모든 기능을 제공 한 다음 일부를 제공합니다. DMS로 작업하는 첫 번째 차이점 중 하나는 문법을 제공하기 만하면된다는 것입니다. 더 이상 도움을받지 않고 대서양 표준시를 만듭니다.

example of DMS applied to high school algebra and calculus에서 DMS와 어떤 작업이 유사한 지 확인할 수 있습니다. 특히, 대수/미적분에 대해 간단한 문법을 ​​사용하는 것이 어떻게 쉽게 정의 될 수 있는지를 보여줍니다. 그런 다음 해당 언어로 된 "프로그램"을 조작 할 수 있습니다. 이 응용 프로그램은 코드를 분석하지 않고 "변환"하지만 기본은 동일합니다.

독점적 인 언어를 분석 한 "실제"DMS 응용 프로그램은 상당히 복잡합니다.

관련 문제