簡體   English   中英

這種算法是哪種遞歸解析?自下而上還是自上而下?

[英]Which kind of recursive parsing is this algorithm? Bottom-up or top-down?

我找到並使用了一種算法來解決我遇到的問題。 目前的問題是我不確定這是自下而上還是自上而下。

我有以下語法:

query   ::= andterm 
        | andterm "ANDNOT" query
andterm ::= orterm
        | orterm "AND" andterm
orterm  ::= term
        | term "OR" orterm
term    ::= "(" query ")" 
        | <word>

因此,我有以下代碼:

struct index {
   hashmap *map;
   char *qword;
}

void querynext(iter, index) {
  if (list_hasnext(iter)) {
    index->qword = list_next(iter);
  }
  else index->qword = "";
 }

set_t *parsequery(index, iter) {
   set_t *andterm;
   andterm = parseand(index, iter);

   if(strcmp(index->qword, "ANDNOT") == 0) {
     qnext(iter, index);
     return set_different(andterm, parsequery(index, iter)):
   }
   else return andterm;
}

set_t *parseand(index, iter) {
   set_t *orterm;
   orterm = parseor(index, iter);
   if(strcmp(index->qword, "AND") == 0) {
     qnext(iter, index);
     return set_intersection(orterm, parseand(index, iter));
   }
   else return orterm;
}

set_t *parseor(index, iter) {
   set_t *term;
   term = parseterm(index, iter);
   if(strcmp(index->qword, "OR") == 0) {
      qnext(iter, index);
      return set_difference(term, parseor(index, iter));
   }
   else return term;
}

set_t *parseterm(index, iter) {
 if(strcmp(index->qword, "(") == 0) {
    qnext(iter, index);
    set_t *parseset = parsequery(index, iter);
    if(strcmp(index->qword, ")") == 0) {
       qnext(iter, index);
       return perseset;
    }
 }

 if(map_haskey(index->map, index->qword)) {
    set_t *parsekey;
    parsekey = map_get(index->map, index->qword);
    qnext(iter, index);
    return parsekey;
 }
 else {
    set_t emptyset;
    emptyset = set_create;
    return empty;
 }
}

當前算法的流程如下:“blue AND html”的示例輸入。

當它通過parsequery運行時,它將通過這個過程提供:parsequery-> parseand-> parseor-> parseterm。

在parseterm中,它將被發現在hasmap中。 Parseterm將返回一個“藍色”的集合。 Parseterm還將使用qnext進一步迭代查詢列表。

在parseor中,我們現在將有一個正在測試的新單詞“AND”,它不是strcmp所以因此parseor返回term。

在parseand中它將是strcmp == 0所以它將被帶入循環。 將運行qnext,然后返回orterm set(“blue”)和遞歸parseand(index,iter)的交集。

html這個詞也可以在hashmap中找到,該set將返回到parseand。 然后Parseand將返回“blue”和“html”的set_intersection。

我真的不知道該怎么稱呼這個解析。 我已閱讀預訂並預訂,pdf解析后的pdf,但我不確定。 我們從頂部開始,輸入單詞,但算法的設計會將單詞發送到底部,然后再解析為parseterm,然后重新開始工作。

對不起,如果這是一篇很長的帖子。 我盡力解釋我的問題。

在您的代碼中,每個非終端符號都有一個過程,它根據語法規則遞歸調用解析其他非終端的過程。 所以它是一個遞歸下降解析器 它從上到下構造解析樹(隱式),這使它成為自上而下的解析器。 附加信息的傳播方式並不重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM