这种算法是哪种递归解析?自下而上还是自上而下?

时间:2015-04-25 13:15:25

标签: c algorithm parsing

我找到并使用了算法来解决我遇到的问题。目前的问题是我不确定这是自下而上还是自上而下。

我有以下语法:

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

当前算法的流程如下: 示例输入&#34;蓝色和html&#34;。

当它通过parsequery运行时,它将通过这个过程提供: parsequery-&GT; parseand-&GT; parseor-&GT; parseterm

在parseterm中,它将被发现在hasmap中。 Parseterm将返回一个带有&#34; blue&#34;的集合。 Parseterm还将使用qnext进一步迭代查询列表。

在parseor中我们现在有一个正在测试的新单词&#34; AND&#34;,它不是strcmp所以因此parseor返回term。

在parseand中它将是strcmp == 0所以它将被带入循环。将运行qnext,然后返回orterm set(&#34; blue&#34;)和递归parseand(index,iter)的交集。

html这个词也可以在hashmap中找到,并且该set将被返回到parseand。然后Parseand将返回&#34; blue&#34;的set_intersection。和&#34; html&#34;。

我真的不知道该怎么称呼这个解析。我已经阅读了预订和预订,pdf解析后的pdf,但我不确定。 我们从顶部开始,输入单词,但算法的设计会将单词发送到底部,然后再解析,然后重新开始工作。

很抱歉,如果这是一篇很长的帖子。我尽力解释我的问题。

1 个答案:

答案 0 :(得分:3)

在您的代码中,每个非终端符号都有一个过程,它根据语法规则递归调用解析其他非终端的过程。所以它是recursive descent parser。它从上到下构造解析树(隐式),这使它成为自上而下的解析器。附加信息的传播方式并不重要。