Language: C++

#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;

enum ORDER{
	ADD,
	SUB,
	SET,
	IF,
	HALT,
};

struct Info{
	ORDER order;
	char var1,var2,var3;
	int con;
};

int current_var[26];
int history_var[50][26];
int line[50],rev_line[1001];
Info info[50];
bool is_jumped[50];

char table[50][51];

int main(){

	for(int i = 0; i <= 1000; i++)rev_line[i] = -1;

	for(int i = 0; i < 26; i++)current_var[i] = -1;

	for(int i = 0; i < 50; i++){
		for(int k = 0; k < 26; k++)history_var[i][k] = -1;
	}

	for(int i = 0; i < 50; i++)is_jumped[i] = false;

	int N;
	scanf("%d",&N);

	getchar();

	int tmp,index;

	for(int i = 0; i < N; i++){
		fgets(table[i],50,stdin);

		//??????????????????
		tmp = 0;
		for(index = 0; table[i][index] != ' '; index++){
			tmp = 10*tmp+table[i][index]-'0';
		}
		line[i] = tmp;
		rev_line[tmp] = i;

		index++;
		switch(table[i][index]){
		case 'A': //ADD
			info[i].order = ADD;
			index += 4;
			info[i].var1 = table[i][index];
			current_var[info[i].var1-'a'] = 0;
			index += 2;
			info[i].var2 = table[i][index];
			current_var[info[i].var2-'a'] = 0;
			index += 2;

			if(table[i][index] >= 'a' && table[i][index] <= 'z'){
				info[i].var3 = table[i][index];
				current_var[info[i].var3-'a'] = 0;
			}else{
				tmp = 0;
				for(;table[i][index] >= '0' && table[i][index] <= '9';index++){
					tmp = 10*tmp + table[i][index]-'0';
				}
				info[i].var3 = '@';
				info[i].con = tmp;
			}
			break;
		case 'S':
			if(table[i][index+1] == 'U'){
				info[i].order = SUB;
				index += 4;
				info[i].var1 = table[i][index];
				current_var[info[i].var1-'a'] = 0;
				index += 2;
				info[i].var2 = table[i][index];
				current_var[info[i].var2-'a'] = 0;
				index += 2;

				if(table[i][index] >= 'a' && table[i][index] <= 'z'){
					info[i].var3 = table[i][index];
					current_var[info[i].var3-'a'] = 0;
				}else{
					tmp = 0;
					for(;table[i][index] >= '0' && table[i][index] <= '9';index++){
						tmp = 10*tmp + table[i][index]-'0';
					}
					info[i].var3 = '@';
					info[i].con = tmp;
				}
			}else{
				info[i].order = SET;
				index += 4;
				info[i].var1 = table[i][index];
				current_var[info[i].var1-'a'] = 0;
				index += 2;
				if(table[i][index] >= 'a' && table[i][index] <= 'z'){
					info[i].var2 = table[i][index];
					current_var[info[i].var2-'a'] = 0;
				}else{
					tmp = 0;
					for(;table[i][index] >= '0' && table[i][index] <= '9';index++){
						tmp = 10*tmp + table[i][index]-'0';
					}
					info[i].var2 = '@';
					info[i].con = tmp;
				}
			}
			break;
		case 'I':
			info[i].order = IF;
			index += 3;
			info[i].var1 = table[i][index];
			current_var[info[i].var1-'a'] = 0;
			index += 2;

			tmp = 0;
			for( ;table[i][index] >= '0' && table[i][index] <= '9'; index++){
				tmp = 10*tmp+table[i][index]-'0';
			}
			info[i].con = tmp;
			break;
		case 'H':
			info[i].order = HALT;
			break;
		}
	}

	bool LOOP_FLG = false,HALT_FLG = false;

	int line = 0;
	int tmp_1,tmp_2;

	while(true){

		switch(info[line].order){
		case ADD:
			tmp_1 = current_var[info[line].var2-'a'];

			if(info[line].var3 == '@'){
				tmp_2 = info[line].con;
			}else{
				tmp_2 = current_var[info[line].var3-'a'];
			}

			if(tmp_1+tmp_2 >= 16){
				HALT_FLG = true;
			}else{
				current_var[info[line].var1-'a'] = tmp_1+tmp_2;
			}
			line++;
			break;
		case SUB:
			tmp_1 = current_var[info[line].var2-'a'];

			if(info[line].var3 == '@'){
				tmp_2 = info[line].con;
			}else{
				tmp_2 = current_var[info[line].var3-'a'];
			}

			if(tmp_1-tmp_2 < 0){
				HALT_FLG = true;
			}else{
				current_var[info[line].var1-'a'] = tmp_1-tmp_2;
			}
			line++;
			break;
		case SET:
			if(info[line].var2 == '@'){
				tmp_1 = info[line].con;
			}else{
				tmp_1 = current_var[info[line].var2-'a'];
			}
			if(tmp_1 < 0 || tmp_1 >= 16){
				HALT = true;
			}else{
				current_var[info[line].var1-'a'] = tmp_1;
			}
			line++;
			break;
		case IF:
			if(current_var[info[line].var1-'a'] == 0){
				line++;
			}else{ //?????£????????????

				if(rev_line[info[line].con] == -1){ //?????£??????????????£??????
					HALT_FLG = true;
				}else{
					if(is_jumped[line] == false){
						is_jumped[line] = true;
						for(int i = 0; i < 26; i++){
							history_var[line][i] = current_var[i];
						}
						line = rev_line[info[line].con];
					}else{
						LOOP_FLG = true;
						for(int i = 0; i < 26; i++){
							if(history_var[line][i] != current_var[i]){
								LOOP_FLG = false;
								break;
							}
						}

						if(!LOOP_FLG){
							line = rev_line[info[line].con];
							for(int i = 0; i < 26; i++){
								history_var[line][i] = current_var[i];
							}
						}
					}
				}
			}
			break;
		case HALT:
			HALT_FLG = true;
			break;
		}
		if(line == N || LOOP_FLG == true || HALT_FLG == true)break;
	}


	if(LOOP_FLG){
		printf("inf\n");
	}else{
		for(int i = 0; i < 26; i++){
			if(current_var[i] != -1){
				printf("%c=%d\n",'a'+i,current_var[i]);
			}
		}
	}

	return 0;
}

Compiler output:
a.cc: In function 'int main()':
a.cc:202:33: error: lvalue required as left operand of assignment
  202 |                                 HALT = true;
      |                                 ^~~~