%{
#include <stdio.h>
#include <stdlib.h>
 
int ctIdentifier = 0;
int ctLine = 0;
int ctBlankLine = 0;
%}
 
/* Regular Expressions */
IDENTIFIER   [a-zA-Z_][a-zA-Z0-9_]*
EOL          \n
WS           [ \t]+
%%
/* Identifier rule */
{IDENTIFIER}   { ctIdentifier++; }
 
/* Blank line: consists only of spaces/tabs followed by newline */
^{WS}*{EOL}    { ctBlankLine++; ctLine++; }
 
/* End of line (non-blank) */
{EOL}          { ctLine++; }
 
/* Ignore other characters */
.              { /* Do nothing */ }
%%
 
int yywrap() {
    return 1;
}
 
int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Usage:\n\t./a.out <FILENAME>\n");
        exit(0);
    }
 
    yyin = fopen(argv[1], "r");
    if (!yyin) {
        perror("Error opening file");
        exit(1);
    }
 
    yylex();
 
    printf("Identifier Count: %d\n", ctIdentifier);
    printf("Total Lines: %d\n", ctLine);
    printf("Blank Lines: %d\n", ctBlankLine);
 
    fclose(yyin);
    return 0;
}
 
				JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCmludCBjdElkZW50aWZpZXIgPSAwOwppbnQgY3RMaW5lID0gMDsKaW50IGN0QmxhbmtMaW5lID0gMDsKJX0KCi8qIFJlZ3VsYXIgRXhwcmVzc2lvbnMgKi8KSURFTlRJRklFUiAgIFthLXpBLVpfXVthLXpBLVowLTlfXSoKRU9MICAgICAgICAgIFxuCldTICAgICAgICAgICBbIFx0XSsKJSUKLyogSWRlbnRpZmllciBydWxlICovCntJREVOVElGSUVSfSAgIHsgY3RJZGVudGlmaWVyKys7IH0KCi8qIEJsYW5rIGxpbmU6IGNvbnNpc3RzIG9ubHkgb2Ygc3BhY2VzL3RhYnMgZm9sbG93ZWQgYnkgbmV3bGluZSAqLwpee1dTfSp7RU9MfSAgICB7IGN0QmxhbmtMaW5lKys7IGN0TGluZSsrOyB9CgovKiBFbmQgb2YgbGluZSAobm9uLWJsYW5rKSAqLwp7RU9MfSAgICAgICAgICB7IGN0TGluZSsrOyB9CgovKiBJZ25vcmUgb3RoZXIgY2hhcmFjdGVycyAqLwouICAgICAgICAgICAgICB7IC8qIERvIG5vdGhpbmcgKi8gfQolJQoKaW50IHl5d3JhcCgpIHsKICAgIHJldHVybiAxOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICBpZiAoYXJnYyAhPSAyKSB7CiAgICAgICAgcHJpbnRmKCJVc2FnZTpcblx0Li9hLm91dCA8RklMRU5BTUU+XG4iKTsKICAgICAgICBleGl0KDApOwogICAgfQoKICAgIHl5aW4gPSBmb3Blbihhcmd2WzFdLCAiciIpOwogICAgaWYgKCF5eWluKSB7CiAgICAgICAgcGVycm9yKCJFcnJvciBvcGVuaW5nIGZpbGUiKTsKICAgICAgICBleGl0KDEpOwogICAgfQoKICAgIHl5bGV4KCk7CgogICAgcHJpbnRmKCJJZGVudGlmaWVyIENvdW50OiAlZFxuIiwgY3RJZGVudGlmaWVyKTsKICAgIHByaW50ZigiVG90YWwgTGluZXM6ICVkXG4iLCBjdExpbmUpOwogICAgcHJpbnRmKCJCbGFuayBMaW5lczogJWRcbiIsIGN0QmxhbmtMaW5lKTsKCiAgICBmY2xvc2UoeXlpbik7CiAgICByZXR1cm4gMDsKfQo=