Add reflective variables and fields

This commit is contained in:
2025-05-17 18:28:19 -05:00
parent a684c9ba45
commit bb19d2444c
8 changed files with 451 additions and 27 deletions

View File

@@ -1021,16 +1021,16 @@ namespace Tesses::CrossLang
instructions.push_back(new JumpStyleInstruction(JMP,myJmp));
}
}
else if(adv.nodeName == GetVariableExpression && adv.nodes.size() == 1 && std::holds_alternative<std::string>(adv.nodes[0]))
else if(adv.nodeName == GetVariableExpression && adv.nodes.size() == 1)
{
instructions.push_back(new StringInstruction(GetString(std::get<std::string>(adv.nodes[0]))));
GenNode(instructions,adv.nodes[0],scope,contscope,brkscope,contI,brkI);
instructions.push_back(new SimpleInstruction(GETVARIABLE));
}
else if(adv.nodeName == GetFieldExpression && adv.nodes.size() == 2 && std::holds_alternative<std::string>(adv.nodes[1]))
else if(adv.nodeName == GetFieldExpression && adv.nodes.size() == 2)
{
GenNode(instructions,adv.nodes[0],scope,contscope,brkscope,contI,brkI);
instructions.push_back(new StringInstruction(GetString(std::get<std::string>(adv.nodes[1]))));
GenNode(instructions,adv.nodes[1],scope,contscope,brkscope,contI,brkI);
instructions.push_back(new SimpleInstruction(GETFIELD));
@@ -1047,9 +1047,9 @@ namespace Tesses::CrossLang
{
auto varNode = std::get<AdvancedSyntaxNode>(adv.nodes[0]);
if(varNode.nodeName == GetVariableExpression && varNode.nodes.size() == 1 && std::holds_alternative<std::string>(varNode.nodes[0]))
if(varNode.nodeName == GetVariableExpression && varNode.nodes.size() == 1)
{
instructions.push_back(new StringInstruction(GetString(std::get<std::string>(varNode.nodes[0]))));
GenNode(instructions,varNode.nodes[0],scope,contscope,brkscope,contI,brkI);
GenNode(instructions,adv.nodes[1],scope,contscope,brkscope,contI,brkI);
instructions.push_back(new SimpleInstruction(SETVARIABLE));
}
@@ -1067,7 +1067,7 @@ namespace Tesses::CrossLang
}
else if(varNode.nodeName == DeclareExpression && varNode.nodes.size() == 1 && std::holds_alternative<std::string>(varNode.nodes[0]))
{
instructions.push_back(new StringInstruction(GetString(std::get<std::string>(varNode.nodes[0]))));
GenNode(instructions,varNode.nodes[0],scope,contscope,brkscope,contI,brkI);
GenNode(instructions,adv.nodes[1],scope,contscope,brkscope,contI,brkI);
instructions.push_back(new SimpleInstruction(DECLAREVARIABLE));
}
@@ -1091,7 +1091,8 @@ namespace Tesses::CrossLang
else if(varNode.nodeName == GetFieldExpression && varNode.nodes.size() == 2 && std::holds_alternative<std::string>(varNode.nodes[1]))
{
GenNode(instructions,varNode.nodes[0],scope,contscope,brkscope,contI,brkI);
instructions.push_back(new StringInstruction(GetString(std::get<std::string>(varNode.nodes[1]))));
GenNode(instructions,varNode.nodes[1],scope,contscope,brkscope,contI,brkI);
GenNode(instructions,adv.nodes[1],scope,contscope,brkscope,contI,brkI);
instructions.push_back(new SimpleInstruction(SETFIELD));
}
@@ -1394,6 +1395,7 @@ namespace Tesses::CrossLang
{
name.push_back(GetString(std::get<std::string>(res.nodes[1])));
}
}
else if(res.nodeName == GetVariableExpression && res.nodes.size() == 1)
{

View File

@@ -547,6 +547,20 @@ namespace Tesses::CrossLang
i++;
}
else if(tokens[i].type == LexTokenType::Symbol && tokens[i].text == ".")
{
i++;
if(IsSymbol("["))
{
node = AdvancedSyntaxNode::Create(GetVariableExpression,true,{ParseExpression()});
EnsureSymbol("]");
}
else
{
node = AdvancedSyntaxNode::Create(RelativePathExpression, true, {});
}
}
else if(IsSymbol("<"))
{
uint32_t htmlId = NewId();
@@ -590,7 +604,15 @@ namespace Tesses::CrossLang
auto variable = tokens[i];
i++;
if(variable.type == LexTokenType::Symbol && variable.text == "[")
if(variable.type == LexTokenType::Symbol && variable.text == ".")
{
EnsureSymbol("[");
node = AdvancedSyntaxNode::Create(DeclareExpression,true,{
AdvancedSyntaxNode::Create(GetVariableExpression ,true,{ParseExpression()})
});
EnsureSymbol("]");
}
else if(variable.type == LexTokenType::Symbol && variable.text == "[")
{
node = AdvancedSyntaxNode::Create(DeclareExpression,true,{
AdvancedSyntaxNode::Create(ArrayExpression ,true,{ParseExpression()})
@@ -725,6 +747,13 @@ namespace Tesses::CrossLang
if(tkn.text == ".")
{
if(i>=tokens.size()) throw std::out_of_range("End of file");
if(IsSymbol("["))
{
node = AdvancedSyntaxNode::Create(GetFieldExpression, true, {node, ParseExpression()});
EnsureSymbol("]");
continue;
}
if(tokens[i].type != LexTokenType::Identifier) throw std::exception();
std::string name = tokens[i].text;
if(name == "operator")
@@ -807,10 +836,7 @@ namespace Tesses::CrossLang
return AdvancedSyntaxNode::Create(RootPathExpression,true,{});
}
}
else if(IsSymbol("."))
{
return AdvancedSyntaxNode::Create(RelativePathExpression, true, {});
}
return ParseValue();
}