我想验证每个方法MyFunction()
是否以评论开头。所以我通过生产规则由Javacc生成了一个解析器。
jj文件的附加:
// here the comments of MyFunction()
void MyFunction : {}
{
<begin> <id> "(" (Argument ())* ")" {}
(Statement ()) *
<end>
}
void Argument:{}
{
<STRING> id
<STRING> id
}
void statement () {}
{
..........
}
如何在输入文件流中的程序源中声明MyFunction()
之前使用正则表达式来验证是否存在注释。
答案 0 :(得分:0)
您可以做的是将评论视为特殊代币。特殊标记不会传递给解析器,但可以从下一个常规标记访问它们。
假设注释是特殊标记,空格被跳过,输入是
"/*Floyd*/ /*Ummagumma*/ begin pink() end"
每个标记都有一个.next
指针(图中右侧)和一个.specialToken
指针(图中向下)。 (空指针未显示。)
begin --> id ---> ( --> ) --> end ---> EOF
|
V
comment("Ummagumma")
|
V
comment("Floyd")
所以你可以做的是查看方法的第一个标记。之前是否有特殊令牌?如果是这样,那个特殊的标记是评论吗?
SKIP : { " ", "\n", "\r" }
MORE: { "/*" : IN_COMMENT }
<IN_COMMENT> MORE { ~[] }
<IN_COMMENT> SPECIAL_TOKEN{ <COMMENT: "*/"> }
.
.
.
void FunctionDefinition : {
Token firstToken, id;}
{
firstToken=<begin> id=<id> "(" (Argument ())* ")"
(Statement ()) *
<end>
{ if( firstToken.specialToken == null
|| firstToken.specialToken.kind != COMMENT )
System.out.println("Function " +id.image+
" is not preceded by a comment!" ) ;
}
}