用javacc解析块注释

用javacc解析块注释,java,parsing,lexical-analysis,javacc,Java,Parsing,Lexical Analysis,Javacc,我试图编写一些javacc语法来解析包含多行注释的文件,例如,以下内容都是有效的: /**/ /* */ /* This is a comment */ /* This is a multiline comment */ 如果*/没有关闭*/,或者关闭*/而没有打开/*,我希望解析失败 我不是想跳过注释,我希望注释可以作为标记使用 到目前为止,我已经尝试过这种方法,它可以工作,但在未关闭的情况下不会失败。/*: options { STATIC = false; }

我试图编写一些javacc语法来解析包含多行注释的文件,例如,以下内容都是有效的:

/**/
/* */
/* This is a comment */
/* This
   is
   a
   multiline
   comment
*/
如果
*/
没有关闭
*/
,或者关闭
*/
而没有打开
/*
,我希望解析失败

我不是想跳过注释,我希望注释可以作为标记使用

到目前为止,我已经尝试过这种方法,它可以工作,但在未关闭的情况下不会失败。
/*

options {
  STATIC = false;
}

PARSER_BEGIN(BlockComments)

package com.company;

public class BlockComments {}

PARSER_END(BlockComments)

TOKEN : { < START_BLOCK_COMMENT : "/*" >  : WITHIN_BLOCK_COMMENT }
<WITHIN_BLOCK_COMMENT> TOKEN: { < BLOCK_COMMENT: (~["*", "/"] | "*" ~["/"])+ > }
<WITHIN_BLOCK_COMMENT> TOKEN: { < END_BLOCK_COMMENT: "*/" > : DEFAULT }

SKIP : {
  "\n"
}

我尝试在第二个选项中使用
MORE:{”/*:inthew_BLOCK_COMMENT}
,它确保对unclosed
/*
的解析失败,但它使所有
BLOCK_COMMENT
标记都以我不想要的
/*
开头。

我不确定文件的其余部分是什么样子,因此,我将假设一个文件应该是一系列注释,前面、后面和之间由零个或多个空格和换行符分隔

我要做的是:

TOKEN : { < BLOCK_COMMENT_START : "/*" >  : WITHIN_BLOCK_COMMENT }
<WITHIN_BLOCK_COMMENT> TOKEN: { <CHAR_IN_COMMENT: ~[] > }
<WITHIN_BLOCK_COMMENT> TOKEN: { < END_BLOCK_COMMENT: "*/" > : DEFAULT }

SKIP : {
  "\n" | " " 
}
TOKEN:{:在\u BLOCK\u COMMENT}
令牌:{}
标记:{:DEFAULT}
跳过:{
“\n”|”
}
现在在解析器中,我们有了

void start() : {String s ; } {
    (
        s = comment()  {System.out.println(s); }
    )*
}

String comment() :
{   Token t ;
    StringBuffer b = new StringBuffer() ;
}
{  <START_BLOCK_COMMENT>
   (
         t=<CHAR_IN_COMMENT>  {b.append( t.image ) ; }
   )*
   <END_BLOCK_COMMENT>
   {return b.toString() ; }
}
void start():{String s;}{
(
s=comment(){System.out.println(s);}
)*
}
字符串注释():
{t;
StringBuffer b=新的StringBuffer();
}
{  
(
t={b.append(t.image);}
)*
{返回b.toString();}
}

现在,对于丢失的
*/
,您不会得到词法错误,但您会得到一个解析异常。

我不确定文件的其余部分是什么样子,因此我假设一个文件应该是一个注释序列,前面、后面和之间由零个或多个空格和换行分隔

我要做的是:

TOKEN : { < BLOCK_COMMENT_START : "/*" >  : WITHIN_BLOCK_COMMENT }
<WITHIN_BLOCK_COMMENT> TOKEN: { <CHAR_IN_COMMENT: ~[] > }
<WITHIN_BLOCK_COMMENT> TOKEN: { < END_BLOCK_COMMENT: "*/" > : DEFAULT }

SKIP : {
  "\n" | " " 
}
TOKEN:{:在\u BLOCK\u COMMENT}
令牌:{}
标记:{:DEFAULT}
跳过:{
“\n”|”
}
现在在解析器中,我们有了

void start() : {String s ; } {
    (
        s = comment()  {System.out.println(s); }
    )*
}

String comment() :
{   Token t ;
    StringBuffer b = new StringBuffer() ;
}
{  <START_BLOCK_COMMENT>
   (
         t=<CHAR_IN_COMMENT>  {b.append( t.image ) ; }
   )*
   <END_BLOCK_COMMENT>
   {return b.toString() ; }
}
void start():{String s;}{
(
s=comment(){System.out.println(s);}
)*
}
字符串注释():
{t;
StringBuffer b=新的StringBuffer();
}
{  
(
t={b.append(t.image);}
)*
{返回b.toString();}
}
现在,对于缺少的
*/
,您不会得到词法错误,但会得到一个解析异常