mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-05 19:11:50 +00:00
languages support (WIP)
This commit is contained in:
parent
0837cf4f03
commit
7bf70bb26e
21 changed files with 456 additions and 38 deletions
|
|
@ -98,6 +98,18 @@ void BasicParser::skipWhitespace() {
|
|||
}
|
||||
}
|
||||
|
||||
void BasicParser::skipLine() {
|
||||
while (hasNext()) {
|
||||
if (source[pos] == '\n') {
|
||||
pos++;
|
||||
linestart = pos;
|
||||
line++;
|
||||
break;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
|
||||
bool BasicParser::hasNext() {
|
||||
return pos < source.length();
|
||||
}
|
||||
|
|
@ -250,7 +262,7 @@ bool BasicParser::parseNumber(int sign, number_u& out) {
|
|||
return true;
|
||||
}
|
||||
|
||||
string BasicParser::parseString(char quote) {
|
||||
string BasicParser::parseString(char quote, bool closeRequired) {
|
||||
std::stringstream ss;
|
||||
while (hasNext()) {
|
||||
char c = source[pos];
|
||||
|
|
@ -282,13 +294,16 @@ string BasicParser::parseString(char quote) {
|
|||
}
|
||||
continue;
|
||||
}
|
||||
if (c == '\n') {
|
||||
if (c == '\n' && closeRequired) {
|
||||
throw error("non-closed string literal");
|
||||
}
|
||||
ss << c;
|
||||
pos++;
|
||||
}
|
||||
throw error("unexpected end");
|
||||
if (closeRequired) {
|
||||
throw error("unexpected end");
|
||||
}
|
||||
return ss.str();
|
||||
}
|
||||
|
||||
parsing_error BasicParser::error(std::string message) {
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ protected:
|
|||
uint linestart = 0;
|
||||
|
||||
virtual void skipWhitespace();
|
||||
void skipLine();
|
||||
void expect(char expected);
|
||||
char peek();
|
||||
char nextChar();
|
||||
|
|
@ -79,7 +80,7 @@ protected:
|
|||
std::string parseName();
|
||||
int64_t parseSimpleInt(int base);
|
||||
bool parseNumber(int sign, number_u& out);
|
||||
std::string parseString(char chr);
|
||||
std::string parseString(char chr, bool closeRequired=true);
|
||||
|
||||
parsing_error error(std::string message);
|
||||
|
||||
|
|
|
|||
|
|
@ -115,16 +115,7 @@ Reader::Reader(Wrapper* wrapper, string file, string source) : BasicParser(file,
|
|||
void Reader::skipWhitespace() {
|
||||
BasicParser::skipWhitespace();
|
||||
if (hasNext() && source[pos] == '#') {
|
||||
pos++;
|
||||
while (hasNext()) {
|
||||
if (source[pos] == '\n') {
|
||||
pos++;
|
||||
linestart = pos;
|
||||
line++;
|
||||
break;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
skipLine();
|
||||
if (hasNext() && is_whitespace(peek())) {
|
||||
skipWhitespace();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue