Add Null Coalescing operator

This commit is contained in:
2025-07-26 20:17:19 -05:00
parent a233adf37f
commit 92d65771c1
6 changed files with 319 additions and 5 deletions

View File

@@ -521,7 +521,18 @@ namespace Tesses::CrossLang
TWO_EXPR(NotEqualsExpression, NEQ)
TWO_EXPR(EqualsExpression, EQ)
TWO_EXPR(XOrExpression, XOR)
if(adv.nodeName == ClassStatement && adv.nodes.size() >= 3 && std::holds_alternative<std::string>(adv.nodes[0]))
if(adv.nodeName == NullCoalescingExpression && adv.nodes.size() == 2)
{
uint32_t ifId = NewId();
std::string ifIdTrue = "__compGenTrue";
ifIdTrue.append(std::to_string(ifId));
GenNode(instructions,adv.nodes[0],scope,contscope,brkscope,contI,brkI);
instructions.push_back(new JumpStyleInstruction(Instruction::JMPIFDEFINED, ifIdTrue));
GenNode(instructions,adv.nodes[1],scope,contscope,brkscope,contI,brkI);
instructions.push_back(new LabelInstruction(ifIdTrue));
}
else if(adv.nodeName == ClassStatement && adv.nodes.size() >= 3 && std::holds_alternative<std::string>(adv.nodes[0]))
{
CodeGenClass cls;
cls.documentation = GetString(std::get<std::string>(adv.nodes[0]));

View File

@@ -579,6 +579,7 @@ namespace Tesses::CrossLang
break;
case '<':
case '>':
case '?':
if(peek == read)
{
Flush();
@@ -670,7 +671,6 @@ namespace Tesses::CrossLang
case ':':
case ';':
case ',':
case '?':
Flush();
Symbol({read});
break;

View File

@@ -1088,6 +1088,10 @@ namespace Tesses::CrossLang
{
return AdvancedSyntaxNode::Create(CompoundAssignExpression,true,{AdvancedSyntaxNode::Create(XOrExpression,true,{ node,ParseAssignment()})});
}
else if(IsSymbol("?\?="))
{
return AdvancedSyntaxNode::Create(CompoundAssignExpression,true,{AdvancedSyntaxNode::Create(NullCoalescingExpression,true,{ node,ParseAssignment()})});
}
return node;
}
SyntaxNode Parser::ParseNode(bool isRoot)
@@ -1547,9 +1551,18 @@ namespace Tesses::CrossLang
EnsureSymbol(";");
return v;
}
SyntaxNode Parser::ParseNullCoalescing()
{
SyntaxNode expr = ParseLOr();
while(IsSymbol("?\?"))
{
expr = AdvancedSyntaxNode::Create(NullCoalescingExpression,true,{expr,ParseLOr()});
}
return expr;
}
SyntaxNode Parser::ParseTernary()
{
SyntaxNode node = ParseLOr();
SyntaxNode node = ParseNullCoalescing();
if(IsSymbol("?"))
{
auto yes = ParseTernary();