JavaCC 中的多行注释

Multiline comments in JavaCC

我正在尝试使用 JavaCC 为 Javascript 制作一个扫描器。我有几个问题,其中之一是 C 风格的注释:/* … */ 我需要 return 注释作为标记。

这是一次尝试:

TOKEN: {<MLCOMMENT:          "/*"        ( ~["*"] | ("*"(~["/"])?) )* "*/">}
TOKEN: {<MLCOMMENT_UNDELIM: ("/*"|"/*/") ( ~["/"] | (~["*"]"/")    )*     >}

MLCOMMENT 旨在匹配封闭式评论和 MLCOMMENT_UNDELIM 开放式评论。这不起作用,因为 /*a*/b*//*a*/.

与 MLCOMMENT 的匹配时间更长

这是解决此问题的另一种尝试:

MORE:
{
    "/*" : WithinMLComment
}
< WithinMLComment > TOKEN :
{
    < MLCOMMENT: "*/" > : DEFAULT
}
< WithinMLComment > MORE :
{
    < ~[] >
}

这也不起作用,因为开放式注释会在 WithinMLComment 状态中导致 EOF。这是非法的(抛出 TokenMgrError)。

更新: 我可能已经找到解决方案:

TOKEN: {<MLCOMMENT:         ("/*"|"/*/") ( ~["/"] | (~["*"]"/") )* "*/">}
TOKEN: {<MLCOMMENT_UNDELIM: ("/*"|"/*/") ( ~["/"] | (~["*"]"/") )*     >}

更新二: 这不是解决方案。 /**// 将匹配 MLCOMMENT_UNDELIM。

对于多行注释,您可以使用

"/*" (~["*"])* "*" (~["*","/"] (~["*"])* "*" | "*")* "/"

对于缺少最后一个“*/”的多行注释,您可以使用

"/*" ( ~["*"] | ("*")+ ~["*","/"] )* ("*")*