#include <iostream>
#include <vector>
#include <string>
#include <cctype>
#include <stack>
enum class Sym{
None,
AL,
AR,
BL,
BR,
Text,
};
typedef std::vector<Sym> SType;
typedef std::stack<Sym> STType;
bool Parse(SType& S){
STType ST;
for (std::size_t i = 0; i < S.size(); i++){
switch (S[i])
{
case Sym::AL:
case Sym::BL:
ST.push(S[i]);
break;
case Sym::AR:
if (ST.top() == Sym::AL){
ST.pop();
}
else{
return false;
}
break;
case Sym::BR:
if (ST.top() == Sym::BL){
ST.pop();
}
else{
return false;
}
break;
case Sym::Text:
break;//noting process.
default:
break;
}
}
return ST.size() == 0;
}
bool MakeHoge(std::string& S){
SType SV;
Sym Sy=Sym::None;
int P = 0;
for (std::size_t i = 0; i < S.size(); i++){
P = 0;
if (isalnum(S[i]) == 0){
if (S[i + P] != '<') continue;
P++;
if (S[i + P] == 'a' || S[i + P] == 'b' || S[i + P] == '/'){
if (S[i + P] == 'a') Sy = Sym::AL;
if (S[i + P] == 'b') Sy = Sym::BL;
}
P++;
if (S[i + P] == 'a' || S[i + P] == 'b' || S[i + P] == '>'){
if (S[i + P] == 'a') Sy = Sym::AR;
if (S[i + P] == 'b') Sy = Sym::BR;
}
else{
Sy = Sym::None;
}
if (Sy != Sym::None){
SV.push_back(Sy);
Sy = Sym::Text;
i += P;
}
}
else{
Sy = Sym::Text;
for (; i < S.size(); i++){
if (isalnum(S[i]) == 0){
SV.push_back(Sy);
i--;
break;
}
}
}
}
return Parse(SV);
}
int main(){
std::string S;
bool F = false;
S = "<a>ruby<b>php</b>python</a><a><b></b></a><a></a>";
F = MakeHoge(S);
std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
S = "<a>ruby<b>php</b>python</a><a></b></a><a></a>";
F = MakeHoge(S);
std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
S = "<a>ruby<b>php< / b>python< / a><a><b>< / a><a>< / a>";
F = MakeHoge(S);
std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
S = "<a>ruby<b>php< / b>python< / a><a><b>< / b>< / a><a>";
F = MakeHoge(S);
std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
S = "vvvc<a>ruby<b>php</b>python</a><a><b></b></a><a></a> ";
F = MakeHoge(S);
std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
S = "vvvc";
F = MakeHoge(S);
std::cout << '\"' << S << '\"' << " -> " << F << std::endl;
return 0;
}