用javacc解析块注释
我试图编写一些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; }
/**/
/* */
/* 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();}
}
现在,对于缺少的*/
,您不会得到词法错误,但会得到一个解析异常