저는 컴파일 된 문법이 있으므로 입력 시퀀스를 XML로 변환하는 데 사용하고 싶습니다. 제 경우에는 많은 규칙을 가진 매우 큰 문법을 가지고 있으므로 각 문법 규칙을 내 코드에서 재정의하는 것을 피하고 싶습니다.XML을 파스 트리로 변환합니다.
혼란을 피하기 위해 예제를 사용합니다. 우리가 다음 문법
보자grammar expr;
prog: stat+ ;
stat: expr NEWLINE
| ID '=' expr NEWLINE
| NEWLINE
;
expr: expr ('*'|'/') expr
| INT
| ID
| '(' expr ')'
;
ID : [a-zA-Z]+ ; // match identifiers
INT : [0-9]+ ; // match integers
NEWLINE:'\r'? '\n' ; // return newlines to parser (is end-statement signal)
WS : [ \t]+ -> skip ; // toss out whitespace
입력 순서
A = 10
B = A * A
예상 출력 구문 분석 트리에 해당
<prog>
<stat>
A =
<expr> 10
</expr>
\r\n
</stat>
<stat>
B =
<expr>
<expr>A</expr>
*
<expr> A</expr>
</expr>
\r\n
</stat>
</prog>
현재
내가 내가 ParseTree
를 만드는 방법과 내가 이후에 위의 XML로 변환 다음 문자열
(prog (stat A = (expr 10) \r\n) (stat B = (expr (expr A) * (expr A)) \r\n))
를 생성 toStringTree
방법을 사용하여 사용 (I 작동 간단한 일반적인 코드를 사용 어떤 문법든지를 위해). 나는이 접근법이 거짓임을 안다. toStringTree
없이 해결할 수 있습니까? 방문자의 각 문법 규칙을 무시할 필요가 없습니다. (나는 그들의 수백이있다).
편집
나는 기본적으로 XML 형식으로 일반 파스 트리 직렬화의 일종이 필요합니다. 주요 목표는 각 규칙에 대해 Java로 특수 직렬화 메소드를 작성할 필요가 없다는 것입니다.
"printXml (ParseTree tree)"'정적 메서드를 사용하여 ParseTree를 재귀 적으로 인쇄하는 방법은 어떻습니까? –
@StefanHaustein 감사합니다. 감사합니다. 나는 Antlr에 대해 많은 경험이 없습니다. –
XML을 만드는 것은 좋은 생각이 아닙니다. 어떻게 조작 할 것인가? XSLT는 커다란 나무에서는별로 좋지 않습니다. 크기가 작은 Java 프로그램의 경우 큰 나무를 갖게됩니다. 게다가 XSLT는 상황에 맞는 검사를 잘하지 못하고 모든 Java 구문은 상황에 민감합니다 (변수는 선언에 따라 변수가 다릅니다). 어쨌든 AST 이상을 원하는 이유에 대해 파싱 이후의 삶을 참조하십시오. http://www.semdesigns.com/Products/DMS/LifeAfterParsing.html –