From ef426610ebd2529e04be511de41d0887592ab89d Mon Sep 17 00:00:00 2001 From: Victor Fernandes Date: Thu, 16 Mar 2017 16:37:41 -0400 Subject: [PATCH] Define use of macOS's gcc malloc or Windows msvc malloc --- buffer.h | 11 ++++- scanner.c | 119 +++++++++++++++++++++++++++--------------------------- 2 files changed, 70 insertions(+), 60 deletions(-) diff --git a/buffer.h b/buffer.h index 8bb2928..e6ce83d 100755 --- a/buffer.h +++ b/buffer.h @@ -13,13 +13,22 @@ #ifndef BUFFER_H_ #define BUFFER_H_ +#define MACOS_DEP + /*#pragma warning(1:4001) *//*to enforce C89 type comments - to make //comments an warning */ /*#pragma warning(error:4001)*//* to enforce C89 comments - to make // comments an error */ /* standard header files */ #include /* standard input/output */ -#include /* for dynamic memory allocation.*/ + +#ifdef MACOS_DEP + #include /* for dynamic memory allocation.*/ +#endif + +#ifndef MACOS_DEP + #include +#endif #include /* implementation-defined data type ranges and limits */ /* constant definitions */ diff --git a/scanner.c b/scanner.c index c5b6846..d70aca1 100755 --- a/scanner.c +++ b/scanner.c @@ -269,15 +269,15 @@ Token malar_next_token(Buffer * sc_buf) /* special cases or token driven processing */ - // - //WRITE YOUR CODE FOR PROCESSING THE SPECIAL CASES HERE. - //COMMENTS AND STRING LITERALS ARE ALSO PROCESSED HERE. - // - //WHAT FOLLOWS IS A PSEUDO CODE. YOU CAN USE switch STATEMENT - //INSTEAD OF if-else TO PROCESS THE SPECIAL CASES - //DO NOT FORGET TO COUNT THE PROGRAM LINES - // - // + + // WRITE YOUR CODE FOR PROCESSING THE SPECIAL CASES HERE. + // COMMENTS AND STRING LITERALS ARE ALSO PROCESSED HERE. + + // WHAT FOLLOWS IS A PSEUDO CODE. YOU CAN USE switch STATEMENT + // INSTEAD OF if-else TO PROCESS THE SPECIAL CASES + // DO NOT FORGET TO COUNT THE PROGRAM LINES + + // IF (c == SOME CHARACTER) // ... // SKIP CHARACTER (FOR EXAMPLE SPACE) @@ -289,7 +289,7 @@ Token malar_next_token(Buffer * sc_buf) // if (c == '{'){ t.code = RBR_T; /*no attribute */ return t; // if (c == '+'){ t.code = ART_OP_T; t.attribute.arr_op = PLUS */ return t; // ... - // + // IF (c == '.') TRY TO PROCESS .AND. or .OR. // IF SOMETHING ELSE FOLLOWS . OR THE LAST . IS MISSING // RETURN AN ERROR TOKEN @@ -306,62 +306,63 @@ Token malar_next_token(Buffer * sc_buf) // (the attribute of the string token is the offset from // the beginning of the str_LTBL char buffer to the beginning // of the string (TEXT in the example)) - // + // return t; // ELSE // THE STRING LITERAL IS ILLEGAL // SET ERROR TOKEN FOR ILLEGAL STRING (see assignment) // DO NOT STORE THE ILLEGAL STRINg IN THE str_LTBL - // + // return t; - // - // IF(c == ANOTHER CHARACTER) - // SET TOKEN - // return t; - /* Process state transition table */ + + // IF(c == ANOTHER CHARACTER) + // SET TOKEN + // return t; + // /* Process state transition table */ + + // IF (c is a digit OR c is a letter){ + + // SET THE MARK AT THE BEGINING OF THE LEXEME + // b_setmark(sc_buf,forward); + // .... + // CODE YOUR FINATE STATE MACHINE HERE (FSM or DFA) + // IT IMPLEMENTS THE FOLLOWING ALGORITHM: + + // FSM0. Begin with state = 0 and the input character c + // FSM1. Get the next state from the transition table calling + // state = get_next_state(state, c, &accept); + // FSM2. Get the next character + // FSM3. If the state is not accepting (accept == NOAS), go to step FSM1 + // If the step is accepting, token is found, leave the machine and + // call an accepting function as described below. + + + // RETRACT getc_offset IF THE FINAL STATE IS A RETRACTING FINAL STATE + // GET THE BEGINNING AND THE END OF THE LEXEME + // lexstart = b_getmark(sc_buf); + // SET lexend TO getc_offset USING AN APPROPRIATE BUFFER FUNCTION + // CREATE A TEMPORRARY LEXEME BUFFER HERE; + // lex_buf = b_create(...); + // . RETRACT getc_offset to the MARK SET PREVIOUSLY AT THE BEGINNING OF THE LEXEME AND + // . USING b_getc() COPY THE LEXEME BETWEEN lexstart AND lexend FROM THE INPUT BUFFER INTO lex_buf USING b_addc(...), + // . WHEN VID (KEYWORDS INCLUDED), FPL OR IL IS RECOGNIZED + // . YOU MUST CALL THE ACCEPTING FUNCTION USING THE ARRAY aa_table ,WHICH + // . CONTAINS POINTERS TO FUNCTIONS. THE ARRAY INDEX OF THE FUNCTION TO BE + // . CALLED IS STORED IN THE VARIABLE state. + // . YOU ARE NOT ALLOWED TO CALL ANY OF THE ACCEPTING FUNCTIONS BY NAME. + // . THE ARGUMENT TO THE FUNCTION IS THE STRING STORED IN lex_buf. + // .... + // b_free(lex_buf); + // return t; + + // CHECK OTHER CHARS HERE if NEEDED, SET A TOKEN AND RETURN IT. + // FOR ILLEGAL CHARACTERS SET ERROR TOKEN. + // THE ILLEGAL CHAR IS THE ATTRIBUTE OF THE ERROR TOKEN + // IN A CASE OF RUNTIME ERROR, THE FUNCTION MUST STORE + // A NON-NEGATIVE NUMBER INTO THE GLOBAL VARIABLE scerrnum + // AND RETURN AN ERROR TOKEN. THE ERROR TOKEN ATTRIBUTE MUST + // BE THE STRING "RUN TIME ERROR: " - //IF (c is a digit OR c is a letter){ - // - //SET THE MARK AT THE BEGINING OF THE LEXEME - //b_setmark(sc_buf,forward); - // .... - //CODE YOUR FINATE STATE MACHINE HERE (FSM or DFA) - //IT IMPLEMENTS THE FOLLOWING ALGORITHM: - // - //FSM0. Begin with state = 0 and the input character c - //FSM1. Get the next state from the transition table calling - // state = get_next_state(state, c, &accept); - //FSM2. Get the next character - //FSM3. If the state is not accepting (accept == NOAS), go to step FSM1 - // If the step is accepting, token is found, leave the machine and - // call an accepting function as described below. - // - // - //RETRACT getc_offset IF THE FINAL STATE IS A RETRACTING FINAL STATE - //GET THE BEGINNING AND THE END OF THE LEXEME - //lexstart = b_getmark(sc_buf); - //SET lexend TO getc_offset USING AN APPROPRIATE BUFFER FUNCTION - //CREATE A TEMPORRARY LEXEME BUFFER HERE; - //lex_buf = b_create(...); - // . RETRACT getc_offset to the MARK SET PREVIOUSLY AT THE BEGINNING OF THE LEXEME AND - // . USING b_getc() COPY THE LEXEME BETWEEN lexstart AND lexend FROM THE INPUT BUFFER INTO lex_buf USING b_addc(...), - // . WHEN VID (KEYWORDS INCLUDED), FPL OR IL IS RECOGNIZED - // . YOU MUST CALL THE ACCEPTING FUNCTION USING THE ARRAY aa_table ,WHICH - // . CONTAINS POINTERS TO FUNCTIONS. THE ARRAY INDEX OF THE FUNCTION TO BE - // . CALLED IS STORED IN THE VARIABLE state. - // . YOU ARE NOT ALLOWED TO CALL ANY OF THE ACCEPTING FUNCTIONS BY NAME. - // . THE ARGUMENT TO THE FUNCTION IS THE STRING STORED IN lex_buf. - // .... - // b_free(lex_buf); - // return t; - // - // CHECK OTHER CHARS HERE if NEEDED, SET A TOKEN AND RETURN IT. - // FOR ILLEGAL CHARACTERS SET ERROR TOKEN. - // THE ILLEGAL CHAR IS THE ATTRIBUTE OF THE ERROR TOKEN - // IN A CASE OF RUNTIME ERROR, THE FUNCTION MUST STORE - // A NON-NEGATIVE NUMBER INTO THE GLOBAL VARIABLE scerrnum - // AND RETURN AN ERROR TOKEN. THE ERROR TOKEN ATTRIBUTE MUST - // BE THE STRING "RUN TIME ERROR: " }//end while(1) }