%{
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
unordered_map<string, int> symbol_table;
int location_counter = 0;
%}
%%
^START[ \t]+[0-9]+ { location_counter = atoi(yytext + 5); }
^[A-Za-z][A-Za-z0-9]*:[ \t]*DS[ \t]+[0-9]+ { symbol_table[string(yytext, yyleng - 4)] = location_counter; }
^[A-Za-z][A-Za-z0-9]*:[ \t]* { symbol_table[string(yytext, yyleng - 1)] = location_counter; }
.* { if (strcmp(yytext, "END") != 0) location_counter++; }
%%
int main(int argc, char** argv) {
// Run the lexer on the input
yylex();
// Output the final symbol table
cout << "Symbol Table:" << endl;
for (const auto& pair : symbol_table) {
cout << pair.first << "\t" << pair.second << endl;
}
return 0;
}
int yywrap() {
return 1;
}
JXsKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnVub3JkZXJlZF9tYXA8c3RyaW5nLCBpbnQ+IHN5bWJvbF90YWJsZTsKaW50IGxvY2F0aW9uX2NvdW50ZXIgPSAwOwolfQoKJSUKXlNUQVJUWyBcdF0rWzAtOV0rICAgICAgeyBsb2NhdGlvbl9jb3VudGVyID0gYXRvaSh5eXRleHQgKyA1KTsgfQpeW0EtWmEtel1bQS1aYS16MC05XSo6WyBcdF0qRFNbIFx0XStbMC05XSsgICB7IHN5bWJvbF90YWJsZVtzdHJpbmcoeXl0ZXh0LCB5eWxlbmcgLSA0KV0gPSBsb2NhdGlvbl9jb3VudGVyOyB9Cl5bQS1aYS16XVtBLVphLXowLTldKjpbIFx0XSogICAgICAgICAgICAgICAgeyBzeW1ib2xfdGFibGVbc3RyaW5nKHl5dGV4dCwgeXlsZW5nIC0gMSldID0gbG9jYXRpb25fY291bnRlcjsgfQouKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZiAoc3RyY21wKHl5dGV4dCwgIkVORCIpICE9IDApIGxvY2F0aW9uX2NvdW50ZXIrKzsgfQolJQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAvLyBSdW4gdGhlIGxleGVyIG9uIHRoZSBpbnB1dAogICAgeXlsZXgoKTsKCiAgICAvLyBPdXRwdXQgdGhlIGZpbmFsIHN5bWJvbCB0YWJsZQogICAgY291dCA8PCAiU3ltYm9sIFRhYmxlOiIgPDwgZW5kbDsKICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IHN5bWJvbF90YWJsZSkgewogICAgICAgIGNvdXQgPDwgcGFpci5maXJzdCA8PCAiXHQiIDw8IHBhaXIuc2Vjb25kIDw8IGVuZGw7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCmludCB5eXdyYXAoKSB7CiAgICByZXR1cm4gMTsKfQo=