$30
, you will implement a program which analyzes whether a given .cpp
file (C++ source code) contains enclosing symbol errors or not. In other words, the program
will check whether all curly brackets, { }, square brackets, [ ], and regular parenthesis, ( ),
are opened and closed correctly or not. To achieve this, the program must use a stack data
structure. The details of the methods, algorithms and the data structure to be used will be
explained in the subsequent sections of this homework specification.
Program Flow
At first, the program asks for the name of the .cpp file to be analyzed. You should check
whether the file has been opened successfully or not. In case of a file open failure, ask for a
different file name until it is opened successfully. While reading the content of the .cpp file,
your program is going to print some information regarding the enclosing symbols, i.e. bracket
characters, { } [ ] ( ), in the file. Namely, it will print the following information for each
symbol:
1. the symbol itself,
2. the line number in which it occurs, and
3. if the symbol is a closing one, i.e. } or ] or ), the line number of its matching opening
symbol.
As soon as a syntax error related to enclosing symbols is detected, your program will
display an appropriate error message and will stop without checking the rest of the file. If
processing the input file is complete and no errors are found, you will display a general success
message. See the sample runs about these messages, but before that, please read on the
document to comprehend the rules that you will need to check in your program.
Line numbering starts with 1.© Sabancı University, unauthorized reproduction, usage, posting are strictly prohibited
Data Structure to be Used
In this homework you are going to use STACKS ONLY. Stacks will be used to keep track of
enclosing symbol information of the input .cpp file. The stack code files that we provide
together with the homework document, DynStackHW4.cpp and DynStackHW4.h, must
be used in your program and you are not allowed to modify their content (but you need to
change the file names to follow the file naming convention). Your main program must be
written as another cpp file.
You cannot use any other multiple data containers, such as vectors, built-in arrays, dynamic
arrays, other linked lists, etc., in this homework.
The stack class, namely DynStack, provided in the homework package is a specialized
stack class that stores information regarding enclosing symbols. Each node in the stack will
contain information about a single symbol as well as the line number in which that symbol is
located. DynStack uses the StackNode type of struct as shown below:
Enclosing Symbol Rules
Once you’ve opened the input .cpp file, you will create an empty DynStack object and
will begin processing the file one character at a time. Your program must check that the
input .cpp file abides by the following rules:
1. Any opening symbol, { ( [, must have a matching closing symbol, } ] ), that
appears somewhere after the opening one. However, there could be some other codes
between them.
2. A particular closing symbol closes the last seen but unclosed matching opening symbol
(see the example in item 3 below).
3. Once you have an opening symbol, there could be other opening ones coming after
(same type or not). Here, the rule is this: all open ones, which are opened afterward,
must be closed before closing a previous one. For example, consider the following code:
Line 1 int main(){
Line 2 x(10, {20});
Line 3 y(5);
Line 4 }
Here, the open curly bracket on Line 1 (the red one) is closed at the end on Line 4.
Meanwhile, there are several other parenthesis and brackets opened and closed. You can
follow the matchings through colors.
4. There should not be any unclosed open symbols left when you reach the end of the file.
struct StackNode {
char symbol; // enclosing symbol
int line_number; // line where symbol is seen
StackNode* next;
}; but let us list the possible error cases that might appear:
1. If you encounter a closing symbol and if the last seen and unclosed opening symbol
does not match, then this is an error. For example, in the following code, the closing
green curly bracket } should pair with the last seen unclosed open symbol, which is the
green open parenthesis ( after x, but since their types do not match, this is an error.
int main(){
x(10, {20}};
y(5);
}
2. An error occurs if an opening symbol is never closed at the end of the input .cpp file.
There is such a case in the sample runs.
3. When a closing symbol is seen and if there is no unclosed opening symbol seen before,
then this is an error. For example, consider the following code. Here, the closing curly
bracket on Line 3 does not have any opening one since all of the previous opening ones
have been previously closed.
void foo ()
{}
}
int main(){
x(10, {20});
y(5);
}
Algorithmic Hint: The use of stack is related to checking these rules and error cases. If you
keep information regarding the opening symbols on the stack, when you see a closing one, you
can check the top of the stack to decide. To do so, push, pop and isEmpty functions of the
given DynStack class is sufficient, but to be on the safe side we also implemented destructor,
deep copy constructor and deep assignment operator as well.
Assumptions
While processing an input .cpp file, please make the following assumptions:
1. There are no comments in the input .cpp file.
2. If there are string or character literals in the input .cpp file, they will not contain
enclosing symbols. In other words, strings and characters inside the input .cpp file will
not contain any of the symbols { } [ ] ( )
Rules and Submission
General rules and the submission guidelines are the same as previous homework assignments,
please refer to them. You have to submit both .cpp and .h files of the stack class (after properly
renaming) together with your main program file.
Good Luck!
Albert Levi and Amro Alabsi Aljundi
No unclosed
opening symbol
for this.© Sabancı University, unauthorized reproduction, usage, posting are strictly prohibited
Sample Runs
Some sample runs are given below, but these are not comprehensive, therefore you have to
consider all possible cases to get full mark. Inputs are shown in bold and italic.
The sample input files are provided in the .zip package of this homework.
Sample Run 1:
ex1.cpp
Output:
#include <iostream>
using namespace std;
int main()
{
function((int)10.1, {1,2,3});
{
cout << "hello";
}
return 0;
}
Please enter the file name: ex1.txt
File not found.
Please enter the file name: ex1.c
File not found.
Please enter the file name: ex1.cpp
Found the opening symbol ( at line 5
Found the closing symbol ) at line 5 which closes the opening symbol ( at line 5
Found the opening symbol { at line 6
Found the opening symbol ( at line 7
Found the opening symbol ( at line 7
Found the closing symbol ) at line 7 which closes the opening symbol ( at line 7
Found the opening symbol { at line 7
Found the closing symbol } at line 7 which closes the opening symbol { at line 7
Found the closing symbol ) at line 7 which closes the opening symbol ( at line 7
Found the opening symbol { at line 8
Found the closing symbol } at line 10 which closes the opening symbol { at line 8
Found the closing symbol } at line 12 which closes the opening symbol { at line 6
File processed successfully. No errors were found.
ex2.cpp
Output:
Sample Run 3:
ex3.cpp
Output:
int main(){
x(10, {20};
y(5)}
}
Please enter the file name: ex2.cpp
Found the opening symbol ( at line 1
Found the closing symbol ) at line 1 which closes the opening symbol ( at line 1
Found the opening symbol { at line 1
Found the opening symbol ( at line 2
Found the opening symbol { at line 2
Found the closing symbol } at line 2 which closes the opening symbol { at line 2
Found the opening symbol ( at line 3
Found the closing symbol ) at line 3 which closes the opening symbol ( at line 3
ERROR!!! Found the closing symbol } at line 3 but the last unclosed opening symbol is ( at line 2
int main(){
x(10, {20});
y(5);
(1+5+(11
Please enter the file name: ex3.cpp
Found the opening symbol ( at line 1
Found the closing symbol ) at line 1 which closes the opening symbol ( at line 1
Found the opening symbol { at line 1
Found the opening symbol ( at line 2
Found the opening symbol { at line 2
Found the closing symbol } at line 2 which closes the opening symbol { at line 2
Found the closing symbol ) at line 2 which closes the opening symbol ( at line 2
Found the opening symbol ( at line 3
Found the closing symbol ) at line 3 which closes the opening symbol ( at line 3
Found the opening symbol ( at line 4
Found the opening symbol ( at line 4
ERROR!!! The following opening symbols were not closed:
Symbol ( at line 4
Symbol ( at line 4
Symbol { at line 1 prohibited
Sample Run 4:
ex4.cpp
Output:
int main(){
x(10, {20});
y(5);
(1+5+(11))
}
}
Please enter the file name: ex4.cpp
Found the opening symbol ( at line 1
Found the closing symbol ) at line 1 which closes the opening symbol ( at line 1
Found the opening symbol { at line 1
Found the opening symbol ( at line 2
Found the opening symbol { at line 2
Found the closing symbol } at line 2 which closes the opening symbol { at line 2
Found the closing symbol ) at line 2 which closes the opening symbol ( at line 2
Found the opening symbol ( at line 3
Found the closing symbol ) at line 3 which closes the opening symbol ( at line 3
Found the opening symbol ( at line 4
Found the opening symbol ( at line 4
Found the closing symbol ) at line 4 which closes the opening symbol ( at line 4
Found the closing symbol ) at line 4 which closes the opening symbol ( at line 4
Found the closing symbol } at line 5 which closes the opening symbol { at line 1
ERROR!!! Found the closing symbol } but there are no unclosed opening symbols!© S
Sample Run 5:
ex5.cpp
Output:
void foo(){
cout << "hello again";
}
int main(){
x(10, {20});
y(5);
(1+5+(11));
}
Please enter the file name: ex5.cpp
Found the opening symbol ( at line 1
Found the closing symbol ) at line 1 which closes the opening symbol ( at line 1
Found the opening symbol { at line 1
Found the closing symbol } at line 3 which closes the opening symbol { at line 1
Found the opening symbol ( at line 4
Found the closing symbol ) at line 4 which closes the opening symbol ( at line 4
Found the opening symbol { at line 4
Found the opening symbol ( at line 5
Found the opening symbol { at line 5
Found the closing symbol } at line 5 which closes the opening symbol { at line 5
Found the closing symbol ) at line 5 which closes the opening symbol ( at line 5
Found the opening symbol ( at line 6
Found the closing symbol ) at line 6 which closes the opening symbol ( at line 6
Found the opening symbol ( at line 7
Found the opening symbol ( at line 7
Found the closing symbol ) at line 7 which closes the opening symbol ( at line 7
Found the closing symbol ) at line 7 which closes the opening symbol ( at line 7
Found the closing symbol } at line 8 which closes the opening symbol { at line 4
File processed successfully. No errors were found
ex6.cpp
Output:
int main(){
x(10, {20});
y(5);
(1+5+(11));
}
}
void who(){
cout << "hello once more";
}
Please enter the file name: ex6.cpp
Found the opening symbol ( at line 1
Found the closing symbol ) at line 1 which closes the opening symbol ( at line 1
Found the opening symbol { at line 1
Found the opening symbol ( at line 2
Found the opening symbol { at line 2
Found the closing symbol } at line 2 which closes the opening symbol { at line 2
Found the closing symbol ) at line 2 which closes the opening symbol ( at line 2
Found the opening symbol ( at line 3
Found the closing symbol ) at line 3 which closes the opening symbol ( at line 3
Found the opening symbol ( at line 4
Found the opening symbol ( at line 4
Found the closing symbol ) at line 4 which closes the opening symbol ( at line 4
Found the closing symbol ) at line 4 which closes the opening symbol ( at line 4
Found the closing symbol } at line 5 which closes the opening symbol { at line 1
ERROR!!! Found the closing symbol } but there are no unclosed opening symbols!