2017-03-18 34 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类语法。 –

相关问题