我正在尝试在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发布于 2017-05-20 05:41:51
似乎不可能指定出现的最小次数。以下是我尝试实现"commonmark"为水平规则指定的内容:
由0-3个空格缩进组成的行,后面跟着三个或更多匹配的
-、_或*字符序列,每个字符后面都有任意数量的空格,形成主题分隔符。
space = " "
spacesOpt = [ ]*
^{space}{0,3}(\-{spacesOpt}\-{spacesOpt}(\-{spacesOpt})+ | \*{spacesOpt}\*{spacesOpt}(\*{spacesOpt})+ | \_{spacesOpt}\_{spacesOpt}(\_{spacesOpt})+)\n { return ... }有没有更好的方式来表达呢?
https://stackoverflow.com/questions/44078554
复制相似问题