標籤:

用EBNFParser解析JSON和Xml

如文圖。

左Xml,右JSON。

我覺得Xml不是上下文無關的。所以

<a>n<b>nxxxn</a>n</b>n

會把<a>和</b>配對, 把<b>和</a>配對...

其他倒是沒什麼問題。

一下是測試例子和結果。

testJSON.sh

JSON測試結果(該目錄包括語法定義文件和生成的Parser文件)

testXml.sh

XML測試結果(該目錄包括語法定義文件和生成的Parser文件)

我就解析著玩的,看看就好。

有啥難解析的告訴我一聲,我順手給你寫一個。


有人提到JSON沒解析常量,null, false, true, 和數字。。好吧是我忘了。

然後我發現挺不好寫的。所以我這樣做了,token直接把字元串拆成一個個字元,然後來解析。

正確解析的EEBNF的代碼如下(不好看,我要考慮加新功能了):

NEWLINE := Rnntrue ::= Kt Kr Ku Kenfalse ::= Kf Ka Kl Ks Kennull ::= Kn Ku Kl KlnNumber ::= Kd+ [K. Kd+] nConst ::= true | false | null | NumbernSpace := Ks+nS := R[^n"]nEscape := R nEscapeStr ::= Escape " nStr ::= " (S|Space|EscapeStr)* "nKeyValue Throw Space::= Atom : Space* Atom nDict Throw Space::= { Space* [KeyValue (Space* , Space*, KeyValue)*] Space* }nList Throw Space::= [ Space* [Atom (Space* , Space* Atom)*] Space* ]nAtom Throw Space::= Const | Str | Dict | List | Space* Atom Space*n

測試結果同上,已更新。

新功能預定如下:

  1. 字面量Parser不分配元信息和Parser名。

    之前沒注意到,這似乎確實是個冗餘。而我需要提高解析速度。考慮到token單純將字元串分成一個個字元的情況也是存在的。

  2. ParserGen的可選項添加左遞歸解析。對一個產生式做標註使得它可以進行左遞歸解析。這樣做的原因是默認支持左遞歸會使效率降低。

推薦閱讀:

乾貨 | 劫持各個瀏覽器中的JSON漏洞
豆瓣閱讀器通過 JSON 獲取文章內容,看到的數據格式是被混淆/加密的,這是通過什麼原理實現的?如何將其解碼?
大家一般用什麼工具測試HTTP,json介面?
你覺得python的字典和json差不多嗎?

TAG:Parser | JSON | XML |