我不知道JsonParser将导出什么。但是一般来说,解析某些内容,然后从AST数据结构中导出AST形式,读取AST,然后从读取的AST中提取值似乎只是为了构建和维护大量开销的过程。
你应该将JSON解析器构建到你的应用程序中,将JSON解析为AST数据结构,然后直接处理该AST结构。JSON足够简单,你可以编写自己的递归下降解析器来解析JSON并构建AST,这会让你回到第一个解决方案。请参见https://dev59.com/v3E95IYBdhLWcg3wlu6z#2336769
如果你非常坚持要导出它,你可以找到现成的工具来完成这个任务。我们的DMS软件重新工程工具包可以做到这一点,尽管对于这种应用程序来说可能有点笨重。
JSON的一个好处就是其简单的语法。以下是DMS使用的语法:
JSON_text = ;
JSON_text = JSON_text object ;
JSON_text = JSON_text array ;
object = '{' name_value_pair_list '}' ;
name_value_pair_list = ;
name_value_pair_list = name_value_pair_list ',' ;
name_value_pair_list = name_value_pair_list name_value_pair ;
name_value_pair = STRING ':' value ;
array = '[' value_list ']' ;
value_list = value ;
value_list = value_list ',' value ;
value_list = value_list ',' value ',' ;
value = STRING ;
value = NUMBER_INT ;
value = NUMBER_FLOAT ;
value = object ;
value = array ;
value = 'true' ;
value = 'false' ;
value = 'null' ;
是的,它几乎完全匹配OP提供的抽象语法。
现在,你可以使用以下命令要求DMS解析文件并导出其AST:
run ..\DomainParser +AST ..\..\..\Examples\One.js
对于包含此文本的JSON文件One.js:
{
"from": "http://json.org/example.html"
}
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
<rest of file snipped>
解析器生成一个S-表达式:
(JSON_text@JSON=2
(JSON_text@JSON=2
(JSON_text@JSON=2
(JSON_text@JSON=2
|(JSON_text@JSON=2
| (JSON_text@JSON=2
| (JSON_text@JSON=1
| (object@JSON=4
| (name_value_pair_list@JSON=7
| |(name_value_pair_list@JSON=5
| |(name_value_pair@JSON=8
| | (STRING@JSON=24
| | (STRING@JSON=24
| |)name_value_pair
| )name_value_pair_list
| )object
| )JSON_text
| (object@JSON=4
| (name_value_pair_list@JSON=7
| (name_value_pair_list@JSON=5
| (name_value_pair@JSON=8
| |(STRING@JSON=24
| |(object@JSON=4
| | (name_value_pair_list@JSON=7
| | (name_value_pair_list@JSON=6
| | (name_value_pair_list@JSON=7
| | |(name_value_pair_list@JSON=5
| | |(name_value_pair@JSON=8
| | | (STRING@JSON=24
| | | (STRING@JSON=24
| | |)name_value_pair
| | )name_value_pair_list
| | )name_value_pair_list
| | (name_value_pair@JSON=8
| | (STRING@JSON=24
| | (object@JSON=4
| | |(name_value_pair_list@JSON=7
| | | (name_value_pair_list@JSON=6
| | | (name_value_pair_list@JSON=7
| | | (name_value_pair_list@JSON=5
| | | (name_value_pair@JSON=8
| | | |(STRING@JSON=24
| | | |(STRING@JSON=24
| | | )name_value_pair
| | | )name_value_pair_list
| | | )name_value_pair_list
| | | (name_value_pair@JSON=8
| | | (STRING@JSON=24
| | | (object@JSON=4
| | | (name_value_pair_list@JSON=7
| | | |(name_value_pair_list@JSON=5
| | | |(name_value_pair@JSON=8
| | | | (STRING@JSON=24
| | | | (object@JSON=4
| | | | (name_value_pair_list@JSON=7
| | | | (name_value_pair_list@JSON=6
| | | | |(name_value_pair_list@JSON=7
| | | | | (name_value_pair_list@JSON=6
| | | | | (name_value_pair_list@JSON=7
| | | | | (name_value_pair_list@JSON=6
| | | | | |(name_value_pair_list@JSON=7
| | | | | | (name_value_pair_list@JSON=6
| | | | | | (name_value_pair_list@JSON=7
| | | | | | (name_value_pair_list@JSON=6
| | | | | | |(name_value_pair_list@JSON=7
| | | | | | | (name_value_pair_list@JSON=6
| | | | | | | (name_value_pair_list@JSON=7
| | | | | | | (name_value_pair_list@JSON=5
| | | | | | | (name_value_pair@JSON=8
| | | | | | | |(STRING@JSON=24
| | | | | | | |(STRING@JSON=24
| | | | | | | )name_value_pair
| | | | | | | )name_value_pair_list
| | | | | | | )name_value_pair_list
| | | | | | | (name_value_pair@JSON=8
| | | | | | | (STRING@JSON=24
| | | | | | | (STRING@JSON=24
| | | | | | | )name_value_pair
| | | | | | |)name_value_pair_list
我已经截取了输出,因为没有人真正想要“看到”这棵树。现在,树中有很多“额外”的内容,如节点位置、源行号,这些都可以轻松地消除或忽略。