Tokens seems to be working
This commit is contained in:
parent
915032d3f7
commit
21bab5d635
@ -1,2 +1,2 @@
|
|||||||
DMS.cpp
|
LineParser.cpp
|
||||||
DMS.vcxproj -> C:\Users\Ryan\source\repos\DMS\Debug\DMS.exe
|
DMS.vcxproj -> C:\Users\Ryan\source\repos\DMS\Debug\DMS.exe
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,13 +1,40 @@
|
|||||||
#include "LineParser.h"
|
#include "LineParser.h"
|
||||||
|
|
||||||
using namespace dms::tokens;
|
using namespace dms::tokens;
|
||||||
|
using namespace dms::utils;
|
||||||
namespace dms {
|
namespace dms {
|
||||||
|
void doCheck(passer* stream,std::vector<token>* t_vec, size_t line, bool &isNum, bool &hasDec, std::vector<uint8_t>* buffer) {
|
||||||
|
if (isNum) {
|
||||||
|
t_vec->push_back(token{ tokens::number,codes::NOOP,stream->processBuffer(*buffer),line });
|
||||||
|
buffer->clear();
|
||||||
|
isNum = false;
|
||||||
|
hasDec = false;
|
||||||
|
}
|
||||||
|
else if (buffer->size() > 0) {
|
||||||
|
std::string str = stream->processBuffer(*buffer);
|
||||||
|
if (utils::isNum(str) && str.size() > 0) {
|
||||||
|
t_vec->push_back(token{ tokens::number,codes::NOOP,stream->processBuffer(*buffer),line });
|
||||||
|
buffer->clear();
|
||||||
|
isNum = false;
|
||||||
|
hasDec = false;
|
||||||
|
}
|
||||||
|
else if (utils::isalphanum(str) && str.size() > 0) {
|
||||||
|
t_vec->push_back(token{ tokens::name,codes::NOOP,stream->processBuffer(*buffer),line });
|
||||||
|
buffer->clear();
|
||||||
|
hasDec = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
t_vec->push_back(token{ tokens::name,codes::ERRO,"Invalid variable name!",line });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
cmd* tokenizer(std::vector<token>* tok) {
|
cmd* tokenizer(std::vector<token>* tok) {
|
||||||
|
cmd* c = new cmd{};
|
||||||
|
// turn toke data into
|
||||||
|
return c;
|
||||||
}
|
}
|
||||||
LineParser::LineParser(std::string f) {
|
LineParser::LineParser(std::string f) {
|
||||||
fn = f;
|
fn = f;
|
||||||
|
|
||||||
}
|
}
|
||||||
LineParser::LineParser() {}
|
LineParser::LineParser() {}
|
||||||
dms_state* dms::LineParser::Parse() {
|
dms_state* dms::LineParser::Parse() {
|
||||||
@ -23,27 +50,219 @@ namespace dms {
|
|||||||
}
|
}
|
||||||
dms_state* dms::LineParser::Parse(dms_state* state, std::string file) {
|
dms_state* dms::LineParser::Parse(dms_state* state, std::string file) {
|
||||||
std::map<std::string, chunk> chunks;
|
std::map<std::string, chunk> chunks;
|
||||||
std::vector<token> tokens;
|
std::vector<token> t_vec;
|
||||||
std::string li;
|
std::string li;
|
||||||
std::ifstream myfile(file);
|
std::ifstream myfile(file);
|
||||||
std::stringstream rawdata;
|
std::stringstream rawdata;
|
||||||
// Read whole file into a string
|
// Read whole file into a string
|
||||||
if (myfile.is_open())
|
if (myfile.is_open())
|
||||||
{
|
{
|
||||||
rawdata << myfile.rdbuf();
|
std::string line;
|
||||||
|
while (std::getline(myfile, line)) {
|
||||||
|
rawdata << line << "\n";
|
||||||
|
}
|
||||||
myfile.close();
|
myfile.close();
|
||||||
std::cout << rawdata.str() << std::endl;
|
//std::cout << rawdata.str() << std::endl;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
std::cout << "Unable to open file";
|
std::cout << "Unable to open file";
|
||||||
delete[] state; // Cleanup
|
delete[] state; // Cleanup
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
passer stream = passer();
|
||||||
|
stream.stream = rawdata.str();
|
||||||
|
uint8_t data = stream.next();
|
||||||
|
std::vector<uint8_t> buffer;
|
||||||
|
bool isStr = false;
|
||||||
|
bool isNum = false;
|
||||||
|
bool hasDec = false;
|
||||||
|
bool labelStart = false;
|
||||||
|
size_t line = 0;
|
||||||
|
while (data != NULL) {
|
||||||
|
if (data == '/' && stream.peek()=='/') {
|
||||||
|
line++;
|
||||||
|
stream.next('\n'); // Seek until you find a newline
|
||||||
|
}
|
||||||
|
else if (data == '\n') {
|
||||||
|
if (isNum) {
|
||||||
|
t_vec.push_back(token{ tokens::number,codes::NOOP,stream.processBuffer(buffer),line });
|
||||||
|
buffer.clear();
|
||||||
|
isNum = false;
|
||||||
|
}
|
||||||
|
line++;
|
||||||
|
data = ' ';
|
||||||
|
}
|
||||||
|
else if (data == '"' && !isStr) {
|
||||||
|
isStr = true;
|
||||||
|
}
|
||||||
|
else if (data == ':' && stream.peek()==':' && !labelStart) {
|
||||||
|
labelStart = true;
|
||||||
|
stream.next();
|
||||||
|
}
|
||||||
|
else if (data == ':' && stream.peek() == ':' && labelStart) {
|
||||||
|
t_vec.push_back(token{ tokens::label,codes::NOOP,stream.processBuffer(buffer),line });
|
||||||
|
buffer.clear();
|
||||||
|
stream.next();
|
||||||
|
labelStart = false;
|
||||||
|
}
|
||||||
|
else if (data == '\\' && stream.peek() == '"' && isStr) {
|
||||||
|
buffer.push_back('"');
|
||||||
|
stream.next();
|
||||||
|
}
|
||||||
|
else if (data == '"' && isStr) {
|
||||||
|
isStr = false;
|
||||||
|
t_vec.push_back(token{ tokens::string,codes::NOOP,stream.processBuffer(buffer),line });
|
||||||
|
buffer.clear();
|
||||||
|
}
|
||||||
|
else if (isdigit(data) ) {
|
||||||
|
isNum = true;
|
||||||
|
buffer.push_back(data);
|
||||||
|
}
|
||||||
|
else if (isalnum(data) || isStr) {
|
||||||
|
buffer.push_back(data);
|
||||||
|
}
|
||||||
|
else if (data == '.' && isNum && !hasDec) {
|
||||||
|
hasDec = true;
|
||||||
|
buffer.push_back(data);
|
||||||
|
}
|
||||||
|
else if (data == '.' && isNum && hasDec) {
|
||||||
|
t_vec.push_back(token{ tokens::number,codes::ERRO,"Malformed number!",line });
|
||||||
|
}
|
||||||
|
else if (data == '[') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::bracketo,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == ']') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::bracketc,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '(') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::parao,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == ')') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::parac,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == ',') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::seperator,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '.') {
|
||||||
|
//doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::dot,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '{') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::cbracketo,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '}') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::cbracketc,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '+') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::plus,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '-') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::minus,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '*') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::multiply,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '/') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::divide,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '^') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::pow,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '%') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::mod,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '=') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::equal,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == ':') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::bracket,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
else if (data == '!') {
|
||||||
|
doCheck(&stream, &t_vec, line, isNum, hasDec, &buffer);
|
||||||
|
t_vec.push_back(token{ tokens::Not,codes::NOOP,"",line });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data == ' ' && !isStr) { // tokens end with a space
|
||||||
|
token tok;
|
||||||
|
std::string str = stream.processBuffer(buffer);
|
||||||
|
buffer.clear();
|
||||||
|
if (str == "enable") {
|
||||||
|
tok.build(tokens::flag, codes::ENAB);
|
||||||
|
} else if (str == "entry") {
|
||||||
|
tok.build(tokens::flag, codes::ENTR);
|
||||||
|
}
|
||||||
|
else if (str == "loadfile") {
|
||||||
|
tok.build(tokens::flag, codes::LOAD);
|
||||||
|
}
|
||||||
|
else if (str == "version") {
|
||||||
|
tok.build(tokens::flag,codes::VERN);
|
||||||
|
}
|
||||||
|
else if (str == "using") {
|
||||||
|
tok.build(tokens::flag, codes::USIN);
|
||||||
|
}
|
||||||
|
else if (str == "if") {
|
||||||
|
tok.build(tokens::control, codes::IFFF);
|
||||||
|
}
|
||||||
|
else if (str == "elseif") {
|
||||||
|
tok.build(tokens::control, codes::ELIF);
|
||||||
|
}
|
||||||
|
else if (str == "while") {
|
||||||
|
tok.build(tokens::control, codes::WHLE);
|
||||||
|
}
|
||||||
|
else if (str == "true") {
|
||||||
|
tok.build(tokens::True, codes::NOOP);
|
||||||
|
}
|
||||||
|
else if (str == "False") {
|
||||||
|
tok.build(tokens::False, codes::NOOP);
|
||||||
|
}
|
||||||
|
else if (str == "else") {
|
||||||
|
tok.build(tokens::control, codes::ELSE);
|
||||||
|
}
|
||||||
|
else if (str == "and") {
|
||||||
|
tok.build(tokens::And, codes::NOOP);
|
||||||
|
}
|
||||||
|
else if (str == "or") {
|
||||||
|
tok.build(tokens::Or, codes::NOOP);
|
||||||
|
}
|
||||||
|
else if (str == "for") {
|
||||||
|
tok.build(tokens::For, codes::NOOP);
|
||||||
|
}
|
||||||
|
else if (utils::isalphanum(str) && str.size()>0) {
|
||||||
|
tok.build(tokens::name, str);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Unknown command!
|
||||||
|
tok.build(tokens::noop, codes::UNWN);
|
||||||
|
tok.name = str;
|
||||||
|
}
|
||||||
|
if (tok.raw!=codes::UNWN && tok.type != tokens::noop) {
|
||||||
|
tok.line_num = line;
|
||||||
|
t_vec.push_back(tok);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data = stream.next();
|
||||||
|
}
|
||||||
|
std::cout << "Done!" << std::endl;
|
||||||
|
for (size_t i = 0; i < t_vec.size(); i++) {
|
||||||
|
std::cout << t_vec[i] << std::endl;
|
||||||
|
}
|
||||||
// Data is good now let's parse
|
// Data is good now let's parse
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -4,13 +4,50 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include<stdio.h>
|
||||||
|
#include<ctype.h>
|
||||||
#include "codes.h"
|
#include "codes.h"
|
||||||
#include "cmd.h"
|
#include "cmd.h"
|
||||||
#include "dms_state.h"
|
#include "dms_state.h"
|
||||||
#include "chunk.h"
|
#include "chunk.h"
|
||||||
#include "token.h"
|
#include "token.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
namespace dms {
|
namespace dms {
|
||||||
|
struct passer {
|
||||||
|
std::string stream;
|
||||||
|
uint8_t next() {
|
||||||
|
if (stream.size() == pos) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return stream[pos++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void next(uint8_t c) {
|
||||||
|
next();
|
||||||
|
while (peek() != c) {
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
uint8_t prev() {
|
||||||
|
if (0 == pos) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return stream[--pos];
|
||||||
|
}
|
||||||
|
uint8_t peek() {
|
||||||
|
if (stream.size() == pos) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return stream[pos];
|
||||||
|
}
|
||||||
|
std::string processBuffer(std::vector<uint8_t> buf) {
|
||||||
|
return std::string(buf.begin(),buf.end());
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
size_t pos = 0;
|
||||||
|
};
|
||||||
class LineParser
|
class LineParser
|
||||||
{
|
{
|
||||||
std::string fn;
|
std::string fn;
|
||||||
|
|||||||
@ -1,3 +1,3 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Codes.h"
|
#include "Codes.h"
|
||||||
const std::string dms::codes::list[] = { "NOOP","ENTR","ENAB","DISA","LOAD","VERN","USIN","STAT","DISP","ASGN","LABL","CHOI","OPTN","FORE","????","WHLE","FNWR","FNNR","IFFF","ELIF","ELSE","DEFN","SKIP","COMP","INDX","JMPZ","INST" };
|
const std::string dms::codes::list[] = { "NOOP","ENTR","ENAB","DISA","LOAD","VERN","USIN","STAT","DISP","ASGN","LABL","CHOI","OPTN","FORE","????","WHLE","FNWR","FNNR","IFFF","ELIF","ELSE","DEFN","SKIP","COMP","INDX","JMPZ","INST","ERRO" };
|
||||||
@ -29,7 +29,8 @@ namespace dms::codes {
|
|||||||
COMP,
|
COMP,
|
||||||
INDX,
|
INDX,
|
||||||
JMPZ,
|
JMPZ,
|
||||||
INST
|
INST,
|
||||||
|
ERRO
|
||||||
};
|
};
|
||||||
extern const std::string list[];
|
extern const std::string list[];
|
||||||
static bool isControl(const op code) {
|
static bool isControl(const op code) {
|
||||||
|
|||||||
@ -1,12 +1,12 @@
|
|||||||
#include "string_utils.h"
|
#include "string_utils.h"
|
||||||
|
|
||||||
char16_t* copyStr(dms::dms_string str, size_t start, size_t size) {
|
uint8_t* copyStr(dms::dms_string str, size_t start, size_t size) {
|
||||||
char16_t* newptr = new char16_t[size];
|
uint8_t* newptr = new uint8_t[size];
|
||||||
std::copy(str.val + start, str.val + start + size, newptr);
|
std::copy(str.val + start, str.val + start + size, newptr);
|
||||||
return newptr;
|
return newptr;
|
||||||
}
|
}
|
||||||
char16_t* copyStr(dms::dms_string str, dms::dms_number start, dms::dms_number size) {
|
uint8_t* copyStr(dms::dms_string str, dms::dms_number start, dms::dms_number size) {
|
||||||
char16_t* newptr = new char16_t[size.getValue()];
|
uint8_t* newptr = new uint8_t[size.getValue()];
|
||||||
std::copy(str.val + (size_t)start.getValue(), str.val + (size_t)start.getValue() + (size_t)size.getValue(), newptr);
|
std::copy(str.val + (size_t)start.getValue(), str.val + (size_t)start.getValue() + (size_t)size.getValue(), newptr);
|
||||||
return newptr;
|
return newptr;
|
||||||
}
|
}
|
||||||
@ -19,7 +19,7 @@ namespace dms::string_utils {
|
|||||||
}
|
}
|
||||||
if (utils::typeassert(state, args, string)) {
|
if (utils::typeassert(state, args, string)) {
|
||||||
size_t size = args.args[0].s->length;
|
size_t size = args.args[0].s->length;
|
||||||
char16_t* newptr = copyStr(*args.args[0].s, 0, size);
|
uint8_t* newptr = copyStr(*args.args[0].s, 0, size);
|
||||||
std::reverse(newptr, newptr + size);
|
std::reverse(newptr, newptr + size);
|
||||||
dms_string* newstr = new dms_string{ size, newptr };
|
dms_string* newstr = new dms_string{ size, newptr };
|
||||||
return newstr;
|
return newstr;
|
||||||
@ -42,11 +42,12 @@ namespace dms::string_utils {
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char16_t* newptr = copyStr(str, start, size);
|
uint8_t* newptr = copyStr(str, start, size);
|
||||||
dms_string* newstr = new dms_string{ size,newptr };
|
dms_string* newstr = new dms_string{ size,newptr };
|
||||||
return newstr;
|
return newstr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return buildString("");
|
||||||
}
|
}
|
||||||
//string
|
//string
|
||||||
dms_string* upper(dms_state* state, dms_args args) {
|
dms_string* upper(dms_state* state, dms_args args) {
|
||||||
@ -56,7 +57,7 @@ namespace dms::string_utils {
|
|||||||
}
|
}
|
||||||
if (utils::typeassert(state, args, string)) {
|
if (utils::typeassert(state, args, string)) {
|
||||||
dms_string str = *args.args[0].s;
|
dms_string str = *args.args[0].s;
|
||||||
char16_t* newptr = copyStr(str, 0, str.length);
|
uint8_t* newptr = copyStr(str, 0, str.length);
|
||||||
std::transform(newptr, newptr + str.length, newptr, toupper);
|
std::transform(newptr, newptr + str.length, newptr, toupper);
|
||||||
dms_string* newstr = new dms_string{ str.length, newptr };
|
dms_string* newstr = new dms_string{ str.length, newptr };
|
||||||
return newstr;
|
return newstr;
|
||||||
@ -71,7 +72,7 @@ namespace dms::string_utils {
|
|||||||
}
|
}
|
||||||
if (utils::typeassert(state, args, string)) {
|
if (utils::typeassert(state, args, string)) {
|
||||||
dms_string str = *args.args[0].s;
|
dms_string str = *args.args[0].s;
|
||||||
char16_t* newptr = copyStr(str, 0, str.length);
|
uint8_t* newptr = copyStr(str, 0, str.length);
|
||||||
std::transform(newptr, newptr + str.length, newptr, tolower);
|
std::transform(newptr, newptr + str.length, newptr, tolower);
|
||||||
dms_string* newstr = new dms_string{ str.length, newptr };
|
dms_string* newstr = new dms_string{ str.length, newptr };
|
||||||
return newstr;
|
return newstr;
|
||||||
@ -166,6 +167,7 @@ namespace dms::string_utils {
|
|||||||
if (utils::typeassert(state, args, string, string)) {
|
if (utils::typeassert(state, args, string, string)) {
|
||||||
return buildBool(indexOf(state, args)->val != -1);
|
return buildBool(indexOf(state, args)->val != -1);
|
||||||
}
|
}
|
||||||
|
return buildBool(false);
|
||||||
}
|
}
|
||||||
//string number
|
//string number
|
||||||
dms_string* repeat(dms_state* state, dms_args args) {
|
dms_string* repeat(dms_state* state, dms_args args) {
|
||||||
@ -182,5 +184,6 @@ namespace dms::string_utils {
|
|||||||
temp << newstr;
|
temp << newstr;
|
||||||
return buildString(temp.str());
|
return buildString(temp.str());
|
||||||
}
|
}
|
||||||
|
return buildString("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
30
DMS/test.dms
30
DMS/test.dms
@ -1,17 +1,15 @@
|
|||||||
entry main
|
entry main
|
||||||
enable warnings
|
enable warnings
|
||||||
//enable debugging
|
//enable debugging
|
||||||
define
|
loadfile "loadtest.dms"
|
||||||
loadfile loadtest.dms
|
|
||||||
define
|
|
||||||
version 1.2
|
version 1.2
|
||||||
using extendedDefine as
|
using extendedDefine
|
||||||
|
|
||||||
[main]
|
[main]
|
||||||
"This works!"
|
"This works!"
|
||||||
"What's up"
|
"What's up"
|
||||||
|
|
||||||
Ryan "Hello how are you doing?" // this is a comment
|
Ryan "Hello \"how\" are you doing?" // this is a comment
|
||||||
Bob "I'm good you?"
|
Bob "I'm good you?"
|
||||||
|
|
||||||
tester = "Hello"
|
tester = "Hello"
|
||||||
@ -22,12 +20,7 @@ using extendedDefine as
|
|||||||
|
|
||||||
list,test = {{1,2+food,hi[3]},true,tester,123,"This is a string!",false, {3,2,1}},5
|
list,test = {{1,2+food,hi[3]},true,tester,123,"This is a string!",false, {3,2,1}},5
|
||||||
a = list[1]
|
a = list[1]
|
||||||
/*
|
|
||||||
heheheh
|
|
||||||
sdfsdf
|
|
||||||
ghgfh
|
|
||||||
kjuty
|
|
||||||
*/
|
|
||||||
hungry = (-2+4-((5*5)/sqrt(144+5)))^2*2+2
|
hungry = (-2+4-((5*5)/sqrt(144+5)))^2*2+2
|
||||||
list[1] = "Hello"
|
list[1] = "Hello"
|
||||||
var1,var2 = func(1,"string", 2+5)
|
var1,var2 = func(1,"string", 2+5)
|
||||||
@ -36,33 +29,36 @@ using extendedDefine as
|
|||||||
::label::
|
::label::
|
||||||
//Hello im testing stuff
|
//Hello im testing stuff
|
||||||
|
|
||||||
choice "Pick one:"
|
choice "Pick one:"{
|
||||||
"first" func()
|
"first" func()
|
||||||
"second" func()
|
"second" func()
|
||||||
"third" func()
|
"third" func()
|
||||||
"forth" func()
|
"forth" func()
|
||||||
|
}
|
||||||
|
|
||||||
for x = 1,10
|
for x = 1,10
|
||||||
for y = 1,10
|
for y = 1,10
|
||||||
for z = 1,10
|
for z = 1,10 {
|
||||||
"test"
|
"test"
|
||||||
"$x$ $y$ $z$"
|
"$x$ $y$ $z$"
|
||||||
|
}
|
||||||
test = true
|
test = true
|
||||||
test2 = false
|
test2 = false
|
||||||
|
|
||||||
while cond
|
while cond
|
||||||
...
|
...
|
||||||
if (func(123)!=name[1] or true == "Bob") and foodCount >= 10.34
|
if (func(123)!=name[1] or true == "Bob") and foodCount >= 10.34 {
|
||||||
"test=true or test2=false!"
|
"test=true or test2=false!"
|
||||||
"help me"
|
"help me"
|
||||||
if cool == true
|
if cool == true {
|
||||||
"We are here"
|
"We are here"
|
||||||
"Nested if"
|
"Nested if"
|
||||||
|
}
|
||||||
elseif food >= 21
|
elseif food >= 21
|
||||||
"This is getting weird"
|
"This is getting weird"
|
||||||
"Hi"
|
"Hi"
|
||||||
elseif (func2(321)!=name2[1] or true == "Bob2") and foodCount2 >= 100.78
|
}
|
||||||
|
elseif (func2(321)!=name2[1] or true == "Bob2") and foodCount2 >= 1.78
|
||||||
"This Block"
|
"This Block"
|
||||||
else
|
else
|
||||||
"That Block"
|
"That Block"
|
||||||
|
|||||||
76
DMS/token.h
76
DMS/token.h
@ -1,17 +1,85 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "codes.h"
|
||||||
namespace dms::tokens {
|
namespace dms::tokens {
|
||||||
enum tokentype {
|
enum tokentype {
|
||||||
|
noop,
|
||||||
flag,
|
flag,
|
||||||
name,
|
name,
|
||||||
number,
|
number,
|
||||||
boolean,
|
|
||||||
string,
|
string,
|
||||||
parao,
|
parao,
|
||||||
parac,
|
parac,
|
||||||
};
|
bracketo,
|
||||||
|
bracketc,
|
||||||
|
seperator,
|
||||||
|
dot,
|
||||||
|
cbracketo,
|
||||||
|
cbracketc,
|
||||||
|
plus,
|
||||||
|
minus,
|
||||||
|
multiply,
|
||||||
|
divide,
|
||||||
|
pow,
|
||||||
|
mod,
|
||||||
|
equal,
|
||||||
|
bracket,
|
||||||
|
control,
|
||||||
|
True,
|
||||||
|
False,
|
||||||
|
Or,
|
||||||
|
And,
|
||||||
|
Not,
|
||||||
|
For,
|
||||||
|
label
|
||||||
|
};//stream, t_vec, line, isNum, buffer
|
||||||
struct token {
|
struct token {
|
||||||
tokentype type;
|
tokentype type = noop;
|
||||||
std::string raw;
|
codes::op raw = codes::NOOP;
|
||||||
|
std::string name="";
|
||||||
|
size_t line_num=0;
|
||||||
|
void build(tokentype tt, codes::op o) {
|
||||||
|
type = tt;
|
||||||
|
raw = o;
|
||||||
|
}
|
||||||
|
void build(tokentype tt, std::string s) {
|
||||||
|
type = tt;
|
||||||
|
name = s;
|
||||||
|
}
|
||||||
|
friend std::ostream& operator << (std::ostream& out, const token& c) {
|
||||||
|
const std::string temp1[] = {
|
||||||
|
"noop",
|
||||||
|
"flag",
|
||||||
|
"name",
|
||||||
|
"number",
|
||||||
|
"string",
|
||||||
|
"parao",
|
||||||
|
"parac",
|
||||||
|
"bracketo",
|
||||||
|
"bracketc",
|
||||||
|
"seperator",
|
||||||
|
"dot",
|
||||||
|
"cbracketo",
|
||||||
|
"cbracketc",
|
||||||
|
"plus",
|
||||||
|
"minus",
|
||||||
|
"multiply",
|
||||||
|
"divide",
|
||||||
|
"pow",
|
||||||
|
"mod",
|
||||||
|
"equal",
|
||||||
|
"bracket",
|
||||||
|
"control",
|
||||||
|
"true",
|
||||||
|
"false",
|
||||||
|
"or",
|
||||||
|
"and",
|
||||||
|
"not",
|
||||||
|
"for",
|
||||||
|
"label"
|
||||||
|
};
|
||||||
|
out << "Line <" << c.line_num << ">" << codes::list[c.raw] << " " << temp1[c.type] << " \t\t " << c.name;
|
||||||
|
return out;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -1,5 +1,26 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
namespace dms::utils {
|
namespace dms::utils {
|
||||||
|
bool isalphanum(std::string str) {
|
||||||
|
for (size_t i = 0; i < str.size(); i++) {
|
||||||
|
if (!isalnum(str[i]) && str[i]!='_')
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool isalpha(std::string str) {
|
||||||
|
for (size_t i = 0; i < str.size(); i++) {
|
||||||
|
if (!std::isalpha(str[i]) && str[i] != '_')
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool isNum(std::string str) {
|
||||||
|
for (size_t i = 0; i < str.size(); i++) {
|
||||||
|
if (!std::isdigit(str[i]) && str[i] != '.')
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
std::string random_string(size_t length)
|
std::string random_string(size_t length)
|
||||||
{
|
{
|
||||||
auto randchar = []() -> char
|
auto randchar = []() -> char
|
||||||
|
|||||||
@ -21,4 +21,7 @@ namespace dms::utils {
|
|||||||
bool typeassert(dms_args args, datatypes t1=nil, datatypes t2 = nil, datatypes t3 = nil, datatypes t4 = nil, datatypes t5 = nil, datatypes t6 = nil, datatypes t7 = nil, datatypes t8 = nil, datatypes t9 = nil, datatypes t10 = nil, datatypes t11 = nil, datatypes t12 = nil); //Type asserting is mostly an internal thing for build in methods. It's not needed for dms code!
|
bool typeassert(dms_args args, datatypes t1=nil, datatypes t2 = nil, datatypes t3 = nil, datatypes t4 = nil, datatypes t5 = nil, datatypes t6 = nil, datatypes t7 = nil, datatypes t8 = nil, datatypes t9 = nil, datatypes t10 = nil, datatypes t11 = nil, datatypes t12 = nil); //Type asserting is mostly an internal thing for build in methods. It's not needed for dms code!
|
||||||
bool typeassert(dms_state* state, dms_args args, datatypes t1 = nil, datatypes t2 = nil, datatypes t3 = nil, datatypes t4 = nil, datatypes t5 = nil, datatypes t6 = nil, datatypes t7 = nil, datatypes t8 = nil, datatypes t9 = nil, datatypes t10 = nil, datatypes t11 = nil, datatypes t12 = nil);
|
bool typeassert(dms_state* state, dms_args args, datatypes t1 = nil, datatypes t2 = nil, datatypes t3 = nil, datatypes t4 = nil, datatypes t5 = nil, datatypes t6 = nil, datatypes t7 = nil, datatypes t8 = nil, datatypes t9 = nil, datatypes t10 = nil, datatypes t11 = nil, datatypes t12 = nil);
|
||||||
std::string resolveTypes(datatypes t1 = nil, datatypes t2 = nil, datatypes t3 = nil, datatypes t4 = nil, datatypes t5 = nil, datatypes t6 = nil, datatypes t7 = nil, datatypes t8 = nil, datatypes t9 = nil, datatypes t10 = nil, datatypes t11 = nil, datatypes t12 = nil);
|
std::string resolveTypes(datatypes t1 = nil, datatypes t2 = nil, datatypes t3 = nil, datatypes t4 = nil, datatypes t5 = nil, datatypes t6 = nil, datatypes t7 = nil, datatypes t8 = nil, datatypes t9 = nil, datatypes t10 = nil, datatypes t11 = nil, datatypes t12 = nil);
|
||||||
|
bool isalphanum(std::string str);
|
||||||
|
bool isalpha(std::string str);
|
||||||
|
bool isNum(std::string str);
|
||||||
}
|
}
|
||||||
@ -7,7 +7,7 @@
|
|||||||
namespace dms {
|
namespace dms {
|
||||||
dms_string* buildString(std::string str) {
|
dms_string* buildString(std::string str) {
|
||||||
size_t len = str.length();
|
size_t len = str.length();
|
||||||
char16_t* arr = new char16_t[len];
|
uint8_t* arr = new uint8_t[len];
|
||||||
for (size_t i = 0; i < len; i++) {
|
for (size_t i = 0; i < len; i++) {
|
||||||
arr[i] = str.at(i);
|
arr[i] = str.at(i);
|
||||||
}
|
}
|
||||||
@ -50,8 +50,7 @@ namespace dms {
|
|||||||
bool value::typeMatch(const value o) const {
|
bool value::typeMatch(const value o) const {
|
||||||
return type == o.type;
|
return type == o.type;
|
||||||
}
|
}
|
||||||
bool value::set(dms_string* str) {
|
void value::set(dms_string* str) {
|
||||||
try {
|
|
||||||
s = str;
|
s = str;
|
||||||
delete[] b;
|
delete[] b;
|
||||||
delete[] n;
|
delete[] n;
|
||||||
@ -61,15 +60,9 @@ namespace dms {
|
|||||||
n = nullptr;
|
n = nullptr;
|
||||||
e = nullptr;
|
e = nullptr;
|
||||||
c = nullptr;
|
c = nullptr;
|
||||||
type = dms::string;
|
type = string;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
catch (...) {
|
void value::set(dms_boolean* bo) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool value::set(dms_boolean* bo) {
|
|
||||||
try {
|
|
||||||
b = bo;
|
b = bo;
|
||||||
delete[] s;
|
delete[] s;
|
||||||
delete[] n;
|
delete[] n;
|
||||||
@ -79,15 +72,9 @@ namespace dms {
|
|||||||
n = nullptr;
|
n = nullptr;
|
||||||
e = nullptr;
|
e = nullptr;
|
||||||
c = nullptr;
|
c = nullptr;
|
||||||
type = dms::boolean;
|
type = boolean;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
catch (...) {
|
void value::set(dms_number* num) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool value::set(dms_number* num) {
|
|
||||||
try {
|
|
||||||
n = num;
|
n = num;
|
||||||
delete[] b;
|
delete[] b;
|
||||||
delete[] s;
|
delete[] s;
|
||||||
@ -97,15 +84,9 @@ namespace dms {
|
|||||||
s = nullptr;
|
s = nullptr;
|
||||||
e = nullptr;
|
e = nullptr;
|
||||||
c = nullptr;
|
c = nullptr;
|
||||||
type = dms::number;
|
type = number;
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
catch (...) {
|
void dms::value::set(dms_env* en) {
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool dms::value::set(dms_env* en) {
|
|
||||||
try {
|
|
||||||
e = en;
|
e = en;
|
||||||
delete[] b;
|
delete[] b;
|
||||||
delete[] s;
|
delete[] s;
|
||||||
@ -115,12 +96,20 @@ namespace dms {
|
|||||||
n = nullptr;
|
n = nullptr;
|
||||||
s = nullptr;
|
s = nullptr;
|
||||||
c = nullptr;
|
c = nullptr;
|
||||||
type = dms::env;
|
type = env;
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (...) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
void value::set() {
|
||||||
|
delete[] b;
|
||||||
|
delete[] s;
|
||||||
|
delete[] n;
|
||||||
|
delete[] e;
|
||||||
|
delete[] c;
|
||||||
|
s = nullptr;
|
||||||
|
n = nullptr;
|
||||||
|
e = nullptr;
|
||||||
|
c = nullptr;
|
||||||
|
b = nullptr;
|
||||||
|
type = nil;
|
||||||
}
|
}
|
||||||
std::string dms_string::getValue() {
|
std::string dms_string::getValue() {
|
||||||
std::stringstream temp;
|
std::stringstream temp;
|
||||||
@ -137,10 +126,23 @@ namespace dms {
|
|||||||
void dms_env::pushValue(value ind, value val) {
|
void dms_env::pushValue(value ind, value val) {
|
||||||
if (ind.type == number) {
|
if (ind.type == number) {
|
||||||
size_t size = ipart.size();
|
size_t size = ipart.size();
|
||||||
|
if (val.type == nil) {
|
||||||
|
ipart.erase(ind.n->val);
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
else {
|
||||||
ipart.insert_or_assign(ind.n->val, val);
|
ipart.insert_or_assign(ind.n->val, val);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (val.type == nil) {
|
||||||
|
hpart.erase(ind.toString());
|
||||||
|
count--;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
hpart.insert_or_assign(ind.toString(), val);
|
hpart.insert_or_assign(ind.toString(), val);
|
||||||
|
count++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
value dms_env::getValue(value ind) {
|
value dms_env::getValue(value ind) {
|
||||||
|
|||||||
15
DMS/value.h
15
DMS/value.h
@ -25,7 +25,7 @@ namespace dms {
|
|||||||
};
|
};
|
||||||
struct dms_string {
|
struct dms_string {
|
||||||
size_t length = 0;
|
size_t length = 0;
|
||||||
char16_t* val = nullptr;
|
uint8_t* val = nullptr;
|
||||||
std::string getValue();
|
std::string getValue();
|
||||||
friend std::ostream& operator << (std::ostream& out, const dms_string& c) {
|
friend std::ostream& operator << (std::ostream& out, const dms_string& c) {
|
||||||
for (size_t i = 0; i < c.length; i++) {
|
for (size_t i = 0; i < c.length; i++) {
|
||||||
@ -47,10 +47,11 @@ namespace dms {
|
|||||||
dms_string* s = nullptr;
|
dms_string* s = nullptr;
|
||||||
dms_env* e = nullptr;
|
dms_env* e = nullptr;
|
||||||
dms_custom* c = nullptr;
|
dms_custom* c = nullptr;
|
||||||
bool set(dms_string* str);
|
void set(dms_string* str);
|
||||||
bool set(dms_boolean* bo);
|
void set(dms_boolean* bo);
|
||||||
bool set(dms_number* num);
|
void set(dms_number* num);
|
||||||
bool set(dms_env* en);
|
void set(dms_env* en);
|
||||||
|
void set();
|
||||||
bool typeMatch(const value o) const;
|
bool typeMatch(const value o) const;
|
||||||
std::string toString();
|
std::string toString();
|
||||||
friend bool operator<(const value& l, const value& r)
|
friend bool operator<(const value& l, const value& r)
|
||||||
@ -99,7 +100,9 @@ namespace dms {
|
|||||||
std::map<std::string, value> hpart;
|
std::map<std::string, value> hpart;
|
||||||
std::map<double, value> ipart;
|
std::map<double, value> ipart;
|
||||||
void pushValue(value val);
|
void pushValue(value val);
|
||||||
void pushValue(value str, value val);
|
void pushValue(value ind, value val);
|
||||||
value getValue(value val);
|
value getValue(value val);
|
||||||
|
private:
|
||||||
|
size_t count = 0;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
Debug/DMS.exe
BIN
Debug/DMS.exe
Binary file not shown.
BIN
Debug/DMS.ilk
BIN
Debug/DMS.ilk
Binary file not shown.
BIN
Debug/DMS.pdb
BIN
Debug/DMS.pdb
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user