Files
2025-02-06 20:33:26 +02:00

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;
}