From e52a190a509ddbba537f70c0bea2e8d6299798d5 Mon Sep 17 00:00:00 2001 From: Victor Fernandes Date: Wed, 15 Mar 2017 03:04:51 -0400 Subject: [PATCH] State functions, minimize columns in transition table --- PLATYPUS_Transition_Table.xlsx | Bin 10891 -> 11644 bytes scanner.c | 576 +++++++++++++++++++++++---------- table.h | 53 +-- 3 files changed, 434 insertions(+), 195 deletions(-) diff --git a/PLATYPUS_Transition_Table.xlsx b/PLATYPUS_Transition_Table.xlsx index 469e3ff21eed00a536b0169951ce0eca0dfa9964..fb1de27028813947481e569236c1382e59e45e39 100644 GIT binary patch delta 4547 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 U_XPBSLA*&;0-S^j0)M~x2fu52RR910 delta 3772 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 diff --git a/scanner.c b/scanner.c index 64f5369..ce5c86d 100755 --- a/scanner.c +++ b/scanner.c @@ -35,6 +35,8 @@ #define DEBUG /* for conditional processing */ #undef DEBUG + + /* Global objects - variables */ /* This buffer is used as a repository for string literals. It is defined in platy_st.c */ @@ -84,14 +86,19 @@ which is being processed by the scanner. //DECLARE YOUR VARIABLES HERE IF NEEDED - + int i; /* Counter for loop in string error case */ + static int str_offset = 0; + + if (sc_buf == NULL) { + return aa_func12("RUN TIME ERROR"); /* WHOOPS */ + } while (1){ /* endless loop broken by token returns it will generate a warning */ //GET THE NEXT SYMBOL FROM THE INPUT BUFFER - c = b_getc(sc_buf); - switch (c) { + c = b_getc(sc_buf); + switch (c) { case 255: t.code = SEOF_T; return t; /* EOF */ case '\0': t.code = SEOF_T; return t; /* Source EOF */ case '\n': line++; continue; /* Ignore new line, increment line count */ @@ -125,111 +132,212 @@ which is being processed by the scanner. c = b_getc(sc_buf); return t; case '.': - b_setmark(sc_buf, b_getcoffset(sc_buf) - default: /* TODO: Do alpha [a-zA-Z] stuff here*/ - } + b_setmark(sc_buf, b_getcoffset(sc_buf)); /* Set mark before continuing (AND|OR case) */ + if (c == 'A' && b_getc(sc_buf) == 'N' && b_getc(sc_buf) == 'D' && b_getc(sc_buf) == '.') { + t.code = LOG_OP_T; + t.attribute.log_op = AND; + return t; + } + else if (c == 'O' && b_getc(sc_buf) == 'R' && b_getc(sc_buf) == '.') { + t.code = LOG_OP_T; + t.attribute.log_op = OR; + } + t.code = ERR_T; /* "That character's not supposed to be here" case */ + t.attribute.err_lex[0] = '.'; + t.attribute.err_lex[1] = '\0'; + b_retract_to_mark(sc_buf); + return t; + case '!': + c = b_getc(sc_buf); + if (c == '<') { /* It's a comment line */ + for (; c != '\0' && c != '\r' && c != '\n' && c != 255; c = b_getc(sc_buf)); /* Consume chars until line ends */ + line++; + continue; + } + else { /* Bad character, pump out an error token */ + t = aa_table[ES](" "); + t.attribute.err_lex[0] = c; + return t; + } + case '=': + c = b_getc(sc_buf); + if (c == '=') { /* Relational equals-to operator */ + t.code = REL_OP_T; + t.attribute.rel_op = EQ; + } + b_retract(sc_buf); + t.code = ASS_OP_T; /* Assignment operator */ + return t; + case '\"': /* Don't quote me on this */ + c = b_getc(sc_buf); + b_setmark(sc_buf, b_getcoffset(sc_buf)); + lexstart = (short)str_offset; + lexend = lexstart; + for (; c != '\"'; c = b_getc(sc_buf)) { + b_addc(str_LTBL, c); + if (b_isfull(str_LTBL)) { + return aa_table[ES]("\"Imagine all the .."); /* String too big :( */ + } + if (c == '\n' || c == '\r') { + line++; + } + if (c == 255 || c == '\0') { + b_retract_to_mark(sc_buf); + for (i = 0; i < ERR_LEN; i++) { + t.attribute.err_lex[i] = b_getc(sc_buf); + } + } + lexend++; + str_offset++; + } /*end for loop, string finished*/ + str_offset++; + b_addc(str_LTBL, '\0'); + + t.code = STR_T; + t.attribute.str_offset = lexstart; + return t; /* String literal */ + default: + if (isalnum(c) || isalpha(c)) { + lexend = 0; + state = 0; + lex_buf = b_create(1, 1, 'a'); + + while (accept == NOAS) { + b_addc(lex_buf, c); + state = get_next_state(state, c, &accept); + + if (accept != NOAS) + break; + c = b_getc(sc_buf); + lexend++; + } + /* Entering Accepting State */ + b_addc(lex_buf, '\0'); + + if (as_table[state] == ASWR) + b_retract(sc_buf); + if ((t.attribute.kwt_idx = iskeyword(b_setmark(lex_buf, 0))) != -1) { + t.code = KW_T; + b_free(lex_buf); + return t; + } + + if (aa_table[state] != NULL) { + t = aa_table[state](b_setmark(lex_buf, 0)); + } + else { + t = aa_table[ES]("RUN TIME ERROR"); + } + b_free(lex_buf); + } + + else { + t = aa_table[ES](" "); + t.attribute.err_lex[0] = c; + } + } -/* 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 - - - IF (c == SOME CHARACTER) - ... - SKIP CHARACTER (FOR EXAMPLE SPACE) - continue; - OR SET TOKEN (SET TOKEN CODE AND TOKEN ATTRIBUTE(IF AVAILABLE)) - return t; - EXAMPLE: - if (c == ' ') continue; - 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 - IF (c == '!') TRY TO PROCESS COMMENT - IF THE FOLLOWING IS NOT CHAR IS NOT < REPORT AN ERROR - ELSE IN A LOOP SKIP CHARACTERS UNTIL line terminator is found THEN continue; - ... - IF STRING (FOR EXAMPLE, "text") IS FOUND - SET MARK TO MARK THE BEGINNING OF THE STRING - IF THE STRING IS LEGAL - USING b_addc(..)COPY THE text FROM INPUT BUFFER INTO str_LTBL - ADD '\0' at the end make the string C-type string - SET STRING TOKEN - (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; +///* 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 +// +// +// IF (c == SOME CHARACTER) +// ... +// SKIP CHARACTER (FOR EXAMPLE SPACE) +// continue; +// OR SET TOKEN (SET TOKEN CODE AND TOKEN ATTRIBUTE(IF AVAILABLE)) +// return t; +// EXAMPLE: +// if (c == ' ') continue; +// 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 +// IF (c == '!') TRY TO PROCESS COMMENT +// IF THE FOLLOWING IS NOT CHAR IS NOT < REPORT AN ERROR +// ELSE IN A LOOP SKIP CHARACTERS UNTIL line terminator is found THEN continue; +// ... +// IF STRING (FOR EXAMPLE, "text") IS FOUND +// SET MARK TO MARK THE BEGINNING OF THE STRING +// IF THE STRING IS LEGAL +// USING b_addc(..)COPY THE text FROM INPUT BUFFER INTO str_LTBL +// ADD '\0' at the end make the string C-type string +// SET STRING TOKEN +// (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 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) + //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) } -DO NOT MODIFY THE CODE OF THIS FUNCTION -YOU CAN REMOVE THE COMMENTS +/* DO NOT MODIFY THE CODE OF THIS FUNCTION +YOU CAN REMOVE THE COMMENTS */ int get_next_state(int state, char c, int *accept) { @@ -275,80 +383,133 @@ or #undef DEBUF is used - see the top of the file. return next; } -int char_class (char c) +int char_class(char c) { - int val; + int val; + if (isalpha(c)) + val = 0; + else if (c == '0') + val = 1; + else if (c > '0' && c < '8') + val = 2; + else if (c == '8' || c == '9') + val = 3; + else if (c == '.') + val = 4; + else if (c == '#') + val = 5; + else + val = 6; -THIS FUNCTION RETURNS THE COLUMN NUMBER IN THE TRANSITION -TABLE st_table FOR THE INPUT CHARACTER c. -SOME COLUMNS MAY REPRESENT A CHARACTER CLASS . -FOR EXAMPLE IF COLUMN 1 REPRESENTS [A-Z] -THE FUNCTION RETURNS 1 EVERY TIME c IS ONE -OF THE LETTERS A,B,...,Z. - - return val; + return val; } - -HERE YOU WRITE THE DEFINITIONS FOR YOUR ACCEPTING FUNCTIONS. +/* +HERE YOU WRITE THE DEFINITIONS FOR YOUR ACCEPTING FUNCTIONS. ************************************************************ ACCEPTING FUNCTION FOR THE arithmentic variable identifier AND keywords (VID - AVID/KW) REPLACE XX WITH THE CORRESPONDING ACCEPTING STATE NUMBER +*/ -Token aa_funcXX(char lexeme[]){ +Token aa_func02(char lexeme[]) { + unsigned int kw_i; /* Variable to contain keyword table index */ + Token t; + char* temp_str; -WHEN CALLED THE FUNCTION MUST -1. CHECK IF THE LEXEME IS A KEYWORD. - IF YES, IT MUST RETURN A TOKEN WITH THE CORRESPONDING ATTRIBUTE - FOR THE KEYWORD. THE ATTRIBUTE CODE FOR THE KEYWORD - IS ITS INDEX IN THE KEYWORD LOOKUP TABLE (kw_table in table.h). - IF THE LEXEME IS NOT A KEYWORD, GO TO STEP 2. + if ((kw_i = iskeyword(lexeme)) > -1) { /* Keyword check */ + t.code = KW_T; + t.attribute.kwt_idx = kw_i; + return t; + } + /* Not a keyword? Must be AVID*/ + if ((temp_str = (char*)calloc(VID_LEN + 1, sizeof(char))) == NULL) { + return aa_table[ES]("RUN TIME ERROR"); + } + strncpy(temp_str, lexeme, VID_LEN); -2. SET a AVID TOKEN. - IF THE lexeme IS LONGER than VID_LEN (see token.h) CHARACTERS, - ONLY FIRST VID_LEN CHARACTERS ARE STORED - INTO THE VARIABLE ATTRIBUTE ARRAY vid_lex[](see token.h) . - ADD \0 AT THE END TO MAKE A C-type STRING. - return t; + strncpy(t.attribute.vid_lex, temp_str, VID_LEN); + free(temp_str); + + switch (lexeme[0]) { /* Read first character of lexeme for implicit type (not used yet?)*/ + case 'i': + case 'o': + case 'd': + case 'n': + /* Integer */ + break; + default: + /* Floating point*/ + } + + return t; + + /* + WHEN CALLED THE FUNCTION MUST + 1. CHECK IF THE LEXEME IS A KEYWORD. + IF YES, IT MUST RETURN A TOKEN WITH THE CORRESPONDING ATTRIBUTE + FOR THE KEYWORD. THE ATTRIBUTE CODE FOR THE KEYWORD + IS ITS INDEX IN THE KEYWORD LOOKUP TABLE (kw_table in table.h). + IF THE LEXEME IS NOT A KEYWORD, GO TO STEP 2. + + 2. SET a AVID TOKEN. + IF THE lexeme IS LONGER than VID_LEN (see token.h) CHARACTERS, + ONLY FIRST VID_LEN CHARACTERS ARE STORED + INTO THE VARIABLE ATTRIBUTE ARRAY vid_lex[](see token.h) . + ADD \0 AT THE END TO MAKE A C-type STRING. + */ } - +/* ACCEPTING FUNCTION FOR THE string variable identifier (VID - SVID) REPLACE XX WITH THE CORRESPONDING ACCEPTING STATE NUMBER +*/ +Token aa_func03(char lexeme[]) { + Token t; + int offset; + int i; + char* temp_str; + if ((temp_str = (char*)calloc(VID_LEN + 2, sizeof(char))) == NULL) { + return aa_table[ES]("RUN TIME ERROR"); + } -Token aa_funcXX(char lexeme[]){ + strcpy(temp_str, lexeme, VID_LEN); + temp_str[strlen(temp_str)] = "#"; /* Append # to end of the SVID */ -WHEN CALLED THE FUNCTION MUST -1. SET a SVID TOKEN. - IF THE lexeme IS LONGER than VID_LEN characters, - ONLY FIRST VID_LEN-1 CHARACTERS ARE STORED - INTO THE VARIABLE ATTRIBUTE ARRAY vid_lex[], - AND THEN THE # CHARACTER IS APPENDED TO THE NAME. - ADD \0 AT THE END TO MAKE A C-type STRING. - - return t; + strncpy(t.attribute.vid_lex, temp_str, VID_LEN); + free(temp_str); + + t.code = SVID_T; + return t; + + /* + WHEN CALLED THE FUNCTION MUST + 1. SET a SVID TOKEN. + IF THE lexeme IS LONGER than VID_LEN characters, + ONLY FIRST VID_LEN-1 CHARACTERS ARE STORED + INTO THE VARIABLE ATTRIBUTE ARRAY vid_lex[], + AND THEN THE # CHARACTER IS APPENDED TO THE NAME. + ADD \0 AT THE END TO MAKE A C-type STRING. + */ + return t; } -ACCEPTING FUNCTION FOR THE floating-point literal (FPL) +/*ACCEPTING FUNCTION FOR THE integer literal(IL)-decimal constant(DIL)*/ -Token aa_funcXX(char lexeme[]){ +Token aa_func05(char lexeme[]) { + Token t; + long temp_num; -THE FUNCTION MUST CONVERT THE LEXEME TO A FLOATING POINT VALUE, -WHICH IS THE ATTRIBUTE FOR THE TOKEN. -THE VALUE MUST BE IN THE SAME RANGE AS the value of 4-byte float in C. -IN CASE OF ERROR (OUT OF RANGE) THE FUNCTION MUST RETURN ERROR TOKEN -THE ERROR TOKEN ATTRIBUTE IS lexeme. IF THE ERROR lexeme IS LONGER -than ERR_LEN characters, ONLY THE FIRST ERR_LEN-3 characters ARE -STORED IN err_lex. THEN THREE DOTS ... ARE ADDED TO THE END OF THE -err_lex C-type string. - return t; -} + temp_num = strtol(lexeme, NULL, 10); -ACCEPTING FUNCTION FOR THE integer literal(IL) - decimal constant (DIL) - -Token aa_funcXX(char lexeme[]){ + if (temp_num > SHRT_MAX || temp_num < 0) { + t = aa_table[ES](lexeme); + } + t.code = INL_T; + t.attribute.int_value = temp_num; + return t; + /* THE FUNCTION MUST CONVERT THE LEXEME REPRESENTING A DECIMAL CONSTANT TO A DECIMAL INTEGER VALUE, WHICH IS THE ATTRIBUTE FOR THE TOKEN. THE VALUE MUST BE IN THE SAME RANGE AS the value of 2-byte integer in C. @@ -356,14 +517,64 @@ IN CASE OF ERROR (OUT OF RANGE) THE FUNCTION MUST RETURN ERROR TOKEN THE ERROR TOKEN ATTRIBUTE IS lexeme. IF THE ERROR lexeme IS LONGER than ERR_LEN characters, ONLY THE FIRST ERR_LEN-3 characters ARE STORED IN err_lex. THEN THREE DOTS ... ARE ADDED TO THE END OF THE -err_lex C-type string. - return t; +err_lex C-type string. */ } -ACCEPTING FUNCTION FOR THE integer literal(IL) - octal constant (OIL) +/*ACCEPTING FUNCTION FOR THE floating - point literal (FPL)*/ -Token aa_funcXX(char lexeme[]){ +Token aa_func08(char lexeme[]) { + Token t; + double temp_dbl; + t.code = FPL_T; + if (strstr(lexeme, "0.0")) { + t.attribute.flt_value = 0.0f; + return t; + } + + temp_dbl = atof(lexeme); + + if ((temp_dbl > FLT_MAX) || (temp_dbl < 0)) { + t = aa_table[ES](lexeme); + } + t.attribute.flt_value = (float)temp_dbl; + + return t; + /* +THE FUNCTION MUST CONVERT THE LEXEME TO A FLOATING POINT VALUE, +WHICH IS THE ATTRIBUTE FOR THE TOKEN. +THE VALUE MUST BE IN THE SAME RANGE AS the value of 4-byte float in C. +IN CASE OF ERROR (OUT OF RANGE) THE FUNCTION MUST RETURN ERROR TOKEN +THE ERROR TOKEN ATTRIBUTE IS lexeme. IF THE ERROR lexeme IS LONGER +than ERR_LEN characters, ONLY THE FIRST ERR_LEN-3 characters ARE +STORED IN err_lex. THEN THREE DOTS ... ARE ADDED TO THE END OF THE +err_lex C-type string. */ +} + + + +/*ACCEPTING FUNCTION FOR THE integer literal(IL) - octal constant (OIL)*/ + +Token aa_func10(char lexeme[]) { + Token t; + int new_olval; + + if (strlen(lexeme) > INL_LEN + 1) { + t = aa_table[ES](lexeme); + } + + t.code = INL_T; + new_olval = atool(lexeme); + + if (new_olval < SHRT_MIN || new_olval > SHRT_MAX) { + t = aa_table[ES](lexeme); + } + + t.code = INL_T; + t.attribute.int_value = new_olval; + + return t; + /* THE FUNCTION MUST CONVERT THE LEXEME REPRESENTING AN OCTAL CONSTANT TO A DECIMAL INTEGER VALUE WHICH IS THE ATTRIBUTE FOR THE TOKEN. THE VALUE MUST BE IN THE SAME RANGE AS the value of 2-byte integer in C. @@ -376,35 +587,62 @@ IN CASE OF ERROR (OUT OF RANGE) THE FUNCTION MUST RETURN ERROR TOKEN THE ERROR TOKEN ATTRIBUTE IS lexeme. IF THE ERROR lexeme IS LONGER than ERR_LEN characters, ONLY THE FIRST ERR_LEN-3 characters ARE STORED IN err_lex. THEN THREE DOTS ... ARE ADDED TO THE END OF THE -err_lex C-type string. - - return t; +err_lex C-type string. +*/ } -ACCEPTING FUNCTION FOR THE ERROR TOKEN +/*ACCEPTING FUNCTION FOR THE ERROR TOKEN */ -Token aa_funcXX(char lexeme[]){ +Token aa_func12(char lexeme[]) { + Token t; + unsigned int i; + t.code = ERR_T; + + for (i = 0; i < (ERR_LEN - 1) && i < strlen(lexeme); i++) { + t.attribute.err_lex[i] = lexeme[i]; + } + + t.attribute.err_lex[i] = '\0'; + + return t; + /* THE FUNCTION SETS THE ERROR TOKEN. lexeme[] CONTAINS THE ERROR THE ATTRIBUTE OF THE ERROR TOKEN IS THE lexeme ITSELF AND IT MUST BE STORED in err_lex. IF THE ERROR lexeme IS LONGER than ERR_LEN characters, ONLY THE FIRST ERR_LEN-3 characters ARE STORED IN err_lex. THEN THREE DOTS ... ARE ADDED TO THE END OF THE -err_lex C-type string. - - return t; +err_lex C-type string. +*/ } -CONVERSION FUNCTION +/*CONVERSION FUNCTION*/ -long atool(char * lexeme){ +long atool(char * lexeme) { + int i, x = 1; + long result = 0; + for (i = strlen(lexeme); i > 0; i--, x *= 8) { + result += x*(lexeme[i - 1] - '0'); + } + return result; + /* THE FUNCTION CONVERTS AN ASCII STRING REPRESENTING AN OCTAL INTEGER CONSTANT TO INTEGER VALUE +*/ } -HERE YOU WRITE YOUR ADDITIONAL FUNCTIONS (IF ANY). -FOR EXAMPLE +/*HERE YOU WRITE YOUR ADDITIONAL FUNCTIONS (IF ANY). +FOR EXAMPLE*/ -int iskeyword(char * kw_lexeme){} \ No newline at end of file +int iskeyword(char * kw_lexeme) { + int i; + + if (kw_lexeme == NULL) return -1; + + for (i = 0; i < KWT_SIZE; i++) { + if (strcmp(kw_table[i], kw_lexeme) == 0) return i; + } + return -1; +} \ No newline at end of file diff --git a/table.h b/table.h index a82d70f..f0c6300 100755 --- a/table.h +++ b/table.h @@ -36,33 +36,34 @@ //REPLACE *ESN* WITH YOUR ERROR STATE NUMBER -#define ES -2 /* Error state */ -#define IS -1 /* Inavalid state */ +#define ES 12 /* Error state */ +#define IS -1 /* Invalid state */ /* State transition table definition */ //REPLACE *CN* WITH YOUR COLUMN NUMBER -#define TABLE_COLUMNS 14 +#define TABLE_COLUMNS 7 /*transition table - type of states defined in separate table */ int st_table[][TABLE_COLUMNS] = { /* INPUT COLUMNS: - [a-zA-Z]| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | . | # | other - */ - /* State 0 */ {1, 6 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , IS , IS ,IS}, - /* State 1 */ {1, 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , ES , 3 , 2}, - /* State 2 */ {IS, IS , IS, IS, IS, IS, IS, IS, IS, IS, IS, IS , IS , IS}, - /* State 3 */ {IS, IS , IS, IS, IS, IS, IS, IS, IS, IS, IS, IS , IS , IS}, - /* State 4 */ {ES, 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 7 , 5 , 5}, - /* State 5 */ {IS, IS , IS, IS, IS, IS, IS, IS, IS, IS, IS, IS , IS , IS}, - /* State 6 */ {ES, 9 , 9, 9, 9, 9, 9, 9, 9, ES, ES, 7 , ES , 5}, - /* State 7 */ {ES, 7 , 7, 7, 7, 7, 7, 7, 7, 7, 7, ES , 8 , 8}, - /* State 8 */ {IS, IS , IS, IS, IS, IS, IS, IS, IS, IS, IS, IS , IS , IS}, - /* State 9 */ {ES, 9 , 9, 9, 9, 9, 9, 9, 9, ES, ES, ES , ES , 10}, - /* State 10 */ {IS, IS , IS, IS, IS, IS, IS, IS, IS, IS, IS, IS , IS , IS}, - /* State 11 */ {ES, ES , ES, ES, ES, ES, ES, ES, ES, ES, ES, ES , ES , ES}, - /* State 12 */ {IS, IS , IS, IS, IS, IS, IS, IS, IS, IS, IS, IS , IS , IS}, - /* State 13 */ {IS, IS , IS, IS, IS, IS, IS, IS, IS, IS, IS, IS , IS , IS} + COLUMN # | 0 | 1 | 2 | 3 | 4 | 5 | 6 | + [a-zA-Z]| 0 |[1-7]|[8-9]| . | # | other + */ + /* State 0 */ {1, 6 , 4 , 4 , IS , IS , IS}, + /* State 1 */ {1, 1 , 1 , 1 , ES , 3 , 2}, + /* State 2 */ {IS, IS , IS, IS, IS , IS , IS}, + /* State 3 */ {IS, IS , IS, IS, IS , IS , IS}, + /* State 4 */ {ES, 4 , 4 , 4 , 7 , 5 , 5}, + /* State 5 */ {IS, IS , IS, IS, IS , IS , IS}, + /* State 6 */ {ES, 9 , 9, ES, 7 , ES , 5}, + /* State 7 */ {ES, 7 , 7, 7, ES , 8 , 8}, + /* State 8 */ {IS, IS , IS, IS, IS , IS , IS}, + /* State 9 */ {ES, 9 , 9, ES, ES , ES , 10}, + /* State 10 */ {IS, IS , IS, IS, IS , IS , IS}, + /* State 11 */ {IS, IS , IS, IS, IS , IS , IS}, + /* State 12 */ {IS, IS , IS, IS, IS , IS , IS}, + /* State 13 */ {IS, IS , IS, IS, IS , IS , IS} // //. YOUR TABLE INITIALIZATION HERE //. @@ -70,8 +71,8 @@ int st_table[][TABLE_COLUMNS] = { }; /* Accepting state table definition */ //REPLACE *N1*, *N2*, and *N3* WITH YOUR NUMBERS -#define ASWR 1 /* accepting state with retract */ -#define ASNR 2 /* accepting state with no retract */ +#define ASWR 2 /* accepting state with retract */ +#define ASNR 3 /* accepting state with no retract */ #define NOAS 0 /* not accepting state */ int as_table[] = { @@ -87,7 +88,7 @@ int as_table[] = { /* State 8 */ ASWR, /* State 9 */ NOAS, /* State 10 */ ASWR, - /* State 11 */ ASNR, + /* State 11 */ ASWR, /* State 12 */ ASNR, /* State 13 */ ASWR @@ -106,7 +107,7 @@ Token aa_func03(char *lexeme); // VID SVID Token aa_func05(char *lexeme); // DIL Token aa_func08(char *lexeme); // FPL Token aa_func10(char *lexeme); // OIL -Token aa_func11(char *lexeme); // ES +Token aa_func12(char *lexeme); // ES //Replace XX with the number of the accepting state: 02, 03 and so on. /* defining a new type: pointer to function (of one char * argument) @@ -134,9 +135,9 @@ PTR_AAF aa_table[] = { /* State 8 */ aa_func08, /* State 9 */ NULL, /* State 10 */ aa_func10, - /* State 11 */ aa_func11, - /* State 12 */ aa_func11, - /* State 13 */ aa_func11 + /* State 11 */ NULL, + /* State 12 */ aa_func12, + /* State 13 */ NULL //HERE YOU MUST PROVIDE AN INITIALIZATION FOR AN ARRAY OF POINTERS //TO ACCEPTING FUNCTIONS. THE ARRAY HAS THE SAME SIZE AS as_table[ ].