作为更广泛项目的一部分,我在c ++中编写了一个Json类,它能够在树形层次结构中解析和存储json文档结构。 该类使用词法分析器来标记json文本源文件和一组简单的解析方法来构建json树。然后可以使用经典树遍历算法浏览已解析的json,必要时进行修改,最后将其重写为json文本文件。
我现在正在寻找一种方法来重用解析方法集来在扫描输入Json文件时执行不同的操作。例如,我希望能够创建Json指针集,而不是构建Json树。在同一个班级内。
由于我花了一段时间来调试解析算法,我一直在寻找一种方法来重用解析方法,同时更改在找到特定令牌时要执行的操作。
作为一个例子,当解析器到达一个标识标识与关键Json元素相关的标量值(string,number,true,false,null)的标记时,我希望能够创建并附加一个叶树节点到json树,或者计算json指针字符串,该字符串标识Json文档中的特定键,而不复制解析代码或插入一系列“if then else”或“switch”语句。
以下是其中一种解析方法的代码:parse_value()
template void JSONDoc::parse_value(void){ string trimmedsymvalue; trimmedsymvalue=SYMVALUE; if(trimmedsymvalue.size() >= 2 && SYM != "NUMBER" && SYM != "NULL") trimmedsymvalue = trimmedsymvalue.substr(1, trimmedsymvalue.size() - 2); if(SYM == "STRING"){ CREATE_LEAF_NODE(JSONNode::NODE_STRING,trimmedsymvalue); return; } // ..... if(SYM == "LCBRKT"){ parse_object(); return; } if(SYM == "LSBRKT"){ parse_array(); return; } }
在上面的方法中,对CREATE_LEAF_NODE(JSONNode :: NODE_STRING,trimmedsymvalue)的调用为json树创建了一个叶节点。 为了能够计算Json指针而不是将叶子附加到Json树,在代码中的这一点,我将不得不添加“if then else”或“switch”语句。
在这种特殊情况下,添加不会显着影响代码可读性,但在解析阶段构建json树所需的操作可能会更复杂,并且添加“if then else”或“switch”语句将导致一个不易维护的代码。
实现这一点是否有意义而不会混淆或复制大部分代码?
F。