шош написал:
РЕДАКТИРОВАТЬ - То, что компилирует DSL, не мое. Это черный ящик, который я не хочу менять, и он не поддерживает комментарии. Я просто хочу добавить тонкую оболочку, чтобы она поддерживала комментарии.
В этом случае создайте очень простой лексер, который соответствует одному из трех токенов:
// ...
комментарии
- строковые литералы:
" ... "
- или, если ни один из приведенных выше совпадений, не соответствует ни одному символу
Теперь, пока вы повторяете эти 3 различных типа токенов, просто выведите токены (2) и (3) на стандартный вывод (или в файл), чтобы получить некомментированную версию вашего исходного файла.
Демонстрация с GNU Flex:
пример входного файла, in.txt :
someVariable = 12345; // assignment
// only a comment
someFunctionCall("Hello // world"); // call with a string
someOtherFunctionCall("Hello // \" world"); // call with a string and
// an escaped quote
Файл грамматики лексера, demo.l :
%%
"//"[^\r\n]* { /* skip comments */ }
"\""([^"]|[\\].)*"\"" {printf("%s", yytext);}
. {printf("%s", yytext);}
%%
int main(int argc, char **argv)
{
while(yylex() != 0);
return 0;
}
И чтобы запустить демо, сделайте:
flex demo.l
cc lex.yy.c -lfl
./a.out < in.txt
, который выведет на консоль следующее:
someVariable = 12345;
someFunctionCall("Hello // world");
someOtherFunctionCall("Hello // \" world");
EDIT
Я не очень знаком с C / C ++ и просто видел рекомендацию @ sehe об использовании препроцессора. Это выглядит намного лучше, чем создание собственного (маленького) лексера. Но я думаю, что я оставлю этот ответ, так как он показывает, как обрабатывать такие вещи, если нет препроцессора (по какой-то причине: возможно cpp
не распознает определенные части DSL?).