Có, có thể. Làm thế nào để làm như vậy sẽ phụ thuộc vào việc thực hiện bạn muốn. Dưới đây là một mẫu có thể làm việc cho bạn:
Thứ nhất, xác định nút của bạn:
class ParseTreeNode {
private final String name;
private final List<ParseTreeNode> children = /* new */;
public ParseTreeNode(String name) {
this.name = name;
}
public void addChild(ParseTreeNode child) {
children.add(child);
}
Tiếp theo, bạn sẽ cần phải tích hợp đó vào chức năng gốc đệ quy của bạn:
class RDParser {
ParseTreeNode parse(Input input) {
ParseTreeNode root = createParseTreeNodeNamed("Root")
switch (input.nextToken()) {
case OPT1:
root.addChild(createParseTreeNodeNamed("Opt1"));
break;
case OPT2:
while (/*someCondition*/) {
root.addChild(createParseTreeNodeNamed("Opt2-sibling" + /* i */));
}
case SUBTREE:
ParseTreeNode subtree = createParseTreeNodeNamed("Subtree");
root.addChild(subtree);
parseSubtree(subtree, input);
break;
default:
error("Input %s was not in the expected first/follow sets", input.nextToken());
}
}
void parseSubtree(ParseTreeNode node, Input input) {
node.addChild(createParseTreeNodeNamed("subtree-child"));
/* ... */
}
/* and other functions do similarly */
ParseTreeNode createParseTreeNodeNamed(String name) {
return new ParseTreeNode(name);
}
}
Như bạn xuống cây phân tích cú pháp của bạn, có thể bạn sẽ muốn gửi bất kỳ nút "root" mới nào để trẻ có thể được thêm vào nó. Ngoài ra, parseSubtree
có thể tạo và trả về một nút, sau đó sẽ được thêm vào nút gốc.
Bạn có thể tạo cây phân tích hoặc cây trừu tượng đơn giản bằng cách sử dụng quy trình trên. Vì hàm phân tích cú pháp trả về nút gốc, nút này sẽ tham chiếu bất kỳ và tất cả các nút con, bạn sẽ có toàn quyền truy cập vào cây phân tích cú pháp sau khi phân tích cú pháp.
Cho dù bạn sử dụng cây phân tích không đồng nhất hoặc đồng nhất, bạn sẽ cần một cách để lưu trữ thông tin đầy đủ để làm cho nó hữu ích.
Nguồn
2010-03-10 20:01:54
Câu trả lời hay, Kaleb. Nó đã giúp tôi đi ngay lập tức, và tôi nghĩ rằng tôi sẽ có thể viết nó ngay bây giờ bản thân mình! Nhưng bạn có thể vui lòng làm rõ sự khác biệt giữa "cây phân tích cú pháp" và "cây trừu tượng", và "không đồng nhất" và "đồng nhất" phân tích cây? (Tôi không biết sự khác biệt nhưng tôi rất muốn biết!) – bodacydo
đồng nhất - Một cây bao gồm cùng một loại nút. không đồng nhất - Một cây bao gồm các nút của các loại khác nhau. Một cây phân tích đại diện cho cấu trúc của dữ liệu đầu vào và thường chứa cú pháp không cần thiết. Một cây cú pháp trừu tượng là một cây duy trì cấu trúc và thông tin cần thiết nhưng loại bỏ cấu trúc hoặc cú pháp không cần thiết. Tôi đã sửa đổi bài đăng của mình để cho thấy cây phát triển sâu hơn như thế nào - tôi hy vọng điều đó sẽ rõ ràng. –
Cảm ơn bạn đã giải thích! Tôi đã thực hiện. :) Tôi sẽ hỏi nếu tôi gặp khó khăn. Cây của tôi sẽ trừu tượng, cây không đồng nhất. :) – bodacydo