2016-06-28 6 views
1

구체적인 구문 값이 주어지면 어떻게 다른 값 유형 (이 경우 int)으로 매핑 할 수 있습니까?구체적인 구문 값을 다른 종류의 값으로 변환하는 방법은 무엇입니까?

public Tree increment() { 
    MyTree tree = (MyTree)`(3, (1, 10))`; 

    return visit(tree) { 
     case l:(Leaf)`3` => l + 1 
    }; 
} 

을 또는 내가 유형을 지정한 ADT에 implode 할 수있는 유일한 방법은 다음과 같습니다

// Syntax 
start syntax MyTree = \node: "(" MyTree left "," MyTree right ")" 
        | leaf: Leaf leaf 
        ; 

layout MyLayout = [\ \t\n\r]*; 

lexical Leaf = [0-9]+; 

이 불행하게도 작동하지 않는 이유는 무엇입니까?

답변

2

귀하의 질문은 다른 가능한 답변이 있습니다

  1. 당신이 추상 트리에 구문 분석 트리를 변환 할 수 있습니다 implode를 사용하여. 타겟 추상 언어의 생성자가 int이라고 예상하면 [0-9]+과 일치하는 어휘 트리가 자동으로 변환됩니다. 예를 들어, syntax Exp = intValue: IntValue;의 구문 트리는 data Exp = intValue(int i);의 생성자로 변환 될 수 있으며 실제로는 i을 생성합니다.
  2. 일반적으로 하나의 값 유형을 다른 유형의 값으로 변환하려면 int eval (MyTree t)int (Leaf l)처럼 (상호) 재귀 함수를 작성해야합니다.
  3. 리프 값의 구문 표현을 실제로 증가 시키려면 그 결과 인 int을 다시 Leaf으로 변환해야합니다 (구문 분석 또는 구체적인 패턴을 통해).

예 :

는 어휘가 문자열 "<l>"로 변환됩니다
import String; 
MyTree increment() { 
    MyTree tree = (MyTree)`(3, (1, 10))`; 

    return visit(tree) { 
     case Leaf l => [Leaf] "<toInt("<l>") + 1>"; 
    }; 
} 

첫째,이 후 toInt()를 사용하여 int로 분석되고 우리는 한 문자열 "<...>"로 다시 int를 매핑 할 + 1를 사용하여 추가 , 그 후에는 [Leaf]을 사용하여 Leaf 파서라고 부를 수 있습니다.