هل من الممكن استخدام محلل النزول المتكرر لكل من القواعد وبناء شجرة التحليل في نفس الوقت؟

StackOverflow https://stackoverflow.com/questions/2419972

سؤال

هل من الممكن توليد شجرة تحليل في نفس الوقت حيث يمكنني استخدام محلل النسب المتكرر للتحقق مما إذا كانت البيانات تطابق القواعد؟

إذا كان الأمر كذلك، فما النهج الذي أستخدمه لبناء شجرة كما أصل جديها؟

شكرا، بودا كودم.

ملاحظة: أنا جديد في التحليل. (سأل عدة أسئلة حول ذلك بالفعل، وأنا أتحسن معها.)

هل كانت مفيدة؟

المحلول

انه من الممكن. كيفية القيام بذلك سوف تعتمد على التنفيذ الذي تريده. إليك عينة قد تعمل من أجلك:

أولا، حدد عقدة الخاص بك:

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);
}

بعد ذلك، ستحتاج إلى دمج ذلك في وظائف النسب الخاصة بك:

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);
  }
}

عندما تنزل شجرة التحليل الخاصة بك، من المحتمل أن ترغب في إرسال عقدة "الجذر" الجديدة، بحيث يمكن إضافة الأطفال إليها. بدلاً عن ذلك، parseSubtree يمكن إنشاء وإرجاع عقدة، والتي سيتم بعد ذلك إضافتها إلى عقدة الجذر.

يمكنك بناء أي شجرة تحليل أو شجرة مجردة بسيطة باستخدام العملية المذكورة أعلاه. نظرا لأن وظيفة التحليل ترجع عقدة الجذر، والتي ستشير إلى أي وعقد جميع الأطفال، سيكون لديك حق الوصول الكامل إلى شجرة التحليل بعد التحليل.

سواء كنت تستخدم شجرة تحليل غير متجانسة أو متجانسة، فستحتاج إلى طريقة لتخزين معلومات كافية لجعلها مفيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top