mirror of
https://onedev.site.tesses.net/crosslang
synced 2026-03-26 11:40:23 +00:00
Add Null Coalescing operator
This commit is contained in:
@@ -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]));
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user