문제

나는 Haskell을보고 있었고 컴파일러 (학습 운동)를 작성하고 싶습니다. 많은 타고난 기능이 컴파일러 (특히 재귀 적 괜찮은 컴파일러)에 쉽게 적용될 수 있기 때문입니다.

내가 머리를 잡을 수없는 것은 언어의 문법을 Haskell-Aian 방식으로 표현하는 방법입니다. 첫 번째 생각은 재귀 적 데이터 유형 정의를 사용하는 것이었지만, 예를 들어 언어의 키워드와 일치하는 방법을 알 수 없습니다 ( "if").

생각과 제안은 크게 감사합니다.

피트

도움이 되었습니까?

해결책

이를 위해서는 재귀 적 데이터 유형이 적합합니다. 예를 들어 언어가 주어지면 :

expr ::= var
      |  "true"
      |  "false"
      |  "if" expr "then" expr "else" expr
      |  "(" expr ")"

이 언어의 예제 표현은 다음과 같습니다.

if true then x else (if false then y else true)

Haskell 데이터 유형은 다음과 같습니다.

data Expr = Var String
          | Lit Bool
          | If Expr Expr Expr

그런 다음 구문 분석기는 번역하기 위해주의를 기울입니다. x ~ 안으로 Var "x", 그리고 true ~ 안으로 Lit True, 등 : IE :

parse "if x then false else true" 
  ==  If (Var "x") (Lit False) (Lit True)

파서를 작성하려면 Norman의 답변에 언급 된 기술을 사용하거나 사용하여 직접 굴릴 수 있습니다. 파르세스 또는 파서 생성기를 사용하십시오 행복하다.

다른 팁

귀하는 상호 재귀 대수 데이터 유형을 사용하여 프로그램을 나타내고 사용하는 프로그램을 구문 분석합니다. 구문 분석 조합기. 백만 맛이 있습니다. 당신은 3 개의 유용한 튜토리얼 논문을 찾을 수 있습니다 내 수업 일정 2009 년 3 월 23 일 월요일

Hutton과 Meijer 종이는 가장 짧고 단순하지만 아마추어에게는 분명하지 않은 Monads를 사용합니다. 그러나 그들은 표현을위한 아주 좋은 문법과 구문 분석기를 가지고 있습니다. 아직 모나드를 맥주하지 않으면 Fokker의 튜토리얼이 하나입니다.

어쩌면 실제 프로젝트를보고 어떻게하는지 확인할 수 있습니까?

일주일 전에 언어-파이썬 프로젝트는 발표Haskell-Cafe Mailinglist. 그것은 a입니다 파이썬 Parser는 Haskell에서 구현되어 있습니다 행복하다 파서 생성기 및 알렉스 렉서 생성기.

물론 있습니다 퍼그, 구현 Perl 6 Haskell (Perl 6 사양의 상당한 부분 집합을 준수하는 Perl 6의 첫 번째 구현)에서.

나는 당신이 컴파일러를 작성하려고 시도했는지, 또는 전에 컴파일러를 작성하고 Haskell과 관련된 조언을 찾고 있는지 여부를 당신의 질문의 어조로 말할 수 없습니다. 당신이 이미 컴파일러 전문가라면, 내가 제공해야 할 조언은 어떤 조언이 도움이되지 않을 것입니다. :)

프로그래밍 언어 문법은 일반적으로 표현됩니다 BNF 양식, 소스 코드를 구문 분석하기 위해 YACC 또는 Bison과 같은 도구로 사용할 수 있습니다. 나는 이것이 Haskell-Aian 방법으로 간주되는지는 모르겠지만, 내가 들어 본 유일한 방법입니다. 주위에 약간의 파기로 BNF 문법에서 Haskell 코드를 생성하는 도구를 파헤칠 수 있습니다. 나는 찾았다 이 도구 그렇게 할 수 있다고 주장합니다.

빠른 Google 검색이 나타났습니다 Haskell 의이 BNF 문법, Haskell에 대한 컴파일러를 작성하려는 경우 (Haskell에 Haskell 컴파일러를 작성하고 싶습니까?) BNF 문법 C와 Java가 인기있는 것 같습니다.

마지막으로 컴파일러 디자인에 관한 책을 찾고 있다면 클래식 텍스트는 "드래곤 북".

불행히도 Haskell 문법은 없습니다 antlr, 그러나 아마도 위에서 인용 한 링크를 사용하여 하나를 만들 수 있습니다. Antlr은 훌륭한 Java 기반 파서 생성기입니다.

Steve Yegge는 좋은 것을 가지고 있습니다 블로그 더 많은 동기가 필요한 경우 컴파일러 작성에 대해. 재미 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top