本文整理汇总了C#中Scope.RegisterVariable方法的典型用法代码示例。如果您正苦于以下问题:C# Scope.RegisterVariable方法的具体用法?C# Scope.RegisterVariable怎么用?C# Scope.RegisterVariable使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Scope
的用法示例。
在下文中一共展示了Scope.RegisterVariable方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ParseTableConstructor
private static Expression ParseTableConstructor(Scope scope, LuaLexer code)
{
// table ::= '{' [field] { fieldsep field } [fieldsep] '}'
// fieldsep ::= ',' | ';'
FetchToken(LuaToken.BracketCurlyOpen, code);
if (code.Current.Typ != LuaToken.BracketCurlyClose)
{
int iIndex = 1;
Scope scopeTable = new Scope(scope);
// Create the variable for the table
ParameterExpression tableVar = scopeTable.RegisterVariable(typeof(LuaTable), "#table");
scopeTable.AddExpression(Expression.Assign(tableVar, CreateEmptyTableExpression()));
// fiest field
ParseTableField(tableVar, scopeTable, code, ref iIndex);
// collect more table fields
while (code.Current.Typ == LuaToken.Comma || code.Current.Typ == LuaToken.Semicolon)
{
code.Next();
// Optional last separator
if (code.Current.Typ == LuaToken.BracketCurlyClose)
break;
// Parse the field
ParseTableField(tableVar, scopeTable, code, ref iIndex);
}
scopeTable.AddExpression(tableVar);
scopeTable.ExpressionBlockType = typeof(LuaTable);
// Closing bracket
FetchToken(LuaToken.BracketCurlyClose, code);
return scopeTable.ExpressionBlock;
}
else
{
FetchToken(LuaToken.BracketCurlyClose, code);
return CreateEmptyTableExpression();
}
}
示例2: ParseExpressionStatement
//.........这里部分代码省略.........
expr.MoveNext();
if (prefixes.Count == 1) // one expression, one variable?
{
scope.AddExpression(
prefixes[0].GenerateSet(scope, expr.Current != null ? expr.Current : Expression.Constant(null, typeof(object)))
);
}
else if (expr.Current == null) // No expression, assign null
{
for (int i = 0; i < prefixes.Count; i++)
scope.AddExpression(prefixes[i].GenerateSet(scope, Expression.Constant(null, typeof(object))));
}
else // assign on an unknown number of expressions
{
#region -- unknown number --
List<ParameterExpression> assignTempVars = new List<ParameterExpression>();
List<Expression> assignExprs = new List<Expression>();
int iExpressionVarOffset;
// Safe the prefixes in variables
for (int k = 0; k < prefixes.Count; k++)
{
var p = prefixes[k];
if (p.Member != null || prefixes[k].Indices != null)
{
p.Instance = ParseExpressionStatementExchangeToTempVar(assignTempVars, assignExprs, p.Instance);
if (p.Indices != null)
{
for (int l = 0; l < p.Indices.Length; l++)
p.Indices[l] = ParseExpressionStatementExchangeToTempVar(assignTempVars, assignExprs, p.Indices[l]);
}
}
}
// collect the results of the expressions
iExpressionVarOffset = assignTempVars.Count;
do
{
ParseExpressionStatementExchangeToTempVar(assignTempVars, assignExprs, expr.Current);
} while (expr.MoveNext());
// Assign the Result to the prefixes
int i = 0;
int j = 0;
ParameterExpression lastVariable = null;
while (i < prefixes.Count)
{
if (i < assignTempVars.Count - iExpressionVarOffset) // are the variables
{
if (i == assignTempVars.Count - iExpressionVarOffset - 1 && assignTempVars[i + iExpressionVarOffset].Type == typeof(LuaResult)) // check if the last expression is a LuaResult
{
lastVariable = assignTempVars[i + iExpressionVarOffset];
assignExprs.Add(prefixes[i].GenerateSet(scope, GetResultExpression(scope.Runtime, code.Current, lastVariable, j++)));
}
else
{
assignExprs.Add(prefixes[i].GenerateSet(scope, assignTempVars[i + iExpressionVarOffset]));
}
}
else if (lastVariable != null) // we enroll the last expression
{
assignExprs.Add(prefixes[i].GenerateSet(scope, GetResultExpression(scope.Runtime, code.Current, lastVariable, j++)));
}
else // no variable left
{
assignExprs.Add(prefixes[i].GenerateSet(scope, Expression.Default(typeof(object))));
}
i++;
}
// add the block
scope.AddExpression(Expression.Block(assignTempVars, assignExprs));
#endregion
}
// Führe die restlichen Expressions aus
while (expr.MoveNext())
scope.AddExpression(expr.Current);
}
else if (!lLocal)
{
for (int i = 0; i < prefixes.Count; i++)
{
if (prefixes[i].Arguments == null) // do not execute getMember
throw ParseError(prefixes[i].Position, Properties.Resources.rsParseAssignmentExpected);
scope.AddExpression(prefixes[i].GenerateGet(scope, InvokeResult.None));
}
}
// register the variables
if (registerLocals != null)
{
for (int i = 0; i < registerLocals.Count; i++)
scope.RegisterVariable(registerLocals[i]);
}
}
示例3: ParseFunction
private static void ParseFunction(Scope scope, LuaLexer code, bool lLocal)
{
FetchToken(LuaToken.KwFunction, code);
if (lLocal) // Local function, only one identifier is allowed
{
var t = FetchToken(LuaToken.Identifier, code);
ParameterExpression funcVar = null;
Expression exprFunction = ParseLamdaDefinition(scope, code, t.Value, false,
typeDelegate => funcVar = scope.RegisterVariable(typeDelegate, t.Value)
);
scope.AddExpression(Expression.Assign(funcVar, exprFunction));
}
else // Function that is assigned to a table. A chain of identifiers is allowed.
{
Expression assignee = null;
Token tCurrent = FetchToken(LuaToken.Identifier, code);
string sMember = tCurrent.Value;
// Collect the chain of members
while (code.Current.Typ == LuaToken.Dot)
{
code.Next();
// Create the get-member for the current assignee
assignee = ParseFunctionAddChain(scope, tCurrent, assignee, sMember);
sMember = FetchToken(LuaToken.Identifier, code).Value;
}
// add a method to the table. methods get a hidden parameter and will bo marked
bool lMethodMember;
if (code.Current.Typ == LuaToken.Colon)
{
code.Next();
// add the last member to the assignee chain
assignee = ParseFunctionAddChain(scope, tCurrent, assignee, sMember);
// fetch the method name
sMember = FetchToken(LuaToken.Identifier, code).Value;
lMethodMember = true;
}
else
{
if (assignee == null)
assignee = scope.LookupExpression(csEnv); // create a global function
lMethodMember = false;
}
// generate lambda
scope.AddExpression(MemberSetExpression(scope.Runtime, tCurrent, assignee, sMember, lMethodMember, ParseLamdaDefinition(scope, code, sMember, lMethodMember, null)));
}
}