[英]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.