我正在为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)*/}?
;
但我如何实现回顾后检查?我怎样才能检查整个字符串解析的开始或结束?
感谢您的咨询!我已经知道这两个实现。 Stackoverflow上的一个忽略斜体范围内的Markdown(并且它根本不实现粗体范围)。 Github上的那个被其作者称为“不可用”和“丑陋”。它在解析器中执行所有上下文相关的东西,这使解析器变得缓慢而复杂。 我认为,由于上下文敏感性,真的没有办法使用语义谓词。这可能不是最优雅的方式,但我认为它适合松散的Markdown类语法。 –