Удаление комментария C с JavaCC

Я знаю, как пропустить эти комментарии, используя объявления SKIP, но все, что мне нужно сделать, это взять источник C и вывести тот же источник без комментариев.

Поэтому я объявил токен , который копируется в вывод, а комментарии не пропускаются. Я подозреваю, что этот токен принимает все данные для себя.

Может кто-то помочь мне, пожалуйста?

Спасибо

1 ответ

Решение

Не использовать (~[])+: это сожрет весь ваш вклад. Вероятно, поэтому вы не видели, чтобы токены пропускались.

В вашем режиме лексера по умолчанию измените на другое состояние, когда вы столкнетесь "/*" (начало многострочного комментария). И в этой другой статистике, либо совпадение "*/" (и вернемся к состоянию лексера по умолчанию), или сопоставим любой символ ~[] (не (~[])+!).

Небольшая демонстрация:

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>
}

Учитывая тестовый файл:

Test.java

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

Запустите демонстрацию следующим образом (при условии, что у вас есть файлы CommentStripParser.jj, Test.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"

и символьные литералы:

'"' // not the start of a string literal!
Другие вопросы по тегам