用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
測試結果同上,已更新。
新功能預定如下:
- 字面量Parser不分配元信息和Parser名。之前沒注意到,這似乎確實是個冗餘。而我需要提高解析速度。考慮到token單純將字元串分成一個個字元的情況也是存在的。
- ParserGen的可選項添加左遞歸解析。對一個產生式做標註使得它可以進行左遞歸解析。這樣做的原因是默認支持左遞歸會使效率降低。
推薦閱讀:
※乾貨 | 劫持各個瀏覽器中的JSON漏洞
※豆瓣閱讀器通過 JSON 獲取文章內容,看到的數據格式是被混淆/加密的,這是通過什麼原理實現的?如何將其解碼?
※大家一般用什麼工具測試HTTP,json介面?
※你覺得python的字典和json差不多嗎?