JavaCC

时间:2015-12-31 18:55:06

标签: java regex comments javacc

我正在尝试使用JavaCC为Javascript制作扫描程序。我有几个问题,其中一个是C风格的评论:/* … */我需要将评论作为标记返回。

这是一次尝试:

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

MLCOMMENT旨在匹配已结束的评论和MLCOMMENT_UNDELIM开放式评论。这不起作用,因为/*a*/b*/与MLCOMMENT的匹配时间比/*a*/更长。

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

$a = 0;

foreach ($array01 as $word) {
  echo '<a href="'.$array_url[$a].'"><li>'.$word.'</li></a>';
  $a++;
}