#include
#include
#include
using namespace std;
struct var {
string name;
string n;
};
struct node {
var info;
node* next;
};
void add(node*& head, var n) {
node* q = new node;
q->next = NULL;
q->info = n;
if (head == NULL) {
head = q;
}
else {
node* p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = q;
}
}
void ch(node*& head, var n) {
node* p = head;
bool b = false;
while (p && !b) {
if (p->info.name == n.name) {
p->info.n = n.n;
b = true;
}
p = p->next;
}
if (!b)
add(head, n);
}
string find(string& name, node*& head) {
node* p = head;
while (p) {
if (p->info.name == name) {
return p->info.n;
}
}
return "-";
}
int defop(char g) {
switch (g) {
case '|': // диз
return 0;
break;
case '&': // кон
return 1;
break;
case '+': // слож
return 2;
break;
case '-': // имп
return 3;
break;
case '*': // шеф
return 4;
break;
case ';':
return 5;
break;
case ' ':
return 5;
break;
default:
return -1;
}
}
bool f(node*& vars) {
ifstream in("in.txt");
int condition = 0;
int op = 0;
char c;
string name;
int idxname = 0;
string n;
int idxn = 0;
string n1;
int idxn1 = 0;
string name1;
while (in >> c) {
switch (condition) {
case 0:
if (isdigit(c) || isalpha(c)) {
if (idxname == 0 && isdigit(c))
condition = -1;
else {
name += c;
}
}
else if (c == ':')
condition = 1;
else
condition = -1;
break;
case 1:
if (c == '=')
condition = 1;
else if (isalpha(c)) {
condition = 2;
name1 = c;
}
else if (c == '0' || c == '1') {
condition = 3;
idxn = 1;
n = c;
}
else
condition = -1;
break;
case 2:
if (isalpha(c) || isdigit(c)) {
name1 += c;
}
else if (c == ' ' || c == ';') {
n = find(name1, vars);
if (n == "-")
condition = -1;
else {
var t;
t.n = n;
t.name = name;
name = "";
idxname = 0;
ch(vars, t);
condition = 0;
}
}
else {
op = defop(c);
if (op == -1)
condition = -1;
else
condition = 4;
}
break;
case 3:
if (idxn < 8) {
if (c == '0' || c == '1') {
idxn++;
n += c;
}
else
condition = -1;
}
else {
if (c == '0' || c == '1')
condition = -1;
else {
op = defop(c);
if (op == -1)
condition = -1;
else if (op == 5) {
var t;
t.n = n;
t.name = name;
name = "";
idxname = 0;
ch(vars, t);
condition = 0;
}
else
condition = 4;
}
}
break;
case 4:
if (isalpha(c)) {
condition = 5;
name1 = c;
}
else if (c == '0' || c == '1') {
condition = 6;
idxn1 = 1;
n1 = c;
}
else
condition = -1;
break;
case 5:
if (isalpha(c) || isdigit(c)) {
name1 += c;
}
else if (c == ' ' || c == ';') {
n1 = find(name1, vars);
if (n1 == "-")
condition = -1;
else {
string ans = "00000000";
for (int i = 0; i < 8; ++i) {
int a = (n[i] - '0'), b = (n1[i] - '0');
switch (op) {
case 0:
ans[i] = (a || b) + '0';
break;
case 1:
ans[i] = (a && b) + '0';
break;
case 2:
ans[i] = ((a + b) % 2) + '0';
break;
case 3:
ans[i] = (!(a && !b)) + '0';
break;
case 4:
ans[i] = (!(a && b)) + '0';
break;
}
}
var gh;
gh.n = ans;
gh.name = name;
name = "";
idxname = 0;
ch(vars, gh);
condition = 0;
}
}
else
condition = -1;
break;
case 6:
if (idxn1 < 8) {
if (c == '0' || c == '1') {
idxn1++;
n1 += c;
}
else
condition = -1;
}
else {
if (c == '0' || c == '1')
condition = -1;
else {
string ans = "00000000";
for (int i = 0; i < 8; ++i) {
int a = (n[i] - '0'), b = (n1[i] - '0');
switch (op) {
case 0:
ans[i] = (a || b) + '0';
break;
case 1:
ans[i] = (a && b) + '0';
break;
case 2:
ans[i] = ((a + b) % 2) + '0';
break;
case 3:
ans[i] = (!(a && !b)) + '0';
break;
case 4:
ans[i] = (!(a && b)) + '0';
break;
}
}
var gh;
gh.n = ans;
gh.name = name;
name = "";
idxname = 0;
ch(vars, gh);
condition = 0;
}
}
}
if (condition == -1)
return false;
}
return true;
}
void pr(node* head) {
while (head) {
cout << head->info.name << '=' << head->info.n << '\n';
head = head->next;
}
}
int main()
{
node* vars = NULL;
if (f(vars)) {
pr(vars);
}
else {
cout << "syntax error";
}
}