将Pygments正则表达式转换为JFlex

时间:2017-05-19 20:30:44

标签: python regex pygments jflex

我正在尝试在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

1 个答案:

答案 0 :(得分:0)

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

  

由0-3个缩进空格组成的行,后跟三个或更多匹配-_*个字符的序列,每个字符可选地跟随任意数量的空间,形成一个主题突破。

space               = " "
spacesOpt           = [ ]*

^{space}{0,3}(\-{spacesOpt}\-{spacesOpt}(\-{spacesOpt})+ | \*{spacesOpt}\*{spacesOpt}(\*{spacesOpt})+ | \_{spacesOpt}\_{spacesOpt}(\_{spacesOpt})+)\n { return ... }

有没有更好的表达方式?