mirror of
https://onedev.site.tesses.net/crosslang
synced 2026-02-09 01:25:45 +00:00
Add reflective variables and fields
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user