将 Pygments 正则表达式翻译成 JFlex

Posted

技术标签:

【中文标题】将 Pygments 正则表达式翻译成 JFlex【英文标题】:Translating a Pygments regexp to JFlex 【发布时间】:2017-05-19 20:30:44 【问题描述】:

我正在尝试在 JFlex 中为 Markdown 构建一个词法分析器;我正在查看 Pygments 的来源:

例如this是横线的规则:

(r'^\s*\n(?:\s*[-*_])3,\s*\n', Markdown.Markup)

我在我的.flex 文件中天真地写了这个:

^\s*\n(?:\s*[-*_])3,\s*\n  return token(TokenType.KEYWORD2); 

这只会给我错误:

Error in file "/home/hhrutz/Documents/devel/SyntaxPane/src/main/jflex/de/sciss/syntaxpane/lexers/markdown.flex" (line 294): 
Syntax error.
  ^\s*\n(?:\s*[-*_])3,\s*\n  return token(TokenType.KEYWORD2); 
         ^

Error in file "/home/hhrutz/Documents/devel/SyntaxPane/src/main/jflex/de/sciss/syntaxpane/lexers/markdown.flex" (line 294): 
Syntax error.
  ^\s*\n(?:\s*[-*_])3,\s*\n  return token(TokenType.KEYWORD2); 
                   ^

Error in file "/home/hhrutz/Documents/devel/SyntaxPane/src/main/jflex/de/sciss/syntaxpane/lexers/markdown.flex" (line 294): 
Unexpected character 
  ^\s*\n(?:\s*[-*_])3,\s*\n  return token(TokenType.KEYWORD2); 
                      ^
JFlex.GeneratorException: Generation aborted

【问题讨论】:

@Jan 是的,但我不知道如何解决它。你能帮我吗?例如,如果我只是删除?:,则关于3, 的下一个错误仍然存​​在。 例如,我可以写^\s*\n(\s*[-*_])3,99\s*\n,但根据Java patterns,我应该可以写3,。如何指定“至少出现 3 次”? 【参考方案1】:

似乎无法指定最小出现次数。这是我尝试实现"commonmark" 为水平规则指定的内容:

由 0-3 个缩进空格组成的行,后跟三个或更多匹配的 -_* 字符的序列,每个字符后跟任意数量的空格,形成一个主题中断.

space               = " "
spacesOpt           = [ ]*

^space0,3(\-spacesOpt\-spacesOpt(\-spacesOpt)+ | \*spacesOpt\*spacesOpt(\*spacesOpt)+ | \_spacesOpt\_spacesOpt(\_spacesOpt)+)\n  return ... 

有没有更好的表达方式?

【讨论】:

以上是关于将 Pygments 正则表达式翻译成 JFlex的主要内容,如果未能解决你的问题,请参考以下文章

一次性搞懂JavaScript正则表达式之语法

详解 Python3 正则表达式

什么是正则表达式

整列上的 Scala 正则表达式

Youtube 完整的 Java 正则表达式

Ruby 用捕获的正则表达式模式替换字符串