Программа Lex для удаления однострочного и многострочного комментария из заданного текста - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь написать программу lex, которая удалит как однострочный, так и многострочный комментарий.

%{
#include<stdio.h>
int single=0;
int multi=0;    
%}
%%
"//"([a-z]|[A-Z]|[0-9]|" ")* {++single;}
"/*"(.*\n)* "*/" {++multi;}
%%
int main(int argc, int **argv)
{
    yyin=fopen("abc.txt","r");
    yylex();
    printf("no of single line comment = %d ", single);
    printf("no of multi line comment = %d ", multi);
    return 0;
}

Эта программа не может удалить многострочный комментарий.

1 Ответ

0 голосов
/ 12 сентября 2018

Если в вашем файле abc.txt есть несколько многострочных комментариев, тогда ваш шаблон для многострочного комментария будет совпадать со всем между началом первого многострочного комментария и концом последнего многострочного комментария. Это происходит, когда lex демонстрирует жадное поведение и пытается найти самый длинный префикс входной строки. И ваш шаблон для многострочного комментария позволяет сопоставлять / * и * / (. * \ N) *

Кроме того, ваш код не будет обнаруживать однострочные комментарии, содержащие любые символы, кроме буквенно-цифровых символов и пробела (например,;; и т. Д.).

Измените ваши шаблонные действия на них, и это должно достичь вашей цели.

"//".*\n            { ++single; }
"/*"[^*/]*"*/"      { ++multi; }

Хотя приведенный выше код все равно оставит некоторые новые строки вместо удаленных многострочных комментариев. Это немного сложно, и я не могу найти быстрое решение, чтобы удалить эти новые строки.

Надеюсь, это поможет!

...