Q:
我的lexer逻辑需要使用什么?只有regex或者lexer的特殊函数?
我的q multi-comment语法中的错误在哪里?
详细信息:
我正在尝试为k/q/kdb+(wiki,q/kdb+)编写intellij idea插件,我的插件基于另一个k语言idea插件。
首先,我尝试使用JLxer编写lexer(这是idea-plugin的标准方式)。我需要支持q lang评论。我有多行评论的问题。
我的flex文件(这种语法不稳定):
LINE_WS=[ tf]
WHITE_SPACE={LINE_WS}+
NEWLINE=r|n|rn
MULTY_COMMENT={NEWLINE} / {WHITE_SPACE}* {NEWLINE} (([^rn\][^rn]* {NEWLINE})|{NEWLINE})* \
// ...
<YYINITIAL> {
{WHITE_SPACE} { return com.intellij.psi.TokenType.WHITE_SPACE; }
{MULTY_COMMENT} { return COMMENT; }
// ...
q语言注释的语法(查看更多):
有效注释:
/ this is comment
x: 1; / after '/' we see comment, spaces are important
/ this is a comment
/ after single "/" - all lines are comment if we don't find: NEW_LINE + ""
无效注释:
/ this is't a comment, break line is important
x: 1;/ this is't a comment, spaces are important
this is't a comment /
链接:
- k idea插件的Flex文件(不支持多行注释)
- k lang的Vim扩展
- 用于k和q的qkdt编辑器的Lexer
在此处下载并尝试xml文件:http://www.timestored.com/b/kdb-code-highlighting-in-intellij/
这段代码描述了JFlex的类似q的多行注释:
LINE_WS=[ tf]
WHITE_SPACE={LINE_WS}+
NEWLINE=r|n|rn
MULTY_COMMENT=/ {WHITE_SPACE}* {NEWLINE} (([^rn\][^rn]* {NEWLINE})|{NEWLINE})* \
// ...
<YYINITIAL> {
{WHITE_SPACE} { return com.intellij.psi.TokenType.WHITE_SPACE; }
^{MULTY_COMMENT} { return COMMENT; }
// ...