mirror of
https://github.com/hazemKrimi/jack-vm-translator.git
synced 2026-05-02 02:10:27 +00:00
Implement branching
This commit is contained in:
@@ -0,0 +1,39 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
string translateLabel(string label)
|
||||||
|
{
|
||||||
|
stringstream output;
|
||||||
|
|
||||||
|
output << "(" << label << ")" << endl;
|
||||||
|
|
||||||
|
return output.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
string translateGoto(string label)
|
||||||
|
{
|
||||||
|
stringstream output;
|
||||||
|
|
||||||
|
output << "@" << label << endl;
|
||||||
|
output << "0;JMP" << endl;
|
||||||
|
|
||||||
|
return output.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
string translateIfGoto(string label)
|
||||||
|
{
|
||||||
|
stringstream output;
|
||||||
|
|
||||||
|
output << "@SP" << endl;
|
||||||
|
output << "M=M-1" << endl;
|
||||||
|
output << "A=M" << endl;
|
||||||
|
output << "D=M" << endl;
|
||||||
|
|
||||||
|
output << "@" << label << endl;
|
||||||
|
output << "D;JNE" << endl;
|
||||||
|
|
||||||
|
return output.str();
|
||||||
|
}
|
||||||
+26
-6
@@ -2,9 +2,9 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "utils.h"
|
|
||||||
#include "operations.h"
|
#include "operations.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
#include "branching.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@@ -15,6 +15,11 @@ private:
|
|||||||
string filename;
|
string filename;
|
||||||
vector<vector<string>> commands;
|
vector<vector<string>> commands;
|
||||||
|
|
||||||
|
void closeFile()
|
||||||
|
{
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Code(string path, vector<vector<string>> tokens)
|
Code(string path, vector<vector<string>> tokens)
|
||||||
{
|
{
|
||||||
@@ -30,6 +35,11 @@ public:
|
|||||||
commands = tokens;
|
commands = tokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
~Code()
|
||||||
|
{
|
||||||
|
closeFile();
|
||||||
|
}
|
||||||
|
|
||||||
void translate()
|
void translate()
|
||||||
{
|
{
|
||||||
for (const vector<string> &vec : commands)
|
for (const vector<string> &vec : commands)
|
||||||
@@ -45,6 +55,21 @@ public:
|
|||||||
file << translatePop(filename, determineSegment(vec[1]), stoi(vec[2]));
|
file << translatePop(filename, determineSegment(vec[1]), stoi(vec[2]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (vec.size() == 2)
|
||||||
|
{
|
||||||
|
if (vec[0] == "label")
|
||||||
|
{
|
||||||
|
file << translateLabel(vec[1]);
|
||||||
|
}
|
||||||
|
if (vec[0] == "goto")
|
||||||
|
{
|
||||||
|
file << translateGoto(vec[1]);
|
||||||
|
}
|
||||||
|
if (vec[0] == "if-goto")
|
||||||
|
{
|
||||||
|
file << translateIfGoto(vec[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (vec.size() == 1)
|
else if (vec.size() == 1)
|
||||||
{
|
{
|
||||||
switch (determineOperation(vec[0]))
|
switch (determineOperation(vec[0]))
|
||||||
@@ -83,9 +108,4 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void closeFile()
|
|
||||||
{
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|||||||
+14
-5
@@ -4,7 +4,7 @@
|
|||||||
#include <regex>
|
#include <regex>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <vector>
|
#include "utils.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
@@ -37,17 +37,25 @@ private:
|
|||||||
if (!isEmptyLine(matched[1]))
|
if (!isEmptyLine(matched[1]))
|
||||||
{
|
{
|
||||||
string command = matched[1];
|
string command = matched[1];
|
||||||
|
|
||||||
|
trim(command);
|
||||||
vmCode.append(command + '\n');
|
vmCode.append(command + '\n');
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
trim(text);
|
||||||
vmCode.append(text + '\n');
|
vmCode.append(text + '\n');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void closeFile()
|
||||||
|
{
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Parser(string path)
|
Parser(string path)
|
||||||
{
|
{
|
||||||
@@ -73,6 +81,11 @@ public:
|
|||||||
matchedVector.push_back(matched[2]);
|
matchedVector.push_back(matched[2]);
|
||||||
matchedVector.push_back(matched[3]);
|
matchedVector.push_back(matched[3]);
|
||||||
}
|
}
|
||||||
|
else if (regex_search(text, matched, regex("^(.*) (.*)")))
|
||||||
|
{
|
||||||
|
matchedVector.push_back(matched[1]);
|
||||||
|
matchedVector.push_back(matched[2]);
|
||||||
|
}
|
||||||
else if (regex_search(text, matched, regex("^(.*)")))
|
else if (regex_search(text, matched, regex("^(.*)")))
|
||||||
{
|
{
|
||||||
matchedVector.push_back(matched[1]);
|
matchedVector.push_back(matched[1]);
|
||||||
@@ -82,8 +95,4 @@ public:
|
|||||||
|
|
||||||
return commands;
|
return commands;
|
||||||
}
|
}
|
||||||
|
|
||||||
void closeFile() {
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,6 +5,23 @@
|
|||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
inline void ltrim(string &str) {
|
||||||
|
str.erase(str.begin(), find_if(str.begin(), str.end(), [](unsigned char ch) {
|
||||||
|
return !isspace(ch);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void rtrim(string &str) {
|
||||||
|
str.erase(find_if(str.rbegin(), str.rend(), [](unsigned char ch) {
|
||||||
|
return !isspace(ch);
|
||||||
|
}).base(), str.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void trim(string &str) {
|
||||||
|
rtrim(str);
|
||||||
|
ltrim(str);
|
||||||
|
}
|
||||||
|
|
||||||
string generateRandomLabel() {
|
string generateRandomLabel() {
|
||||||
random_device rd;
|
random_device rd;
|
||||||
mt19937 gen(rd());
|
mt19937 gen(rd());
|
||||||
|
|||||||
Reference in New Issue
Block a user