2011-04-25 2 views
2

Java 프런트 엔드와 함께 DSL을 가지고 있으며 백 엔드 파트를 더 쉽게 작성할 수 있도록 프런트 엔드 부분에서 얻을 수있는 AST를 직렬화하고 싶습니다. 다른 프로그래밍 언어로 코드를 생성합니다. 이 목적을 위해 XML보다 나은 것이 있습니까?AST를 구문 분석 가능한 형식으로 serialize

답변

4

XML은 많은 텍스트를 생성하며 대서양 횡단은 엄청나게 커질 수 있습니다. (필자는 파서를 만들고 파서는 XML을 생성 할 것입니다. 왜냐하면 고객이 요구했기 때문입니다 ...하지만 실제로 사용하지는 않습니다. IMHO, AST를 읽고 쓰는 데 걸리는 시간을 피하기 위해 나무를 조밀하게 인코딩하는 사용자 지정 형식을 디자인하는 것이 좋습니다. 예를 들어, 침전 수에 대한 :

(nodetype =value childnodes) 

곳() 괄호 (트리 노드를 열고과 함께 NODETYPE은 어쩌면 글자 수를 최소화하기 위해 높은 기수 형식의 노드 유형을 [나타내는 정수입니다 ], =는 노드가 값을 가지고 있다면 존재한다. (생각하면 = 기호가 필요 없다.) 값이 제공된다. 자식 노드는 닫히기 전에 인라인된다. 그들이 존재한다면, 분명히 왼쪽 빤으로 시작합니다. 필요한 공간이 없습니다! 실제로 을 읽어야 할 때 가끔이라고 읽으면, 괄호를 들여 쓰기 위해 간단한 벙어리 도구를 만들 수 있습니다.

[오래된 타이머는 이것을 LISP S- 표현식으로 인식 할 것이고, 이것은 1950 년대 후반부터 트리 인코딩으로 사용되어 왔습니다].

(우리는 나무를 읽고 쓰는 것이 얼마나 비용이 많이 들더라도 값 비싸기 때문에 메모리에있는 트리를 처리하고 최종 답변을 내뱉는 것이 더 쉽고 효율적입니다. .

+1

나는 거의 항상 위에 설명 된 것과 비슷한 S- 표현식을 사용합니다. 이렇게하면 백엔드 생성은 함수 바인딩 및 평가를 사용하여 수행 할 수 있습니다. (예를 들어, 1 + 2는 (+ 1 2)가되고 "+"는 그 자체에 대해 "1"과 "2"를 생성하는 것을 알고있는 funtion으로 평가됩니다.) 직렬화를 더 빨리하는 postfix 표현식을 사용할 수도 있습니다 그러나 스택 머신이 아닌 다른 것으로 백엔드하기가 어렵고 읽기가 더 어렵습니다. – TechNeilogy

관련 문제