将 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的主要内容,如果未能解决你的问题,请参考以下文章