I think im done with everything in this exercise, just didnt add the code for octal/hexadecimal character constants.
Looks preety much perfected to me...
If anyone feels like testing and trying to find an error heres the code:
(would appreciate any feedback from a pro )
Code:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int c;
enum states { normal,
squote, squote2, squote3, squote4, squote_escape,
comment_entry, comment, comment_exit, comment_exit2, comment2,
dquote, dquote_escape,
octal, hexa};
int state = normal;
int second; /* stores the tmp character after slash */
int flag=0; /* if 1, puts the character stored in second */
while((c=getchar())!=EOF)
{
if(state == normal && c=='\'') { state = squote; }
else if(state == normal && c=='"') { state = dquote; }
else if(state == normal && c=='/')
{
second=getchar();
if(second=='*')
{
ungetc(c, stdin);
state = comment;
}
else if(second=='/')
{
ungetc(c, stdin);
state = comment2;
}
else if(second=='\'') {state = squote; }
else if(second=='"') { state = dquote; }
else flag=1;
}
else if(state == comment && c=='*') { state = comment_exit; }
else if(state == comment) {}
else if(state == comment_exit && c=='*') {}
else if(state == comment_exit && c=='/') { putchar(' '); state = comment_exit2; }
else if(state == comment_exit) { state = comment; }
else if(state == comment2 && c=='\n') { state = normal; }
else if(state == comment2) { }
else if(state == squote && c=='\n') { state = normal; }
else if(state == squote && c=='\t') { state = squote4; }
else if(state == squote && c=='\'') { state = normal; }
else if(state == squote && c=='\\') { state = squote_escape; }
else if(state == squote) { state = squote2; }
else if(state == squote_escape && c=='\n') { state = normal; }
else if(state == squote_escape && c=='\t') { state = squote4; }
else if(state == squote_escape && (c>='0' && c<='7')) { state = octal; }
else if(state == squote_escape && c=='x') { state = hexa; }
else if(state == squote_escape) { state = squote2; }
else if(state == squote2 && c=='\'') { state = normal; }
else if(state == squote2 && c=='\n') { state = normal; }
else if(state == squote2 && c=='\t') { state = squote4; }
else if(state == squote2 && c=='\\') { state = squote3; }
else if(state == squote2) { state = squote4; }
else if(state == squote3 && c=='\n') { state = normal; }
else if(state == squote3 && c=='\t') { state = squote4; }
else if(state == squote3) { state = squote4; }
else if(state == squote4 && c=='\\') { state = squote3; }
else if(state == squote4 && c=='\n') { state = normal; }
else if(state == squote4 && c=='\t') { }
else if(state == squote4 && c=='\'') { state = normal; }
else if(state == squote4) { }
else if(state == dquote && c=='\n') { state = normal; }
else if(state == dquote && c=='"') { state = normal; }
else if(state == dquote && c=='\\') { state = dquote_escape; }
else if(state == dquote) { }
else if(state ==dquote_escape) { state = dquote; }
if(state == normal ||
state == squote || state == squote2 || state == squote3 || state == squote4 || state == squote_escape ||
state == dquote || state == dquote_escape || state == octal || state == hexa &&
state!=comment_exit2)
putchar(c);
if(state==comment_exit2) { state = normal; }
if(flag==1) { flag=0; putchar(second); }
}
printf("Press any key to continue");
getchar();
return 0;
}