2017-03-18 31 views
1

我正在爲Markdown-like語法構建解析器,並且目前正在努力實現對粗體和斜體文本範圍的強大支持。我想「翻譯」下的正則表達式進行了大膽範圍的開始到ANTLR4詞法語法(表達式從降價的語法高亮的Atom編輯拍攝):如何在Markdown-like語法中實現lookbehead和lookahead以獲得粗體和斜體文本範圍?

(?<=^|[^\w\d\*])\*\*(?!$|\*|\s) 

正回顧後檢查如果「**」序列位於字符串的起始位置,或者前面沒有字母,數字或另一個星號。負向前視檢查序列是否在字符串結尾之前,並且沒有跟着另一個星號或任何空格字符。

我已經瞭解到,我必須使用語義斷言在ANTLR4做一個前瞻(使用_input.LA(1)),做這樣的事情:

ASTERISK_BOLD_START 
     : { /*Lookbehind checks*/}? '**' {/*Lookahead checks with _input.LA(1)*/}? 
     ; 

但我如何實現回顧後檢查?我怎樣才能檢查整個字符串解析的開始或結束?

回答

0

請勿使用正則表達式來創建解析器語法。這兩種技術的工作方式都不相同,您可以輕易向錯誤的方向移動你做了很多後視和展望的想法是一個錯誤的方向。這是(複雜的)正則表達式的典型,但不是普通的解析器。而是看看其他語法作者編寫的內容。有one grammar here at SOAntmark over there at Github。你也可以從EBNF for Markdown開始,並從中創建你的語法。

但是,由於某些麻煩,請準備好紅外線。 Markdown不是一個無上下文語法,因此很難解析。博客文章Why isn't there a formal grammar for Markdown?解釋了一些細節。

+0

感謝您的諮詢!我已經知道這兩個實現。 Stackoverflow上的一個忽略斜體範圍內的Markdown(並且它根本不實現粗體範圍)。 Github上的那個被其作者稱爲「不可用」和「醜陋」。它在解析器中執行所有上下文相關的東西,這使解析器變得緩慢而複雜。 我認爲,由於上下文敏感性,真的沒有辦法使用語義謂詞。這可能不是最優雅的方式,但我認爲它適合鬆散的Markdown類語法。 –

相關問題