Header files updated
This commit is contained in:
@ -11,35 +11,16 @@
|
|||||||
// 4️⃣ Rule end-markers (;, |) should always be 4 spaces in.
|
// 4️⃣ Rule end-markers (;, |) should always be 4 spaces in.
|
||||||
// 5️⃣ C-blocks should always be clearly defined and follow clang formatting rules.
|
// 5️⃣ C-blocks should always be clearly defined and follow clang formatting rules.
|
||||||
// 6️⃣ 1-line if/for/while statements must be wrapped in curly braces.
|
// 6️⃣ 1-line if/for/while statements must be wrapped in curly braces.
|
||||||
// 7️⃣ DO NOT USE TABS. EVER.
|
// 7️⃣ Comments should always be above rules
|
||||||
|
// 8️⃣ DO NOT USE TABS. EVER.
|
||||||
|
|
||||||
// Please ask Scarlett if you are unsure of how to format something. Thanks! 😀
|
// Please ask Scarlett if you are unsure of how to format something. Thanks! 😀
|
||||||
|
|
||||||
%{
|
%{
|
||||||
#include <stdio.h>
|
|
||||||
#include "../src/symbol_table.c"
|
#include "../src/symbol_table.c"
|
||||||
#include <math.h>
|
|
||||||
extern int yylex(void);
|
|
||||||
void yyerror(const char *err);
|
void yyerror(const char *err);
|
||||||
extern char* yytext;
|
|
||||||
extern int yyleng;
|
|
||||||
extern int yychar;
|
|
||||||
extern SymbolTable * cur;
|
|
||||||
//char* cur_value;
|
|
||||||
//char* cur_type;
|
|
||||||
int token_tracker;
|
int token_tracker;
|
||||||
extern int line_number;
|
|
||||||
extern int column_number;
|
|
||||||
extern FILE * yyin;
|
|
||||||
extern TableNode* funprime;
|
|
||||||
extern TableNode* arrayprim;
|
|
||||||
extern TableNode* recprime;
|
|
||||||
extern TableNode* funtypeprime;
|
|
||||||
extern TableNode* integ;
|
|
||||||
extern TableNode* addr;
|
|
||||||
extern TableNode* chara;
|
|
||||||
extern TableNode* stri;
|
|
||||||
extern TableNode* boo;
|
|
||||||
TableNode * tn;
|
TableNode * tn;
|
||||||
%}
|
%}
|
||||||
|
|
||||||
@ -144,7 +125,7 @@ definition:
|
|||||||
printdebug("Currently see a record definition for %s", $<words>2);
|
printdebug("Currently see a record definition for %s", $<words>2);
|
||||||
tn = CreateEntry(getAncestor(cur), recprime, $2, CreateRecordInfo(0, cur = CreateScope(cur, 0, 0)));
|
tn = CreateEntry(getAncestor(cur), recprime, $2, CreateRecordInfo(0, cur = CreateScope(cur, 0, 0)));
|
||||||
if (table_lookup(getAncestor(cur), $2) == undefined) {
|
if (table_lookup(getAncestor(cur), $2) == undefined) {
|
||||||
printdebug("rec not found ");
|
printdebug("rec not found");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dblock
|
dblock
|
||||||
@ -196,7 +177,7 @@ definition:
|
|||||||
}
|
}
|
||||||
if (node == undefined) {
|
if (node == undefined) {
|
||||||
printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column);
|
printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column);
|
||||||
} else if(getAdInfoType(node) != TYPE_FUNCTION_DECLARATION) {
|
} else if (getAdInfoType(node) != TYPE_FUNCTION_DECLARATION) {
|
||||||
printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column);
|
printdebug("function not declared at line %d, column %d", @1.first_line, @1.first_column);
|
||||||
} else {
|
} else {
|
||||||
setStartLine(node, @1.first_line);
|
setStartLine(node, @1.first_line);
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
%option noyywrap
|
%option noyywrap
|
||||||
%option header-file="flex.h"
|
%option header-file="flex.h"
|
||||||
%option yylineno
|
%option yylineno
|
||||||
|
|
||||||
%{
|
%{
|
||||||
#include <stdbool.h>
|
|
||||||
#include "../tmp/grammar.tab.h"
|
#include "../tmp/grammar.tab.h"
|
||||||
#include "../src/symbol_table.h"
|
#include "../src/symbol_table.h"
|
||||||
#ifndef DEBUG
|
#ifndef DEBUG
|
||||||
|
13
src/runner.c
13
src/runner.c
@ -2,17 +2,6 @@
|
|||||||
/* The Translators - Spring 2025 */
|
/* The Translators - Spring 2025 */
|
||||||
|
|
||||||
#include "runner.h"
|
#include "runner.h"
|
||||||
extern TableNode *funprime;
|
|
||||||
extern TableNode *arrayprim;
|
|
||||||
extern TableNode *integ;
|
|
||||||
extern TableNode *addr;
|
|
||||||
extern TableNode *chara;
|
|
||||||
extern TableNode *stri;
|
|
||||||
extern TableNode *boo;
|
|
||||||
extern bool DEBUG;
|
|
||||||
extern char *COLOR_YELLOW;
|
|
||||||
extern char *COLOR_BLUE;
|
|
||||||
extern char *COLOR_WHITE;
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
// if last argument is debug then set to true and ignore it for the rest
|
// if last argument is debug then set to true and ignore it for the rest
|
||||||
@ -91,10 +80,12 @@ void incr(int lnum, int cnum, int tok) {
|
|||||||
// column_number += yyleng;
|
// column_number += yyleng;
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_tok(int tok) {
|
void print_tok(int tok) {
|
||||||
fprintf(tok_flag, "%d %d %3d \"%s\"\n", line_number, column_number, tok,
|
fprintf(tok_flag, "%d %d %3d \"%s\"\n", line_number, column_number, tok,
|
||||||
yytext);
|
yytext);
|
||||||
}
|
}
|
||||||
|
|
||||||
int run(FILE *alpha) {
|
int run(FILE *alpha) {
|
||||||
int token;
|
int token;
|
||||||
top = cur = init(CreateScope(NULL, 1, 1));
|
top = cur = init(CreateScope(NULL, 1, 1));
|
||||||
|
46
src/runner.h
46
src/runner.h
@ -25,30 +25,56 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "../tmp/flex.h"
|
#include "../tmp/flex.h"
|
||||||
#include "symbol_table.h"
|
|
||||||
// #include "typedefs.h"
|
|
||||||
#include "../tmp/grammar.tab.h"
|
#include "../tmp/grammar.tab.h"
|
||||||
|
#include "symbol_table.h"
|
||||||
|
|
||||||
extern int line_number, column_number;
|
extern int line_number, column_number;
|
||||||
extern char *yytext;
|
extern char *yytext;
|
||||||
extern FILE *yyin;
|
extern FILE *yyin;
|
||||||
int arg;
|
extern bool DEBUG;
|
||||||
|
|
||||||
SymbolTable *top;
|
SymbolTable *top;
|
||||||
SymbolTable *cur;
|
SymbolTable *cur;
|
||||||
|
|
||||||
// int main(int argc, char* argv[]);
|
|
||||||
char *is_tok(int argc, char *argv[]);
|
|
||||||
// int is_alpha_file(char *file, int file_len);
|
|
||||||
|
|
||||||
FILE *alpha_file;
|
FILE *alpha_file;
|
||||||
FILE *tok_flag = NULL;
|
FILE *tok_flag = NULL;
|
||||||
FILE *st_flag = NULL;
|
FILE *st_flag = NULL;
|
||||||
|
bool DEBUG = false;
|
||||||
int no_flag = 0;
|
int no_flag = 0;
|
||||||
|
int arg;
|
||||||
|
|
||||||
|
TableNode *funprime;
|
||||||
|
TableNode *arrayprim;
|
||||||
|
TableNode *integ;
|
||||||
|
TableNode *addr;
|
||||||
|
TableNode *chara;
|
||||||
|
TableNode *stri;
|
||||||
|
TableNode *boo;
|
||||||
|
TableNode *recprime;
|
||||||
|
TableNode *funtypeprime;
|
||||||
|
TableNode *undefined;
|
||||||
|
|
||||||
int main(int argc, char *argv[]);
|
int main(int argc, char *argv[]);
|
||||||
|
int check_flag(char *arg, char *alpha);
|
||||||
|
void incr(int lnum, int cnum, int tok);
|
||||||
|
void print_tok(int tok);
|
||||||
|
int run(FILE *alpha);
|
||||||
|
bool is_help(char *input);
|
||||||
int new_file(char *arg, char *alpha);
|
int new_file(char *arg, char *alpha);
|
||||||
int is_alpha_file(char *alpha, int file_len);
|
int is_alpha_file(char *alpha, int file_len);
|
||||||
bool is_help(char *input);
|
|
||||||
int run(FILE *alpha);
|
char *COLOR_RED = "\033[0;31m";
|
||||||
int check_flag(char *arg, char *alpha);
|
char *COLOR_GREEN = "\033[0;32m";
|
||||||
|
char *COLOR_ORANGE = "\033[0;33m";
|
||||||
|
char *COLOR_BLUE = "\033[0;34m";
|
||||||
|
char *COLOR_PURPLE = "\033[0;35m";
|
||||||
|
char *COLOR_CYAN = "\033[0;36m";
|
||||||
|
char *COLOR_LIGHTGRAY = "\033[0;37m";
|
||||||
|
char *COLOR_DARKGRAY = "\033[1;30m";
|
||||||
|
char *COLOR_LIGHTRED = "\033[1;31m";
|
||||||
|
char *COLOR_LIGHTGREEN = "\033[1;32m";
|
||||||
|
char *COLOR_YELLOW = "\033[1;33m";
|
||||||
|
char *COLOR_LIGHTBLUE = "\033[1;34m";
|
||||||
|
char *COLOR_LIGHTPURPLE = "\033[1;35m";
|
||||||
|
char *COLOR_LIGHTCYAN = "\033[1;36m";
|
||||||
|
char *COLOR_WHITE = "\033[1;37m";
|
@ -3,44 +3,6 @@
|
|||||||
|
|
||||||
#include "symbol_table.h"
|
#include "symbol_table.h"
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
char *typey = "type";
|
|
||||||
char *funy = "function";
|
|
||||||
TableNode *funprime;
|
|
||||||
TableNode *arrayprim;
|
|
||||||
extern SymbolTable *cur;
|
|
||||||
TableNode *integ;
|
|
||||||
TableNode *addr;
|
|
||||||
TableNode *chara;
|
|
||||||
TableNode *stri;
|
|
||||||
TableNode *boo;
|
|
||||||
TableNode *recprime;
|
|
||||||
TableNode *funtypeprime;
|
|
||||||
TableNode *undefined;
|
|
||||||
|
|
||||||
char *COLOR_RED = "\033[0;31m";
|
|
||||||
char *COLOR_GREEN = "\033[0;32m";
|
|
||||||
char *COLOR_ORANGE = "\033[0;33m";
|
|
||||||
char *COLOR_BLUE = "\033[0;34m";
|
|
||||||
char *COLOR_PURPLE = "\033[0;35m";
|
|
||||||
char *COLOR_CYAN = "\033[0;36m";
|
|
||||||
char *COLOR_LIGHTGRAY = "\033[0;37m";
|
|
||||||
char *COLOR_DARKGRAY = "\033[1;30m";
|
|
||||||
char *COLOR_LIGHTRED = "\033[1;31m";
|
|
||||||
char *COLOR_LIGHTGREEN = "\033[1;32m";
|
|
||||||
char *COLOR_YELLOW = "\033[1;33m";
|
|
||||||
char *COLOR_LIGHTBLUE = "\033[1;34m";
|
|
||||||
char *COLOR_LIGHTPURPLE = "\033[1;35m";
|
|
||||||
char *COLOR_LIGHTCYAN = "\033[1;36m";
|
|
||||||
char *COLOR_WHITE = "\033[1;37m";
|
|
||||||
|
|
||||||
bool DEBUG = false;
|
|
||||||
|
|
||||||
void printdebug_impl(char *file, int line, const char *format, ...);
|
|
||||||
|
|
||||||
void printdebug_impl(char *file, int line, const char *format, ...) {
|
void printdebug_impl(char *file, int line, const char *format, ...) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
printf("%s<%s> [%d]%s ", COLOR_DARKGRAY, file, line,
|
printf("%s<%s> [%d]%s ", COLOR_DARKGRAY, file, line,
|
||||||
@ -53,87 +15,6 @@ void printdebug_impl(char *file, int line, const char *format, ...) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define printdebug(format, ...) \
|
|
||||||
printdebug_impl(__FILE__, __LINE__, format, ##__VA_ARGS__)
|
|
||||||
|
|
||||||
// AdInfo *Undefined_function_type_info;
|
|
||||||
typedef enum {
|
|
||||||
// First 4 below are primitive types that are all encapsulated in
|
|
||||||
// primitive type
|
|
||||||
// TYPE_INTEGER,
|
|
||||||
// TYPE_CHARACTER,
|
|
||||||
// TYPE_BOOLEAN,
|
|
||||||
// TYPE_ADDRESS,
|
|
||||||
// Type String is an array of char enclosed in double quotes per lexer
|
|
||||||
TYPE_STRING = 1,
|
|
||||||
// Array can be multidimensional. Information should be stored here.
|
|
||||||
// This is the type of the array
|
|
||||||
TYPE_ARRAY_TYPE = 2,
|
|
||||||
// Record is user defined types
|
|
||||||
TYPE_RECORD_TYPE = 3,
|
|
||||||
// Declaring what type a particular function is without as
|
|
||||||
TYPE_FUNCTION_DECLARATION = 4,
|
|
||||||
// Declaring what type a particular function is with as
|
|
||||||
// TYPE_AS_FUNCTION_DECLARATION,
|
|
||||||
// Declaring what type a function is (what the parameters and output
|
|
||||||
// are)
|
|
||||||
TYPE_FUNCTION_TYPE = 5,
|
|
||||||
// The Type being pointed to by the first 4 above that only stores the
|
|
||||||
// size
|
|
||||||
TYPE_PRIMITIVE = 6,
|
|
||||||
// likely NULL
|
|
||||||
TYPE_ALL_ELSE = 7,
|
|
||||||
TYPE_UNDEFINED = 8,
|
|
||||||
TYPE_RECORD = 9,
|
|
||||||
TYPE_ARRAY = 10
|
|
||||||
|
|
||||||
} types;
|
|
||||||
|
|
||||||
/* put in symbol_table.h
|
|
||||||
typedef struct{
|
|
||||||
int size; if(strcmp(getType(tn),getName(integ))==0){
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}primitive_info;
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
int length;
|
|
||||||
char* location;
|
|
||||||
}string_info;
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
int numofdimensions;
|
|
||||||
//the above value tells you how long the below array is. For example if num
|
|
||||||
of dimensions is 5, I can store 1,3,2,5,9 to define > int* sizesofdimensions;
|
|
||||||
TableNode* typeofarray;
|
|
||||||
}array_info;
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
//similar to above we define a record to hold the number of elements and an
|
|
||||||
array of tablenodes (types) that it contains in the order specified by the user
|
|
||||||
int numofelements;
|
|
||||||
TableNode* listoftypes;
|
|
||||||
}record_info;
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
int startlinenumber;
|
|
||||||
bool regularoras;
|
|
||||||
}function_declaration_info;
|
|
||||||
|
|
||||||
typedef struct{
|
|
||||||
TableNode* parameter;
|
|
||||||
TableNode* returntype;
|
|
||||||
}function_type_info;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
PrimAdInfo* primitive_info;
|
|
||||||
ArrayAdInfo* array_info;
|
|
||||||
RecAdInfo* record_info;
|
|
||||||
StringAdInfo* string_info;
|
|
||||||
FunDecAdInfo* func_dec_info;
|
|
||||||
FunTypeAdInfo* func_type_info;
|
|
||||||
}AdInfo;
|
|
||||||
*/
|
|
||||||
// primitive additional info only stores the size of that type
|
// primitive additional info only stores the size of that type
|
||||||
AdInfo *CreatePrimitiveInfo(int size) {
|
AdInfo *CreatePrimitiveInfo(int size) {
|
||||||
|
|
||||||
@ -167,19 +48,10 @@ int getPrimSize(TableNode *definition) {
|
|||||||
return definition->additionalinfo->PrimAdInfo->size;
|
return definition->additionalinfo->PrimAdInfo->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
// probably don't need the below structure since can create from an array
|
|
||||||
/*string_info* CreateStringInfo(int length, char* loc){
|
|
||||||
string_info* stringy = (string_info*)malloc(sizeof(string_info));
|
|
||||||
stringy.length=length;
|
|
||||||
char* location = loc;
|
|
||||||
return stringy;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Only information stored in array info is the number of dimensions and the
|
// Only information stored in array info is the number of dimensions and the
|
||||||
// type stored in the array per professor, the actual size of the array is
|
// type stored in the array per professor, the actual size of the array is
|
||||||
// calculated at runtime so bounds checking only needs to be done then
|
// calculated at runtime so bounds checking only needs to be done then
|
||||||
AdInfo *CreateArrayInfo(int dim, /*int* sizes,*/ TableNode *type) {
|
AdInfo *CreateArrayInfo(int dim, TableNode *type) {
|
||||||
if (type == NULL) {
|
if (type == NULL) {
|
||||||
printdebug("passed a NULL reference to "
|
printdebug("passed a NULL reference to "
|
||||||
"CreateArrayInfo. Invalid.");
|
"CreateArrayInfo. Invalid.");
|
||||||
@ -866,41 +738,7 @@ SymbolTable *setColumnNumber(SymbolTable *st, int column) {
|
|||||||
st->Line_Number = column;
|
st->Line_Number = column;
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
//we use false for type defs and true for functions for parameter of typeOf
|
|
||||||
TableNode* Define(SymbolTable* table, bool typeOf, char* id) {
|
|
||||||
if(table ==NULL || table->Parent_Scope != NULL){
|
|
||||||
printdebug("No valid table given for header defs");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
TableNode* newEntry = (TableNode*)malloc(sizeof(TableNode));
|
|
||||||
|
|
||||||
//possible issues with referencing text instead of heap
|
|
||||||
if(typeOf == 0){
|
|
||||||
newEntry->theType = typey;
|
|
||||||
}
|
|
||||||
if (typeOf == 1){
|
|
||||||
newEntry->theType = funy;
|
|
||||||
}
|
|
||||||
if(table_lookup(table,id) != NULL){
|
|
||||||
printdebug("already defined at the top level, can't define duplicate
|
|
||||||
names"); return NULL;
|
|
||||||
}
|
|
||||||
newEntry->theName = id;
|
|
||||||
if (table->entries == NULL) {
|
|
||||||
table->entries = newEntry;
|
|
||||||
return newEntry;
|
|
||||||
} else {
|
|
||||||
TableNode* oldEntry = table->entries;
|
|
||||||
table->entries = newEntry;
|
|
||||||
newEntry->next = oldEntry;
|
|
||||||
return newEntry;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
// only check table that is given
|
// only check table that is given
|
||||||
TableNode *table_lookup(SymbolTable *table, char *x) {
|
TableNode *table_lookup(SymbolTable *table, char *x) {
|
||||||
if (table == NULL) {
|
if (table == NULL) {
|
||||||
@ -915,6 +753,7 @@ TableNode *table_lookup(SymbolTable *table, char *x) {
|
|||||||
}
|
}
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check current table and all parents
|
// check current table and all parents
|
||||||
TableNode *look_up(SymbolTable *table, char *x) {
|
TableNode *look_up(SymbolTable *table, char *x) {
|
||||||
if (table == NULL) {
|
if (table == NULL) {
|
||||||
@ -931,60 +770,7 @@ TableNode *look_up(SymbolTable *table, char *x) {
|
|||||||
x, getLine(table), getColumn(table));
|
x, getLine(table), getColumn(table));
|
||||||
return look_up(table->Parent_Scope, x);
|
return look_up(table->Parent_Scope, x);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
void print_symbol_table(SymbolTable *table, FILE *file_ptr) {
|
|
||||||
|
|
||||||
if (table->Parent_Scope == NULL) {
|
|
||||||
fprintf(file_ptr, "%-17s: %-6s : %-6s : %-21s: %-28s\n", "NAME",
|
|
||||||
"SCOPE", "PARENT", "TYPE", "Extra annotation");
|
|
||||||
}
|
|
||||||
TableNode *entrie = table->entries;
|
|
||||||
fprintf(file_ptr, "-----------------:--------:--------:----------------"
|
|
||||||
"------:---------"
|
|
||||||
"--------------------\n");
|
|
||||||
int parant_scope = 0;
|
|
||||||
int current_scope = 0;
|
|
||||||
if (table->Parent_Scope != NULL) {
|
|
||||||
parant_scope = table->Parent_Scope->Line_Number * 1000 +
|
|
||||||
table->Parent_Scope->Column_Number;
|
|
||||||
current_scope =
|
|
||||||
table->Line_Number * 1000 + table->Column_Number;
|
|
||||||
} else {
|
|
||||||
current_scope = 1001;
|
|
||||||
}
|
|
||||||
if (entrie == NULL) {
|
|
||||||
fprintf(file_ptr, "%-17s: %06d : %06d : %-21s: %-28s\n", "",
|
|
||||||
current_scope, parant_scope, "", "Empty Scope");
|
|
||||||
}
|
|
||||||
for (; entrie != NULL; entrie = entrie->next) {
|
|
||||||
if (parant_scope == 0) {
|
|
||||||
/*have to update if (strcmp(entrie->theType->theName,
|
|
||||||
"function primitive") ||
|
|
||||||
strcmp(entrie->theType->theName,
|
|
||||||
"array")) {
|
|
||||||
}
|
|
||||||
fprintf(file_ptr,
|
|
||||||
"%-17s: %06d : : %-21s: %-28s\n",
|
|
||||||
entrie->theName, current_scope,
|
|
||||||
entrie->theType->theName, "Extra annotation");
|
|
||||||
} else {
|
|
||||||
fprintf(file_ptr, "%-17s: %06d : %06d : %-21s: %-28s\n",
|
|
||||||
entrie->theName, current_scope, parant_scope,
|
|
||||||
entrie->theType->theName, "Extra annotation");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (table->Children_Scope != NULL) {
|
|
||||||
ListOfTable *node = table->Children_Scope;
|
|
||||||
for (; node != NULL; node = node->next) {
|
|
||||||
print_symbol_table(node->table, file_ptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (table->Parent_Scope == NULL) {
|
|
||||||
fprintf(file_ptr, "-----------------:--------:--------:--------"
|
|
||||||
"--------------:-------"
|
|
||||||
"----------------------\n");
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
void print_symbol_table(SymbolTable *table, FILE *file_ptr) {
|
void print_symbol_table(SymbolTable *table, FILE *file_ptr) {
|
||||||
|
|
||||||
if (table == NULL) {
|
if (table == NULL) {
|
||||||
@ -1286,20 +1072,3 @@ TableNode *getNextEntry(TableNode *tn) {
|
|||||||
}
|
}
|
||||||
return tn->next;
|
return tn->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
// uncomment the below main function along with the headers above for a simple
|
|
||||||
// standalone test of table and entry creation
|
|
||||||
|
|
||||||
/*
|
|
||||||
int main(){
|
|
||||||
char* String = "STRING";
|
|
||||||
char* X = "X";
|
|
||||||
SymbolTable* Second = CreateScope(NULL, 2,2);
|
|
||||||
printdebug("Line number is %d, Column number of scope is
|
|
||||||
%d",Second->Line_Number,Second->Column_Number); TableNode* First_Entry =
|
|
||||||
CreateEntry(Second,String,X);
|
|
||||||
|
|
||||||
printdebug("The type of the first entry is %s",First_Entry->theType);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
*/
|
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <stdarg.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -9,26 +10,12 @@ typedef struct {
|
|||||||
int size;
|
int size;
|
||||||
} primitive_info;
|
} primitive_info;
|
||||||
|
|
||||||
/*This structure can be subsumed into the structure below (1-d array of chars)
|
|
||||||
typedef struct{
|
|
||||||
//shouldn't need to store any values since would be compiled at runtime
|
|
||||||
//int length;
|
|
||||||
//char* location;
|
|
||||||
}string_info;
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int numofdimensions;
|
int numofdimensions;
|
||||||
// the above value tells you how long the below array is. For example if
|
|
||||||
// num of dimensions is 5, I can store 1,3,2,5,9 to define > int*
|
|
||||||
// arr; shouldn't need to store any values (like sizes of dimenions or
|
|
||||||
// the location int* sizesofdimensions; do have to store type of array
|
|
||||||
struct TableNode *typeofarray;
|
struct TableNode *typeofarray;
|
||||||
} array_info;
|
} array_info;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
// similar to above we define a record to hold the number of elements
|
|
||||||
// and an array of tablenodes (types) that it contains in the >
|
|
||||||
int numofelements;
|
int numofelements;
|
||||||
struct SymbolTable *recordScope;
|
struct SymbolTable *recordScope;
|
||||||
} record_info;
|
} record_info;
|
||||||
@ -47,19 +34,16 @@ typedef union {
|
|||||||
primitive_info *PrimAdInfo;
|
primitive_info *PrimAdInfo;
|
||||||
array_info *ArrayAdInfo;
|
array_info *ArrayAdInfo;
|
||||||
record_info *RecAdInfo;
|
record_info *RecAdInfo;
|
||||||
// string_info* StringAdInfo;
|
|
||||||
function_declaration_info *FunDecAdInfo;
|
function_declaration_info *FunDecAdInfo;
|
||||||
function_type_info *FunTypeAdInfo;
|
function_type_info *FunTypeAdInfo;
|
||||||
} AdInfo;
|
} AdInfo;
|
||||||
|
|
||||||
typedef struct ListOfTable {
|
typedef struct ListOfTable {
|
||||||
struct SymbolTable *table;
|
struct SymbolTable *table;
|
||||||
// struct ListOfTable* prev;
|
|
||||||
struct ListOfTable *next;
|
struct ListOfTable *next;
|
||||||
} ListOfTable;
|
} ListOfTable;
|
||||||
|
|
||||||
typedef struct TableNode {
|
typedef struct TableNode {
|
||||||
// reference to the type entry that this is
|
|
||||||
struct TableNode *theType;
|
struct TableNode *theType;
|
||||||
char *theName;
|
char *theName;
|
||||||
AdInfo *additionalinfo;
|
AdInfo *additionalinfo;
|
||||||
@ -74,30 +58,100 @@ typedef struct SymbolTable {
|
|||||||
int Column_Number;
|
int Column_Number;
|
||||||
} SymbolTable;
|
} SymbolTable;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TYPE_STRING = 1,
|
||||||
|
TYPE_ARRAY_TYPE = 2,
|
||||||
|
TYPE_RECORD_TYPE = 3,
|
||||||
|
TYPE_FUNCTION_DECLARATION = 4,
|
||||||
|
TYPE_FUNCTION_TYPE = 5,
|
||||||
|
TYPE_PRIMITIVE = 6,
|
||||||
|
TYPE_ALL_ELSE = 7,
|
||||||
|
TYPE_UNDEFINED = 8,
|
||||||
|
TYPE_RECORD = 9,
|
||||||
|
TYPE_ARRAY = 10
|
||||||
|
} types;
|
||||||
|
|
||||||
|
AdInfo *CreatePrimitiveInfo(int size);
|
||||||
|
int getPrimSize(TableNode *definition);
|
||||||
|
AdInfo *CreateArrayInfo(int dim, TableNode *type);
|
||||||
|
int getNumArrDim(TableNode *definition);
|
||||||
|
TableNode *getArrType(TableNode *definition);
|
||||||
|
AdInfo *CreateRecordInfo(int length, SymbolTable *recordScope);
|
||||||
|
int getRecLength(TableNode *definition);
|
||||||
|
SymbolTable *getRecList(TableNode *definition);
|
||||||
|
TableNode *setRecSize(TableNode *tn, int n);
|
||||||
|
int getRecSize(SymbolTable *tn);
|
||||||
|
AdInfo *CreateFunctionDeclarationInfo(int line, bool asorregular);
|
||||||
|
int getStartLine(TableNode *definition);
|
||||||
|
TableNode *setStartLine(TableNode *tn, int start);
|
||||||
|
bool getAsKeyword(TableNode *definition);
|
||||||
|
TableNode *setAsKeyword(TableNode *tn, bool as);
|
||||||
|
AdInfo *CreateFunctionTypeInfo(TableNode *parameter, TableNode *returntype);
|
||||||
|
TableNode *getParameter(TableNode *definition);
|
||||||
|
TableNode *getReturn(TableNode *definition);
|
||||||
SymbolTable *CreateScope(SymbolTable *ParentScope, int Line, int Column);
|
SymbolTable *CreateScope(SymbolTable *ParentScope, int Line, int Column);
|
||||||
|
SymbolTable *init(SymbolTable *start);
|
||||||
|
TableNode *populateTypeAndInfo(TableNode *tn, TableNode *type, AdInfo *info);
|
||||||
|
int getAdInfoType(TableNode *tn);
|
||||||
|
TableNode *CreateEntry(SymbolTable *table, TableNode *typeOf, char *id,
|
||||||
|
AdInfo *ad);
|
||||||
|
char *getType(TableNode *tn);
|
||||||
|
char *getName(TableNode *tn);
|
||||||
|
int getLine(SymbolTable *st);
|
||||||
|
int getColumn(SymbolTable *st);
|
||||||
|
TableNode *addName(TableNode *tn, char *str);
|
||||||
|
SymbolTable *setLineNumber(SymbolTable *st, int line);
|
||||||
|
SymbolTable *setColumnNumber(SymbolTable *st, int column);
|
||||||
TableNode *table_lookup(SymbolTable *table, char *x);
|
TableNode *table_lookup(SymbolTable *table, char *x);
|
||||||
TableNode *look_up(SymbolTable *table, char *x);
|
TableNode *look_up(SymbolTable *table, char *x);
|
||||||
void print_symbol_table(SymbolTable *table, FILE *file_ptr);
|
void print_symbol_table(SymbolTable *table, FILE *file_ptr);
|
||||||
|
|
||||||
SymbolTable *getAncestor(SymbolTable *table);
|
SymbolTable *getAncestor(SymbolTable *table);
|
||||||
|
SymbolTable *removeEntry(SymbolTable *scope, char *search);
|
||||||
|
bool typeCheck(char *firstID, char *secondID);
|
||||||
SymbolTable *getParent(SymbolTable *st);
|
SymbolTable *getParent(SymbolTable *st);
|
||||||
ListOfTable *getChildren(SymbolTable *st);
|
ListOfTable *getChildren(SymbolTable *st);
|
||||||
SymbolTable *getFirstChild(ListOfTable *lt);
|
SymbolTable *getFirstChild(ListOfTable *lt);
|
||||||
ListOfTable *getRestOfChildren(ListOfTable *lt);
|
ListOfTable *getRestOfChildren(ListOfTable *lt);
|
||||||
TableNode *getFirstEntry(SymbolTable *st);
|
TableNode *getFirstEntry(SymbolTable *st);
|
||||||
TableNode *getNextEntry(TableNode *tn);
|
TableNode *getNextEntry(TableNode *tn);
|
||||||
SymbolTable *init(SymbolTable *scope);
|
|
||||||
int getPrimSize(TableNode *definition);
|
|
||||||
int getNumArrDim(TableNode *definition);
|
|
||||||
TableNode *getArrType(TableNode *definition);
|
|
||||||
int getRecLength(TableNode *definition);
|
|
||||||
SymbolTable *getRecList(TableNode *definition);
|
|
||||||
int getStartLine(TableNode *definition);
|
|
||||||
bool getAsKeyword(TableNode *definition);
|
|
||||||
TableNode *getParameter(TableNode *definition);
|
|
||||||
TableNode *getReturn(TableNode *definition);
|
|
||||||
|
|
||||||
char *getType(TableNode *tn);
|
void printdebug_impl(char *file, int line, const char *format, ...);
|
||||||
char *getName(TableNode *tn);
|
#define printdebug(format, ...) \
|
||||||
int getLine(SymbolTable *st);
|
printdebug_impl(__FILE__, __LINE__, format, ##__VA_ARGS__)
|
||||||
int getColumn(SymbolTable *st);
|
|
||||||
|
extern int yylex(void);
|
||||||
|
extern char *yytext;
|
||||||
|
extern int yyleng;
|
||||||
|
extern int yychar;
|
||||||
|
extern SymbolTable *cur;
|
||||||
|
extern int line_number;
|
||||||
|
extern int column_number;
|
||||||
|
extern FILE *yyin;
|
||||||
|
extern bool DEBUG;
|
||||||
|
|
||||||
|
extern TableNode *funprime;
|
||||||
|
extern TableNode *arrayprim;
|
||||||
|
extern TableNode *integ;
|
||||||
|
extern TableNode *addr;
|
||||||
|
extern TableNode *chara;
|
||||||
|
extern TableNode *stri;
|
||||||
|
extern TableNode *boo;
|
||||||
|
extern TableNode *recprime;
|
||||||
|
extern TableNode *funtypeprime;
|
||||||
|
extern TableNode *undefined;
|
||||||
|
|
||||||
|
extern char *COLOR_RED;
|
||||||
|
extern char *COLOR_GREEN;
|
||||||
|
extern char *COLOR_ORANGE;
|
||||||
|
extern char *COLOR_BLUE;
|
||||||
|
extern char *COLOR_PURPLE;
|
||||||
|
extern char *COLOR_CYAN;
|
||||||
|
extern char *COLOR_LIGHTGRAY;
|
||||||
|
extern char *COLOR_DARKGRAY;
|
||||||
|
extern char *COLOR_LIGHTRED;
|
||||||
|
extern char *COLOR_LIGHTGREEN;
|
||||||
|
extern char *COLOR_YELLOW;
|
||||||
|
extern char *COLOR_LIGHTBLUE;
|
||||||
|
extern char *COLOR_LIGHTPURPLE;
|
||||||
|
extern char *COLOR_LIGHTCYAN;
|
||||||
|
extern char *COLOR_WHITE;
|
Reference in New Issue
Block a user