2

SKIP 宣言を使用してこれらのコメントをスキップする方法は知っていますが、C ソースを取得して同じソースをコメントなしで出力するだけで済みます。

そこで、出力にコピーされるトークン <GENERIC_TEXT: (~[])+ > を宣言し、コメントはスキップされません。私は、このトークンがすべての入力を自分自身で受け取るのではないかと考えています。

誰か助けてくれませんか?

ありがとうございました

4

1 に答える 1

5

使用しない(~[])+でください。すべての入力をむさぼり食います。これがおそらく、トークンがスキップされていない理由です。

"/*"デフォルトの字句解析モードでは、(複数行のコメントの先頭) に遭遇したときに別の状態に変更します。そして、この別の統計では、一致"*/"する (そしてデフォルトのレクサー状態に戻る) か、任意の文字~[]( (~[])+! ではない) に一致します。

簡単なデモ:

CommentStripParser.jj

PARSER_BEGIN(CommentStripParser)

public class CommentStripParser {
  public static void main(String[] args) throws Exception {
    java.io.FileInputStream file = new java.io.FileInputStream(new java.io.File(args[0]));
    CommentStripParser parser = new CommentStripParser(file);
    parser.parse();
  }
}

PARSER_END(CommentStripParser)

TOKEN :
{
  < OTHER : ~[] >
}

SKIP :
{
  < "//" (~["\r", "\n"])* >
| < "/*" > : ML_COMMENT_STATE
}

<ML_COMMENT_STATE> SKIP :
{
  < "*/" > : DEFAULT
| < ~[] >   
}

void parse() :
{
  Token t;
}
{
  ( t=<OTHER> {System.out.print(t.image);} )* <EOF>
}

テストファイルが与えられた場合:

テスト.java

/*
 * comments
 */
class Test {
  // more comments
  int foo() {
    return 42;
  }
}

次のようにデモを実行します (ファイルCommentStripParser.jjTest.java、および JAR javacc.jarが同じディレクトリにあると仮定します)。

java -cp javacc.jar javacc CommentStripParser.jj
javac -cp . *.java
ジャバ -cp . CommentStripParser Test.java

以下がコンソールに出力されます。

class Test {

  int foo() {
    return 42;
  }
}

(もうコメントはありません)

次のような文字列リテラルを考慮する必要があることに注意してください。

"the following: /*, is not the start of a comment"

および char リテラル:

'"' // not the start of a string literal!
于 2012-12-20T11:03:07.723 に答える