【问题标题】:Translating a Pygments regexp to JFlex将 Pygments 正则表达式翻译成 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 次”?

标签: python regex pygments jflex


【解决方案1】:

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

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

space               = " "
spacesOpt           = [ ]*

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

有没有更好的表达方式?

【讨论】:

    猜你喜欢
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多