kpk@gitpyr.UUCP (Kevin P. Kleinfelter) (09/22/86)
A little while ago, I posted a request for a program to check for possible confusion of "=" and "==". Several people requested that I post/mail such a program when found. I received a very nice program which performed the required check, however it also checked for consistent indentation (in a manner inconsistent with my preferred style). After a little thought, I wrote the following program. It isn't very smart, but it is about as simple a program as I can imagine to solve the problem. Cut the remainder of this message into the 3 files indicated. Run "lex" on the ".l" file, and run "cc" on the ".c" file (and of course, on lex's output). Note: The version of lex that I use is public domain, and a little different from Unix lex. You may have to fiddle with "yyline" or other lex details to get it to work properly. If you have any problems, mail them to me, and I'll see if I can help. ================= equalch.c ================================================= /* main program to check for use of "=" in a C program when "==" intended */ #include "equalchk.h" extern int yyline; main () { int token; int comment_in_progress = 0; int paren_nesting_level = 0; yyline = 1; while(token=yylex()) { switch(token) { case StartComment: if (comment_in_progress) { printf("%d WARNING: nested comment\n",yyline); } comment_in_progress = 1; break; case EndComment: comment_in_progress = 0; break; case LeftParen: if (comment_in_progress) { break; } paren_nesting_level++; break; case RightParen: if (comment_in_progress) { break; } if (paren_nesting_level <= 0) { printf("%d ERROR: unmatched right parenthesis\n",yyline); break; } paren_nesting_level--; break; case Equal: if (paren_nesting_level > 0) { printf("%d WARNING: possible misuse of \"==\"\n",yyline); } break; } } } ================ equalchk.h ================================================ /* defines for including by equalch.lxi for C ==/= checker */ #define StartComment 300 #define EndComment 301 #define LeftParen 302 #define RightParen 303 #define Equal 304 ================ equalchk.l ================================================= %{ #include "equalchk.h" extern int yylval; extern int yyline; %} %% "/*" {yylval=StartComment;return(StartComment);} "*/" {yylval=EndComment;return(EndComment);} "(" {yylval=LeftParen;return(LeftParen);} ")" {yylval=RightParen;return(RightParen);} "==" {;} "=" {yylval=Equal;return(Equal);} [\012] {yyline++;} [\001-\177] {;} %%