Tôi đang cố gắng viết một đoạn mã sẽ lấy một trình phân tích cú pháp ANTLR4 và sử dụng nó để tạo các AST cho các đầu vào tương tự với các mã được đưa ra bởi tùy chọn -tree trên grun (misc.TestRig
). Tuy nhiên, tôi cũng muốn cho đầu ra bao gồm tất cả thông tin về số/bù đắp dòng.Làm cách nào để in ấn và in số dòng sản phẩm bằng cách sử dụng ANTLR4?
Ví dụ, thay vì in
(add (int 5) '+' (int 6))
Tôi muốn để có được
(add (int 5 [line 3, offset 6:7]) '+' (int 6 [line 3, offset 8:9]) [line 3, offset 5:10])
Hoặc một cái gì đó tương tự.
Không có số lượng lớn ví dụ về khách truy cập cho ANTLR4, nhưng tôi khá chắc chắn tôi có thể thực hiện hầu hết việc này bằng cách sao chép triển khai mặc định cho toStringTree
(được sử dụng bởi grun). Tuy nhiên, tôi không thấy bất kỳ thông tin nào về số dòng hoặc bù trừ.
tôi mong đợi để có thể viết mã siêu đơn giản như thế này:
String visit(ParseTree t) {
return "(" + t.productionName + t.visitChildren() + t.lineNumber + ")";
}
nhưng nó dường như không thể đơn giản này. Tôi đoán tôi sẽ có thể nhận được thông tin số dòng từ trình phân tích cú pháp, nhưng tôi đã không tìm ra cách làm như vậy. Làm thế nào tôi có thể lấy số dòng/bù đắp thông tin trong quá trình truyền tải của mình?
Để điền vào vài chỗ trống trong các giải pháp dưới đây, tôi sử dụng:
List<String> ruleNames = Arrays.asList(parser.getRuleNames());
parser.setBuildParseTree(true);
ParserRuleContext prc = parser.program();
ParseTree tree = prc;
để có được những tree
và ruleNames
. program
là tên cho sản xuất hàng đầu trong ngữ pháp của tôi.
Có 2 ' phương thức toStringTree'. Người ta lấy một cá thể 'Parser', nhưng cái kia chỉ lấy một' List 'của các tên quy tắc. –
@ 280Z28: Bạn nêu rõ sự thật. Gọi 'toStringTree' với một đối số phân tích cú pháp làm cho việc triển khai thực hiện lấy danh sách các quy tắc (' recog.getRuleNames() ') và chuyển nó vào' toStringTree' lấy một 'List'. Ở mức nào, điều này vẫn không giải thích làm thế nào để có được số dòng/bù đắp thông tin trong khi viết một khách truy cập. –