Fixed up raw function

This commit is contained in:
Rafał Grodziński
2025-07-30 23:58:19 +09:00
parent 953a8acb18
commit 163bcb4057
4 changed files with 63 additions and 46 deletions

View File

@@ -28,10 +28,10 @@ i u32 <- 0, rep text[i] != 0:
ret num1 + num2
;*/
/*rawAdd raw<"=r,r,r">: num1 sint32, num2 sint32 -> sint32
rawAdd raw<"=r,r,r">: num1 sint32, num2 sint32 -> sint32
add $1, $2
mov $0, $1
;*/
;
/*rawAdd raw: num1 sint32, num2 sint32 -> sint32
add $1, $2
@@ -48,11 +48,11 @@ i u32 <- 0, rep text[i] != 0:
;*/
main fun: a sint32, b sint32 -> sint32
//printChar()
main fun -> sint32
a sint32 <- 4
b sint32 <- 5
res1 sint32 <- a - b
//res2 sint32 <- rawAdd(4, 5)
res sint32 <- rawAdd(4, 5)
ret res1
ret res
;

View File

@@ -1,7 +1,5 @@
#include "Parsee.h"
#include "Parser/Expression/Expression.h"
Parsee Parsee::tokenParsee(TokenKind tokenKind, bool isRequired, bool shouldReturn) {
Parsee parsee;
parsee.kind = ParseeKind::TOKEN;

View File

@@ -4,7 +4,6 @@
#include <memory>
enum class TokenKind;
class Expression;
enum class ParseeKind {
TOKEN,

View File

@@ -297,9 +297,8 @@ shared_ptr<Statement> Parser::matchStatementFunction() {
}
shared_ptr<Statement> Parser::matchStatementRawFunction() {
return nullptr;
/*bool hasError = false;
optional<vector<ParseeResult>> parseeResults;
bool hasError = false;
ParseeResultsGroup resultsGroup;
string name;
string constraints;
@@ -308,9 +307,8 @@ shared_ptr<Statement> Parser::matchStatementRawFunction() {
string rawSource;
// identifier
parseeResults = parseeResultsForParseeGroup(
resultsGroup = parseeResultsGroupForParseeGroup(
ParseeGroup(
true,
{
Parsee::tokenParsee(TokenKind::IDENTIFIER, true, true),
Parsee::tokenParsee(TokenKind::RAW_FUNCTION, true, false)
@@ -318,17 +316,23 @@ shared_ptr<Statement> Parser::matchStatementRawFunction() {
{}
)
);
if (parseeResults) {
name = (*parseeResults).at(0).getToken()->getLexme();
} else {
hasError = true;
switch (resultsGroup.getKind()) {
case ParseeResultsGroupKind::SUCCESS:
name = resultsGroup.getResults().at(0).getToken()->getLexme();
break;
case ParseeResultsGroupKind::NO_MATCH:
return nullptr;
break;
case ParseeResultsGroupKind::FAILURE:
hasError = true;
break;
}
// options
// constraints
if (!hasError) {
parseeResults = parseeResultsForParseeGroup(
resultsGroup = parseeResultsGroupForParseeGroup(
ParseeGroup(
false,
{
Parsee::tokenParsee(TokenKind::LESS, true, false),
Parsee::tokenParsee(TokenKind::STRING, true, true),
@@ -337,18 +341,27 @@ shared_ptr<Statement> Parser::matchStatementRawFunction() {
{}
)
);
if (parseeResults && !(*parseeResults).empty()) {
constraints = (*parseeResults).at(0).getToken()->getLexme();
} else if (!parseeResults) {
hasError = true;
switch (resultsGroup.getKind()) {
case ParseeResultsGroupKind::SUCCESS:
constraints = resultsGroup.getResults().at(0).getToken()->getLexme();
// remove enclosing quotes
if (constraints.length() >= 2)
constraints = constraints.substr(1, constraints.length() - 2);
break;
case ParseeResultsGroupKind::NO_MATCH:
return nullptr;
break;
case ParseeResultsGroupKind::FAILURE:
hasError = true;
break;
}
}
// arguments
if (!hasError) {
parseeResults = parseeResultsForParseeGroup(
resultsGroup = parseeResultsGroupForParseeGroup(
ParseeGroup(
false,
{
Parsee::tokenParsee(TokenKind::COLON, true, false),
Parsee::tokenParsee(TokenKind::NEW_LINE, false, false),
@@ -356,7 +369,6 @@ shared_ptr<Statement> Parser::matchStatementRawFunction() {
Parsee::valueTypeParsee(true)
},
ParseeGroup(
false,
{
Parsee::tokenParsee(TokenKind::COMMA, true, false),
Parsee::tokenParsee(TokenKind::NEW_LINE, false, false),
@@ -367,23 +379,27 @@ shared_ptr<Statement> Parser::matchStatementRawFunction() {
)
)
);
if (parseeResults && !(*parseeResults).empty()) {
for (int i=0; i<(*parseeResults).size(); i+=2) {
pair<string, shared_ptr<ValueType>> arg;
arg.first = (*parseeResults).at(i).getToken()->getLexme();
arg.second = (*parseeResults).at(i+1).getValueType();
arguments.push_back(arg);
}
} else if (!parseeResults) {
hasError = true;
switch (resultsGroup.getKind()) {
case ParseeResultsGroupKind::SUCCESS:
for (int i=0; i<resultsGroup.getResults().size(); i+=2) {
pair<string, shared_ptr<ValueType>> arg;
arg.first = resultsGroup.getResults().at(i).getToken()->getLexme();
arg.second = resultsGroup.getResults().at(i+1).getValueType();
arguments.push_back(arg);
}
break;
case ParseeResultsGroupKind::NO_MATCH:
break;
case ParseeResultsGroupKind::FAILURE:
hasError = true;
break;
}
}
// return type
if (!hasError) {
parseeResults = parseeResultsForParseeGroup(
resultsGroup = parseeResultsGroupForParseeGroup(
ParseeGroup(
false,
{
Parsee::tokenParsee(TokenKind::RIGHT_ARROW, true, false),
Parsee::tokenParsee(TokenKind::NEW_LINE, false, false),
@@ -393,10 +409,15 @@ shared_ptr<Statement> Parser::matchStatementRawFunction() {
)
);
if (parseeResults && !(*parseeResults).empty()) {
returnType = (*parseeResults).at(0).getValueType();
} else if (!parseeResults) {
hasError = true;
switch (resultsGroup.getKind()) {
case ParseeResultsGroupKind::SUCCESS:
returnType = resultsGroup.getResults().at(0).getValueType();
break;
case ParseeResultsGroupKind::NO_MATCH:
break;
case ParseeResultsGroupKind::FAILURE:
hasError = true;
break;
}
}
@@ -421,7 +442,7 @@ shared_ptr<Statement> Parser::matchStatementRawFunction() {
return nullptr;
}
return make_shared<StatementRawFunction>(name, constraints, arguments, returnType, rawSource);*/
return make_shared<StatementRawFunction>(name, constraints, arguments, returnType, rawSource);
}
shared_ptr<Statement> Parser::matchStatementBlock(vector<TokenKind> terminalTokenKinds) {
@@ -593,7 +614,6 @@ shared_ptr<Expression> Parser::nextExpression() {
if (expression != nullptr || errors.size() > errorsCount)
return expression;
//markError({}, {});
return nullptr;
}