Solution
Pritam answered on
Apr 01 2021
compile
listing.cc
listing.cc
 Compiler Theory and Design
 Dr. Duane J. Jarc
 This file contains the bodies of the functions that produces the compilation listing
#include "listing.h"
static int lineNumber;
static int totalE
ors = 0;
static int lexicalE
ors = 0;
static int syntaxE
ors = 0;
static int semanticE
ors = 0;
static queue e
ors;
static void displayE
ors();
void firstLine()
{
    lineNumber = 1;
    printf("\n%4d  ",lineNumber);
}
void nextLine()
{
    displayE
ors();
    lineNumber++;
    printf("\n%4d  ",lineNumber);
}
int lastLine()
{
    printf("\r");
    displayE
ors();
    if(totalE
ors == 0)
        printf("\n\nCompiled Successfully.\n");
    else
        printf("\n\nLexical E
ors %d\nSyntax E
ors %d\nSemantic E
ors %d\n", lexicalE
ors, syntaxE
ors, semanticE
ors);
    return totalE
ors;
}
   Â
void appendE
or(E
orCategories e
orCategory, string message)
{
    string messages[] = { "Lexical E
or, Invalid Character ", "",
        "Semantic E
or, ", "Semantic E
or, Duplicate Identifier: ",
        "Semantic E
or, Undeclared " };
    e
ors.push(messages[e
orCategory]Â +Â message);
    if(e
orCategory == LEXICAL)
        lexicalE
ors++;
    else if(e
orCategory == SYNTAX)
        syntaxE
ors++;
    else
        semanticE
ors++;
    totalE
ors++;
}
void displayE
ors()
{
    while (!e
ors.empty())
    {
            printf("\n\t%s", e
ors.front().c_str());
            e
ors.pop();
    }
}
listing.h
Listing.h
Compiler Theory and Design
Dr. Duane J. Jarc
This file contains the function prototypes for the functions that produce the
compilation listing
#include
std::cin, std::cout
#include
std::queue
#include #include using namespace std;
enum E
orCategories {LEXICAL, SYNTAX, GENERAL_SEMANTIC, DUPLICATE_IDENTIFIER,
UNDECLARED};
void firstLine();
void nextLine();
int lastLine();
void appendE
or(E
orCategories e
orCategory, string message);
makefile
compile: scanner.o listing.o
g++ -o compile scanner.o listing.o
scanner.o: scanner.c listing.h tokens.h
g++ -c scanner.c
scanner.c: scanner_v2.l
flex scanner_v2.l
mv lex.yy.c scanner.c
listing.o: listing.cc listing.h
g++ -c listing.cc
scanner.c
#line 3 "lex.yy.c"
#define YY_INT_ALIGNED short int
* A lexical scanner generated by flex *
#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 35
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif
* First, we deal with platform-specific or compiler-specific issues. *
* begin standard C headers. *
#include #include #include no.h
#include * end standard C headers. *
* flex integer type definitions *
#ifndef FLEXINT_H
#define FLEXINT_H
* C99 systems have . Non-C99 systems may or may not. *
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
* if you want the limit (max/min) macros for int types.
*
#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS 1
#endif
#include typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
* Limits of integral types. *
#ifndef INT8_MIN
#define INT8_MIN (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX (4294967295U)
#endif
#endif /* ! C99 *
#endif /* ! FLEXINT_H *
#ifdef __cplusplus
* The "const" storage-class-modifier is valid. *
#define YY_USE_CONST
#else /* ! __cplusplus *
* C99 requires __STDC__ to be defined as 1. *
#if defined (__STDC__)
#define YY_USE_CONST
#endif /* defined (__STDC__) *
#endif /* ! __cplusplus *
#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif
* Returned upon end-of-file. *
#define YY_NULL 0
* Promotes a possibly negative, possibly signed char to an unsigned
* integer for use as an a
ay index. If the signed char is negative,
* we want to instead treat it as an 8-bit unsigned char, hence the
* double cast.
*
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
* Enter a start condition. This macro really ought to take a parameter,
* but we do it the disgusting crufty way forced on us by the ()-less
* definition of BEGIN.
*
#define BEGIN (yy_start) = 1 + 2 *
* Translate the cu
ent start state into a value that can be later handed
* to BEGIN to return to the state. The YYSTATE alias is for lex
* compatibility.
*
#define YY_START (((yy_start) - 1) / 2)
#define YYSTATE YY_START
* Action number for EOF rule of a given start state. *
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
* Special action meaning "start processing a new file". *
#define YY_NEW_FILE yyrestart(yyin )
#define YY_END_OF_BUFFER_CHAR 0
* Size of default input buffer. *
#ifndef YY_BUF_SIZE
#ifdef __ia64__
* On IA-64, the buffer size is 16k, not 8k.
* Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
* Ditto for the __ia64__ case accordingly.
*
#define YY_BUF_SIZE 32768
#else
#define YY_BUF_SIZE 16384
#endif /* __ia64__ *
#endif
* The state buf must be large enough to hold one state per character in the main buffer.
*
#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif
extern int yyleng;
extern FILE *yyin, *yyout;
#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2
#define YY_LESS_LINENO(n)
* Return all but the first "n" matched characters back to the input stream. *
#define yyless(n) \
do \
{ \
/* Undo effects of setting up yytext. */ \
int yyless_macro_arg = (n); \
YY_LESS_LINENO(yyless_macro_arg);\
*yy_cp = (yy_hold_char); \
YY_RESTORE_YY_MORE_OFFSET \
(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
YY_DO_BEFORE_ACTION; /* set up yytext again */ \
} \
while ( 0 )
#define unput(c) yyunput( c, (yytext_ptr) )
#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef size_t yy_size_t;
#endif
#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
{
FILE *yy_input_file;
char *yy_ch_buf; /* input buffer *
char *yy_buf_pos; /* cu
ent position in input buffer *
/* Size of input buffer in bytes, not including room for EOB
* characters.
*
yy_size_t yy_buf_size;
/* Number of characters read into yy_ch_buf, not including EOB
* characters.
*
int yy_n_chars;
/* Whether we "own" the buffer - i.e., we know we created it,
* and can realloc() it to grow it, and should free() it to
* delete it.
*
int yy_is_our_buffer;
/* Whether this is an "interactive" input source; if so, and
* if we're using stdio for input, then we want to use getc()
* instead of fread(), to make sure we stop fetching input afte
* each newline.
*
int yy_is_interactive;
/* Whether we're considered to be at the beginning of a line.
* If so, '^' rules will be active on the next match, otherwise
* not.
*
int yy_at_bol;
int yy_bs_lineno; /**< The line count. *
int yy_bs_column; /**< The column count. *
/* Whether to try to fill the input buffer when we reach the
* end of it.
*
int yy_fill_buffer;
int yy_buffer_status;
#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
/* When an EOF's been seen but there's still some text to process
* then we mark the buffer as YY_EOF_PENDING, to indicate that we
* shouldn't try reading from the input source any more. We might
* still have a bunch of tokens to match, though, because of
* possible backing-up.
*
* When we actually see the EOF, we change the status to "new"
* (via yyrestart()), so that the user can continue scanning by
* just pointing yyin at a new input file.
*
#define YY_BUFFER_EOF_PENDING 2
};
#endif /* !YY_STRUCT_YY_BUFFER_STATE *
* Stack of input buffers. *
static size_t yy_buffer_stack_top = 0; /**< index of top of stack. *
static size_t yy_buffer_stack_max = 0; /**< capacity of stack. *
static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an a
ay. *
* We provide macros for accessing buffer states in case in the
* future we want to put the buffer states in a more general
* "scanner state".
*
* Returns the top of the stack, or NULL.
*
#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
? (yy_buffer_stack)[(yy_buffer_stack_top)] \
: NULL)
* Same as previous macro, but useful when we know that the buffer stack is not
* NULL or when we need an lvalue. For internal use only.
*
#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
* yy_hold_char holds the character lost when yytext is formed. *
static char yy_hold_char;
static int yy_n_chars; /* number of characters read into yy_ch_buf *
int yyleng;
* Points to cu
ent character in buffer. *
static char *yy_c_buf_p = (char *) 0;
static int yy_init = 0; /* whether we need to initialize *
static int yy_start = 0; /* start state number *
* Flag which is used to allow yywrap()'s to do buffer switches
* instead of setting up a fresh yyin. A bit of a hack ...
*
static int yy_did_buffer_switch_on_eof;
void yyrestart (FILE *input_file );
void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer );
YY_BUFFER_STATE yy_create_buffer (FILE *file,int size );
void yy_delete_buffer (YY_BUFFER_STATE b );
void yy_flush_buffer (YY_BUFFER_STATE b );
void yypush_buffer_state (YY_BUFFER_STATE new_buffer );
void yypop_buffer_state (void );
static void yyensure_buffer_stack (void );
static void yy_load_buffer_state (void );
static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file );
#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER )
YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size );
YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str );
YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,int len );
void *yyalloc (yy_size_t );
void *yyrealloc (void *,yy_size_t );
void yyfree (void * );
#define yy_new_buffer yy_create_buffe
#define yy_set_interactive(is_interactive) \
{ \
if ( ! YY_CURRENT_BUFFER ){ \
yyensure_buffer_stack (); \
YY_CURRENT_BUFFER_LVALUE = \
yy_create_buffer(yyin,YY_BUF_SIZE ); \
} \
YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
}
#define yy_set_bol(at_bol) \
{ \
if ( ! YY_CURRENT_BUFFER ){\
yyensure_buffer_stack (); \
YY_CURRENT_BUFFER_LVALUE = \
yy_create_buffer(yyin,YY_BUF_SIZE ); \
} \
YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
}
#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
* Begin user sect3 *
#define yywrap(n) 1
#define YY_SKIP_YYWRAP
typedef unsigned char YY_CHAR;
FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
typedef int yy_state_type;
extern int yylineno;
int yylineno = 1;
extern char *yytext;
#define yytext_ptr yytext
static yy_state_type yy_get_previous_state (void );
static yy_state_type yy_try_NUL_trans (yy_state_type cu
ent_state );
static int yy_get_next_buffer (void );
static void yy_fatal_e
or (yyconst char msg[] );
* Done after the cu
ent pattern has been matched and before the
* co
esponding action - sets up yytext.
*
#define YY_DO_BEFORE_ACTION \
(yytext_ptr) = yy_bp; \
yyleng = (size_t) (yy_cp - yy_bp); \
(yy_hold_char) = *yy_cp; \
*yy_cp = '\0'; \
(yy_c_buf_p) = yy_cp;
#define YY_NUM_RULES 46
#define YY_END_OF_BUFFER 47
* This struct is not used in this scanner,
but its presence is necessary. *
struct yy_trans_info
{
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
static yyconst flex_int16_t yy_accept[123] =
{ 0,
0, 0, 47, 45, 1, 4, 41, 15, 13, 14,
16, 43, 7, 11, 9, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 1, 17, 0,
3, 12, 44, 43, 8, 18, 10, 42, 0, 42,
42, 42, 42, 42, 42, 42, 42, 26, 42, 38,
42, 22, 42, 42, 42, 42, 42, 0, 0, 3,
44, 0, 21, 42, 42, 42, 42, 35, 42, 42,
33, 20, 42, 42, 42, 19, 42, 42, 42, 42,
2, 0, 44, 42, 32, 23, 25, 42, 42, 42,
42, 42, 42, 31, 42, 42, 28, 5, 30, 34,
42, 27, 42, 6, 42, 42, 42, 42, 42, 42,
42, 29, 39, 42, 24, 42, 42, 40, 42, 37,
36, 0
} ;
static yyconst flex_int32_t yy_ec[256] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 1, 1, 1, 1, 1, 1, 4,
4, 5, 6, 4, 7, 8, 9, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 4, 4, 11,
12, 13, 1, 1, 14, 14, 14, 14, 15, 14,
14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
1, 1, 1, 1, 16, 1, 17, 18, 19, 20,
21, 22, 23, 24, 25, 14, 14, 26, 27, 28,
29, 14, 14, 30, 31, 32, 33, 14, 34, 14,
14, 14, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1
} ;
static yyconst flex_int32_t yy_meta[35] =
{ 0,
1, 1, 2, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3
} ;
static yyconst flex_int16_t yy_base[126] =
{ 0,
0, 0, 231, 232, 228, 232, 232, 224, 232, 232,
30, 28, 216, 214, 214, 209, 21, 24, 27, 30,
31, 35, 25, 39, 44, 43, 46, 222, 232, 218,
0, 232, 62, 42, 232, 232, 232, 206, 205, 58,
45, 59, 60, 63, 64, 66, 65, 204, 69, 203,
70, 202, 71, 80, 82, 73, 83, 212, 100, 0,
98, 104, 200, 99, 100, 101, 102, 109, 104, 111,
199, 198, 115, 116, 105, 197, 113, 117, 127, 121,
207, 201, 200, 124, 193, 192, 191, 134, 125, 137,
138, 128, 139, 190, 145, 140, 189, 188, 187, 186,
141, 184, 146, 181, 149, 147, 152, 151, 155, 159,
161, 177, 175, 164, 173, 165, 166, 171, 167, 170,
169, 232, 87, 195, 198
} ;
static yyconst flex_int16_t yy_def[126] =
{ 0,
122, 1, 122, 122, 122, 122, 122, 122, 122, 122,
122, 122, 122, 122, 122, 123, 123, 123, 123, 123,
123, 123, 123, 123, 123, 123, 123, 122, 122, 124,
125, 122, 122, 122, 122, 122, 122, 123, 123, 123,
123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
123, 123, 123, 123, 123, 123, 123, 124, 124, 125,
122, 122, 123, 123, 123, 123, 123, 123, 123, 123,
123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
124, 122, 122, 123, 123, 123, 123, 123, 123, 123,
123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
123, 123, 123, 123, 123, 123, 123, 123, 123, 123,
123, 0, 122, 122, 122
} ;
static yyconst flex_int16_t yy_nxt[267] =
{ 0,
4, 5, 6, 7, 8, 9, 10, 4, 11, 12,
13, 14, 15, 16, 16, 4, 17, 18, 19, 16,
20, 21, 16, 16, 22, 16, 16, 23, 24, 25,
16, 26, 16, 27, 30, 33, 39, 34, 31, 39,
39, 32, 39, 43, 41, 39, 39, 46, 40, 33,
39, 34, 42, 51, 39, 44, 48, 45, 39, 39,
39, 39, 49, 47, 54, 50, 55, 64, 52, 57,
53, 61, 56, 39, 39, 39, 62, 63, 39, 39,
39, 39, ...