113 lines
3.8 KiB
Plaintext
113 lines
3.8 KiB
Plaintext
%{
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#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 <input file> <output file>\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;
|
|
}
|