實現一個markdown解析器需要具備那些知識?


如果是玩具 markdown 的話, html 基礎+一門腳本語言+基本的正則表達式就可以了... 最初的 markdown 就是一些 Perl 腳本 gsub 出來的.

如果是認真的 markdown, 需要的知識就多一些了...

  • well-defined 語法: 很難... markdown 語法很多地方都沒有定義細緻, 可以照著 http://commonmark.org 的 spec 做.

  • 要快: 通常是在瓶頸里加點 C 優化.

  • 支持 latex 公式不? 通過什麼方式支持 latex 公式? 命令行? mathjax? 還是自己渲染?

  • 支持實時渲染不? 例如 Gitbook 和 Atom 的 markdown 預覽, 在用戶改幾個字以後不需要更新整個文檔而只更新一小部分, 用戶體驗就很流暢. 實時渲染嘛, 如果學過點文檔視圖結構的基礎知識, 就很自然寫得出來.

不過編譯原理其實不需要多少, 會寫一個最簡單的遞歸下降語法解析器就能搞斜體里嵌入粗體再嵌下劃線之類情況...

按本人造輪子的經驗, 有點難的地方就是縮進語法了, 例如列表裡再縮進就會變成二級列表, 三級列表... 塊引用和代碼塊也是縮進塊, 縮進的語法嵌套起來, 其語義還得思考一下.

參考 CommonMark Spec


可以參考一下 GitHub - fletcher/MultiMarkdown-5: Reference implementation of MultiMarkdown; replaces MultiMarkdown v4 這個C實現的Markdown解釋器。

這個實現在句法分析時使用了 GitHub - ooc-lang/greg: a recursive-descent parser generator for PEG 這個遞歸下降語法解析器。

Markdown 從出現到現在都沒有組織出來進行一個標準化,在原始版本衍生出來許多的實現,這些實現在細節方面都摻雜了很多實現者的理解或需求。我自己使用過比較多的 Markdown 編輯器,如Mac下的 Byword、iA Writer、Day One、Ulysses、Mou(微笑~)、MacDown、MWeb還有Windows 下的MarkdownPad,在線的Cmd Markdown,StackEdit、馬克飛象等等,對這個混亂現象的感受尤深,我個人對這些編輯器在一些細節上的實現不甚滿意。可能是我書寫的內容根本就不應該選擇Markdown。

說這些其實是想要說的是,實現一個Markdown解釋器現在一個有很多的工具和例子,出於效率的考慮,可以參考上面所說的 C + 遞歸下降語法解釋器 的例子,但其實更加重要的是:對Markdown語法的定義以及語義的思考,怎樣在功能和表達方式的簡潔之間做一個取捨。


剛好寫過一個markdown轉html的開源軟體,回答一下。根據我的經歷,邏輯清晰,能寫得一手強迫症代碼,比較了解markdown的語法規則,就差不多了。上面回答有提到要掌握什麼語言,其實都無所謂。用你最熟悉的語言即可。

如果有興趣,可以看下我寫的這個cevin15/MDTool,用的是Java。


發現一個GitHub - weareoutman/markdoc: An online markdown editor

供參考


Wizmann/mkd · GitHub

做一半做不下去了。。。233

輕噴,第一次寫。。。難免新手。。。


首先正則是少不了的,html+css前段你得會,然後就是寫解析器的語言了,比如C


推薦閱讀:

如何在編程中更好地踩坑與進步?
全局靜態變數,互斥信號量等在內存中是怎麼處理?
shift reduce,預測分析,遞歸下降分析(這是解析方法)和LL(K) LR(K) SLR以LALR的關係?
C++ template 為什麼不能推導返回值類型?
什麼編譯器優化技術可以把FP語言里的sum [1..n]的效率優化到C語言的水平?

TAG:解釋器 | Markdown | 編譯原理 |