// 전달 된 입력 스트림에서 읽는 스캐너를 만듭니다. CSLexer lexer = new CSLexer (new ANTLRFileStream (f)); tokens.TokenSource = lexer;ANTLR을 사용하여 자체 C# 컴파일러 작성 : 컴파일 단위
// Create a parser that reads from the scanner
CSParser parser = new CSParser(tokens);
// start parsing at the compilationUnit rule
CSParser.compilation_unit_return x = parser.compilation_unit();
object ast = x.Tree;
x는 compilation_unit_return 유형의 루트, 클래스, 메소드 등을 추출하려면 어떻게해야합니까? 어댑터를 추출해야합니까? 어떻게해야합니까? compilation_unit_return가 (자동으로 ANTLR에 의해 생성되는) 내 CSParser에 같은 정의되어 있습니다 :
public class compilation_unit_return : ParserRuleReturnScope
{
private object tree;
override public object Tree
{
get { return tree; }
set { tree = (object) value; }
}
};
내가 무엇입니까 나무가 유형 객체이다 그러나. 디버거를 사용하여 실행하고 BaseTree 형식인지 보였다. 그러나 BaseTree는 인터페이스입니다! 어떻게 BaseTree와 관련이 있으며이 트리에서 세부 사항을 추출하는 방법을 모르겠습니다. 클래스, 메서드, 변수를 방문한 방문자를 작성해야합니다. ParserRuleReturn 클래스는 RuleReturnScope에서 확장되며 시작 및 중지 객체가 있습니다. 어떤 내용인지는 알 수 없습니다 ... , ANTLR이 제공하는 TreeVisitor 클래스가 혼란스러워 보인다. 어댑터가 생성자에 대한 매개 변수로 전달되어야합니다 (기본 CommonTreeAdaptor를 사용하지 않을 경우). 왜 어댑터 earer를 가져 오는 지 abt에게 묻습니다. 다른 문제도 있습니다 ... API에 대해서는 다음을 참조 할 수 있습니다. http://www.antlr.org/api/CSharp/annotated.html
이제 나는 여기에 맞 춥니 다. 대단히 감사합니다.
추상 클래스입니다 ... 공개 추상 클래스 BaseTree : ITree – yeeen
그래, 왜 당신을 막을까요? 트리의 루트 노드가 있습니다. 트리의 루트 노드가 있습니다. 트리의 루트 노드는 자식을 검색하는 데 필요한 모든 메서드를 포함하고 있으므로 트리를 임의의 깊이까지 이동하는 데 필요합니다. –