2017-08-11 24 views
6

Tôi đang sử dụng antlr v4 để trích xuất cây phân tích cú pháp của các chương trình java cho các mục đích khác. Tôi đã bắt đầu từ mẫu này: ANTLR v4 visitor sampleANTLR v4, JavaLexer và JavaParser trả về null làm phân tích cú pháp cây

Và tôi đã thử nghiệm các bước trên liên kết đưa ra để kiểm tra xem nó hoạt động và tất cả mọi thứ đi đúng:

java Run 
a = 1+2 
b = a^2 
c = a+b*(a-1) 
a+b+c 
^Z 
Result: 33.0 

Và sau đó tôi đã viết của riêng tôi để phân tích các chương trình java như kết cấu dưới đây:

|_Java.g4                
|_Java.tokens               
|_JavaBaseVisitor.java             
|_JavaLexer.java               
|_JavaLexer.tokens              
|_JavaParser.java              
|_JavaTreeExtractorVisitor.java           
|_JavaVisitor.java   
|_Run.java 

Và Run.java như sau:

import org.antlr.v4.runtime.*; 
import org.antlr.v4.runtime.tree.*; 

public class Run { 
    public static void main(String[] args) throws Exception { 
     CharStream input = CharStreams.fromFileName("F:\\Projects\\Java\\Netbeans\\ASTProj\\JavaTreeExtractor\\prog.java"); 
     JavaLexer lexer = new JavaLexer(input); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     JavaParser parser = new JavaParser(tokens); 
     ParseTree tree = parser.getContext(); 

     JavaTreeExtractorVisitor calcVisitor = new JavaTreeExtractorVisitor(); 
     String result = calcVisitor.visit(tree); 
     System.out.println("Result: " + result); 
    } 
} 

Nhưng tại tuyên bố ParseTree tree = parser.getContext(); đối tượng cây bị vô hiệu. Vì tôi mới dùng antlr, có đề xuất nào để tôi kiểm tra hay giải pháp nào không?

(Nếu cần thêm thông tin, chỉ cần thông báo cho tôi).

TG.

Trả lời

2

Giả sử bạn đang sử dụng ngữ pháp here, bạn muốn điểm khởi đầu cho phân tích một tập Java là

ParseTree tree = parser.compilationUnit(); 

(Đối với bất cứ ai không sử dụng ngữ pháp đó, bạn muốn bất cứ điều gì bạn đặt tên phân tích cú pháp top-level của bạn quy tắc.)

1

nên không được thực hiện:

ParseTree tree = parser.input(); 

như trong ví dụ máy tính?

+0

'ParseTree tree = parser.compilationUnit();' sẽ là điểm bắt đầu để phân tích cú pháp tệp Java. (Giả sử ngữ pháp Java [ở đây] (https://github.com/antlr/grammars-v4/blob/master/java/Java.g4)) –

+0

@BilltheLizard thanks.make đó là câu trả lời, vì vậy tôi có thể +1 nó –

+0

@BilltheLizard đúng. Vui lòng đăng bài này dưới dạng câu trả lời. Cảm ơn. – ConductedClever

Các vấn đề liên quan