我正在尝试在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
答案 0 :(得分:0)
似乎无法指定最小出现次数。这是我尝试实现"commonmark"为水平规则指定的内容:
由0-3个缩进空格组成的行,后跟三个或更多匹配
-
,_
或*
个字符的序列,每个字符可选地跟随任意数量的空间,形成一个主题突破。
space = " "
spacesOpt = [ ]*
^{space}{0,3}(\-{spacesOpt}\-{spacesOpt}(\-{spacesOpt})+ | \*{spacesOpt}\*{spacesOpt}(\*{spacesOpt})+ | \_{spacesOpt}\_{spacesOpt}(\_{spacesOpt})+)\n { return ... }
有没有更好的表达方式?