%{ #include #include #include #include "lang.tab.h" // Define YYSTYPE structure extern YYSTYPE yylval; extern int yydebug; // Declare yydebug // Token definitions // File pointers FILE *yyin, *yyout; %} %% "int"|"char"|"void" { fprintf(yyout, "SIMPLETYPE\n"); return SIMPLETYPE; } "class" { fprintf(yyout, "CLASS\n"); return CLASS; } "entry" { fprintf(yyout, "ENTRY\n"); return ENTRY; } "if" { fprintf(yyout, "IF\n"); return IF; } "while" { fprintf(yyout, "WHILE\n"); return WHILE; } "write" { fprintf(yyout, "WRITE\n"); return WRITE; } "read" { fprintf(yyout, "READ\n"); return READ; } "return" { fprintf(yyout, "RETURN\n"); return RETURN; } "{" { fprintf(yyout, "LBRACE\n"); return LBRACE; } "}" { fprintf(yyout, "RBRACE\n"); return RBRACE; } "(" { fprintf(yyout, "LPAREN\n"); return LPAREN; } ")" { fprintf(yyout, "RPAREN\n"); return RPAREN; } "[" { fprintf(yyout, "LBRACKET\n"); return LBRACKET; } "]" { fprintf(yyout, "RBRACKET\n"); return RBRACKET; } "+" { fprintf(yyout, "PLUS\n"); return PLUS; } "-" { fprintf(yyout, "MINUS\n"); return MINUS; } "*" { fprintf(yyout, "MULT\n"); return MULT; } "/" { fprintf(yyout, "DIV\n"); return DIV; } "=" { fprintf(yyout, "ASSIGN\n"); return ASSIGN; } "==" { fprintf(yyout, "EQ\n"); return EQ; } "<" { fprintf(yyout, "LT\n"); return LT; } "<=" { fprintf(yyout, "LE\n"); return LE; } ">" { fprintf(yyout, "GT\n"); return GT; } ">=" { fprintf(yyout, "GE\n"); return GE; } ";" { fprintf(yyout, "SEMICOLON\n"); return SEMICOLON; } "." { fprintf(yyout, "DOT\n"); return DOT; } "," { fprintf(yyout, "COMMA\n"); return COMMA; } [0-9]+ { yylval.intval = atoi(yytext); fprintf(yyout, "CONSTANTEXP %d\n", yylval.intval); return CONSTANTEXP; } [a-zA-Z_][a-zA-Z0-9_]* { yylval.strval = strdup(yytext); fprintf(yyout, "IDENTIFIER %s\n", yylval.strval); return IDENTIFIER; } [ \t\n]+ { /* Ignore spaces and tabs */ } \r\n { /* Increment line count if needed */ } . { fprintf(yyout, "Unknown character: %s\n", yytext); } %% int main(int argc, char **argv) { if (argc < 3) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } // Open input and output files yyin = fopen(argv[1], "r"); if (!yyin) { perror("Failed to open input file"); return 1; } yyout = fopen(argv[2], "w"); if (!yyout) { perror("Failed to open output file"); fclose(yyin); return 1; } int token; while ((token = yylex()) != 0) { // Process tokens } fclose(yyin); fclose(yyout); yyin = fopen(argv[1], "r"); if (!yyin) { perror("Failed to open input file"); return 1; } yyout = stdout; if (!yyout) { perror("Failed to open output file"); fclose(yyin); return 1; } // Close files // printf("%d\n", yylex()); // printf("%d\n", yylex()); // printf("%d\n", yylex()); // printf("%d\n", yylex()); yydebug = 1; if (yyparse() == 0) { printf("Parsing successful\n"); } else { printf("Parsing failed\n"); } fclose(yyin); fclose(yyout); return 0; }