Удаление комментария 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!