验证每个方法是否以注​​释开头

时间:2015-06-12 14:03:08

标签: javacc

我想验证每个方法MyFunction()是否以评论开头。所以我通过生产规则由Javacc生成了一个解析器。

jj文件的附加:

// here the comments of MyFunction()
  void  MyFunction : {}
{
<begin> <id> "(" (Argument ())* ")" {}
(Statement ()) *
<end>
}

void Argument:{}
{
<STRING> id
<STRING> id
}

void statement () {}
{
..........
}

如何在输入文件流中的程序源中声明MyFunction()之前使用正则表达式来验证是否存在注释。

1 个答案:

答案 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!" ) ;
    }
}