Compare commits

...

10 Commits

15 changed files with 388 additions and 90 deletions

View File

@@ -1,4 +1,5 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System.Collections;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Convention.RScript.Runner namespace Convention.RScript.Runner
@@ -27,5 +28,23 @@ namespace Convention.RScript.Runner
} }
return null; return null;
} }
[return: MaybeNull]
public override IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context)
{
// 检查并跳转到上次跳转的位置
if (parser.Evaluate<bool>(sentence.content))
{
if (context.GotoPointerStack.Count == 0)
{
throw new RScriptRuntimeException($"No position to back.", context.CurrentRuntimePointer);
}
else
{
DoJumpRuntimePointer(parser, context.GotoPointerStack.Pop(), context);
}
}
yield break;
}
} }
} }

View File

@@ -1,4 +1,5 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System.Collections;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Convention.RScript namespace Convention.RScript
@@ -23,7 +24,7 @@ namespace Convention.RScript
else if (context.NamespaceLayer.TryGetValue(context.RuntimePointerStack.Peek(), out var exitPointer)) else if (context.NamespaceLayer.TryGetValue(context.RuntimePointerStack.Peek(), out var exitPointer))
{ {
context.CurrentRuntimePointer = exitPointer; context.CurrentRuntimePointer = exitPointer;
context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context); return context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context);
} }
else else
{ {
@@ -32,5 +33,27 @@ namespace Convention.RScript
} }
return null; return null;
} }
[return: MaybeNull]
public IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context)
{
// 检查并跳转到当前命名空间的结束位置
if (parser.Evaluate<bool>(sentence.content))
{
if (context.RuntimePointerStack.Count == 0)
{
context.CurrentRuntimePointer = context.Sentences.Length;
}
else if (context.NamespaceLayer.TryGetValue(context.RuntimePointerStack.Peek(), out var exitPointer))
{
context.CurrentRuntimePointer = exitPointer;
yield return context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].RunAsync(parser, context.CurrentSentence, context);
}
else
{
throw new RScriptRuntimeException($"No namespace to break.", context.CurrentRuntimePointer);
}
}
}
} }
} }

View File

@@ -1,5 +1,6 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System; using System;
using System.Collections;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Convention.RScript.Runner namespace Convention.RScript.Runner
@@ -84,22 +85,22 @@ namespace Convention.RScript.Runner
else if (varTypeName == "int") else if (varTypeName == "int")
{ {
varType = typeof(int); varType = typeof(int);
varDefaultValue = varInitExpression == null ? 0 : parser.Evaluate<int>(varInitExpression); varDefaultValue = varInitExpression == null ? 0 : Convert.ChangeType(parser.Evaluate(varInitExpression), typeof(int));
} }
else if (varTypeName == "double") else if (varTypeName == "double")
{ {
varType = typeof(double); varType = typeof(double);
varDefaultValue = varInitExpression == null ? 0.0 : parser.Evaluate<double>(varInitExpression); varDefaultValue = varInitExpression == null ? 0.0 : Convert.ChangeType(parser.Evaluate(varInitExpression), typeof(double));
} }
else if (varTypeName == "float") else if (varTypeName == "float")
{ {
varType = typeof(float); varType = typeof(float);
varDefaultValue = varInitExpression == null ? 0.0f : parser.Evaluate<float>(varInitExpression); varDefaultValue = varInitExpression == null ? 0.0f : Convert.ChangeType(parser.Evaluate(varInitExpression), typeof(float));
} }
else if (varTypeName == "bool") else if (varTypeName == "bool")
{ {
varType = typeof(bool); varType = typeof(bool);
varDefaultValue = varInitExpression == null ? false : parser.Evaluate<bool>(varInitExpression); varDefaultValue = varInitExpression == null ? false : Convert.ChangeType(parser.Evaluate(varInitExpression), typeof(bool));
} }
else if (varTypeName == "var") else if (varTypeName == "var")
{ {
@@ -123,5 +124,63 @@ namespace Convention.RScript.Runner
} }
return null; return null;
} }
[return: MaybeNull]
public IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context)
{
// 定义变量
var varTypeName = sentence.info[0];
var varName = sentence.info[1];
var varInitExpression = sentence.info[2];
Type varType;
object varDefaultValue;
{
if (varTypeName == "string")
{
varType = typeof(string);
varDefaultValue = varInitExpression == null ? string.Empty : varInitExpression.Trim('\"');
}
else if (varTypeName == "int")
{
varType = typeof(int);
varDefaultValue = varInitExpression == null ? 0 : Convert.ChangeType(parser.Evaluate(varInitExpression), typeof(int));
}
else if (varTypeName == "double")
{
varType = typeof(double);
varDefaultValue = varInitExpression == null ? 0.0 : Convert.ChangeType(parser.Evaluate(varInitExpression), typeof(double));
}
else if (varTypeName == "float")
{
varType = typeof(float);
varDefaultValue = varInitExpression == null ? 0.0f : Convert.ChangeType(parser.Evaluate(varInitExpression), typeof(float));
}
else if (varTypeName == "bool")
{
varType = typeof(bool);
varDefaultValue = varInitExpression == null ? false : Convert.ChangeType(parser.Evaluate(varInitExpression), typeof(bool));
}
else if (varTypeName == "var")
{
varType = typeof(object);
varDefaultValue = varInitExpression == null ? new object() : parser.Evaluate(varInitExpression);
}
else
{
throw new RScriptRuntimeException($"Unsupported variable type '{varTypeName}'.", context.CurrentRuntimePointer);
}
}
if (context.CurrentLocalSpaceVariableNames.Peek().Contains(varName) == false)
{
context.Variables.Add(varName, new(varType, varDefaultValue));
parser.context.Variables[varName] = varDefaultValue;
context.CurrentLocalSpaceVariableNames.Peek().Add(varName);
}
else
{
throw new RScriptRuntimeException($"Variable '{varName}' already defined on this namespace.", context.CurrentRuntimePointer);
}
yield break;
}
} }
} }

View File

@@ -1,4 +1,5 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System.Collections;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Convention.RScript.Runner namespace Convention.RScript.Runner
@@ -16,5 +17,12 @@ namespace Convention.RScript.Runner
context.CurrentRuntimePointer = context.NamespaceLayer[context.NamespaceLabels[sentence.content]]; context.CurrentRuntimePointer = context.NamespaceLayer[context.NamespaceLabels[sentence.content]];
return null; return null;
} }
[return: MaybeNull]
public IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context)
{
context.CurrentRuntimePointer = context.NamespaceLayer[context.NamespaceLabels[sentence.content]];
yield break;
}
} }
} }

View File

@@ -1,4 +1,5 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System.Collections;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Convention.RScript.Runner namespace Convention.RScript.Runner
@@ -24,5 +25,20 @@ namespace Convention.RScript.Runner
context.RuntimePointerStack.Push(context.CurrentRuntimePointer); context.RuntimePointerStack.Push(context.CurrentRuntimePointer);
return null; return null;
} }
[return: MaybeNull]
public IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context)
{
// 准备记录当前命名空间中定义的变量, 清空上层命名空间的变量
context.CurrentLocalSpaceVariableNames.Push(new());
// 更新变量值
foreach (var (varName, varValue) in parser.context.Variables)
{
context.Variables.SetValue(varName, varValue);
}
// 压栈
context.RuntimePointerStack.Push(context.CurrentRuntimePointer);
yield break;
}
} }
} }

View File

@@ -1,4 +1,5 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System.Collections;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Convention.RScript.Runner namespace Convention.RScript.Runner
@@ -36,5 +37,32 @@ namespace Convention.RScript.Runner
context.RuntimePointerStack.Pop(); context.RuntimePointerStack.Pop();
return null; return null;
} }
[return: MaybeNull]
public IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context)
{
// 移除当前命名空间的变量
foreach (var local in context.CurrentLocalSpaceVariableNames.Peek())
{
context.Variables.Remove(local);
parser.context.Variables.Remove(local);
}
// 还原上层命名空间的变量
foreach (var local in context.CurrentLocalSpaceVariableNames.Peek())
{
if (context.Variables.ContainsKey(local))
{
parser.context.Variables[local] = context.Variables[local].data;
}
else
{
parser.context.Variables.Remove(local);
}
}
context.CurrentLocalSpaceVariableNames.Pop();
// 弹栈
context.RuntimePointerStack.Pop();
yield break;
}
} }
} }

View File

@@ -1,4 +1,5 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System.Collections;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Convention.RScript.Runner namespace Convention.RScript.Runner
@@ -15,5 +16,14 @@ namespace Convention.RScript.Runner
{ {
return parser.Evaluate(sentence.content); return parser.Evaluate(sentence.content);
} }
[return: MaybeNull]
public IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context)
{
var result = parser.Evaluate(sentence.content);
if(result is IEnumerator ir)
yield return ir;
yield return null;
}
} }
} }

View File

@@ -1,4 +1,5 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System.Collections;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace Convention.RScript.Runner namespace Convention.RScript.Runner
@@ -48,5 +49,43 @@ namespace Convention.RScript.Runner
} }
return null; return null;
} }
[return: MaybeNull]
public override IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context)
{
// 检查并跳转到指定标签
if (parser.Evaluate<bool>(sentence.info[0]))
{
if (context.Labels.TryGetValue(sentence.content, out var labelPointer))
{
context.GotoPointerStack.Push(context.CurrentRuntimePointer);
DoJumpRuntimePointer(parser, labelPointer, context);
}
else if (context.NamespaceLabels.TryGetValue(sentence.content, out labelPointer))
{
int current = context.CurrentRuntimePointer;
//DoEnterNamespace(parser);
context.SentenceRunners[RScriptSentence.Mode.EnterNamespace].Run(parser, context.CurrentSentence, context);
context.CurrentRuntimePointer = labelPointer;
for (int e = context.NamespaceLayer[context.NamespaceLabels[sentence.content]]; ;)
{
yield return context.RunNextStepAsync(parser);
if (context.CurrentRuntimePointer >= context.Sentences.Length)
break;
else if (context.CurrentRuntimePointer == e)
break;
else
context.CurrentRuntimePointer++;
}
//context.DoExitNamespace(parser);
context.SentenceRunners[RScriptSentence.Mode.ExitNamespace].Run(parser, context.CurrentSentence, context);
context.CurrentRuntimePointer = current;
}
else
{
throw new RScriptRuntimeException($"Label '{sentence.content}' not found.", context.CurrentRuntimePointer);
}
}
}
} }
} }

View File

@@ -1,5 +1,6 @@
using Convention.RScript.Parser; using Convention.RScript.Parser;
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
@@ -17,6 +18,7 @@ namespace Convention.RScript.Runner
{ {
depth = jumpResult.Item1; depth = jumpResult.Item1;
lastLayer = jumpResult.Item2; lastLayer = jumpResult.Item2;
context.CurrentRuntimePointer = target;
} }
else else
{ {
@@ -71,5 +73,7 @@ namespace Convention.RScript.Runner
public abstract void Compile(ExpressionParser parser, RScriptSentence sentence, RScriptContext context); public abstract void Compile(ExpressionParser parser, RScriptSentence sentence, RScriptContext context);
[return: MaybeNull] [return: MaybeNull]
public abstract object Run(ExpressionParser parser, RScriptSentence sentence, RScriptContext context); public abstract object Run(ExpressionParser parser, RScriptSentence sentence, RScriptContext context);
[return: MaybeNull]
public abstract IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context);
} }
} }

View File

@@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System; using System;
using System.Linq; using System.Linq;
using System.Diagnostics;
namespace Convention.RScript namespace Convention.RScript
{ {
@@ -121,7 +122,10 @@ namespace Convention.RScript.Parser
{ {
if (CompileGenericExpression.TryGetValue(expression, out var result)) if (CompileGenericExpression.TryGetValue(expression, out var result))
{ {
return (result as IGenericExpression<T>).Evaluate(); if (result is IGenericExpression<T> genericExpression)
return genericExpression.Evaluate();
else
return context.CompileGeneric<T>(expression).Evaluate();
} }
return Compile<T>(expression).Evaluate(); return Compile<T>(expression).Evaluate();
} }

View File

@@ -1,14 +1,79 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks;
namespace Convention.RScript.Variable.CStyle namespace Convention.RScript.Variable.CStyle
{ {
public class CScriptRScriptVariableGenerater : RScriptInjectVariableGenerater public class CScriptRScriptVariableGenerater : RScriptInjectVariableGenerater
{ {
/// <summary>
/// 获取类型的友好显示名称,支持泛型、数组等复杂类型
/// </summary>
public static string GetFriendlyName(Type type)
{
if (type == null) return null;
// 处理泛型类型
if (type.IsGenericType)
{
// 特殊处理可空类型Nullable<T>
if (type.IsNullable())
{
return $"{GetFriendlyName(type.GetGenericArguments()[0])}?";
}
var sb = new StringBuilder();
// 获取类型基础名称(移除 `1, `2 等后缀)
string baseName = type.Name.Contains('`') ? type.Name[..type.Name.IndexOf('`')] : type.Name;
sb.Append(baseName);
sb.Append('<');
// 递归处理泛型参数
Type[] args = type.GetGenericArguments();
for (int i = 0; i < args.Length; i++)
{
if (i > 0) sb.Append(", ");
sb.Append(GetFriendlyName(args[i]));
}
sb.Append('>');
return sb.ToString();
}
// 处理数组类型
if (type.IsArray)
{
string elementName = GetFriendlyName(type.GetElementType());
int rank = type.GetArrayRank();
return rank == 1 ? $"{elementName}[]" : $"{elementName}[{new string(',', rank - 1)}]";
}
// 处理指针类型
if (type.IsPointer)
{
return $"{GetFriendlyName(type.GetElementType())}*";
}
// 处理引用类型ref/out 参数)
if (type.IsByRef)
{
return $"{GetFriendlyName(type.GetElementType())}&";
}
// 普通类型直接返回名称
return type.Name;
}
/// <summary>
/// 判断是否为可空类型
/// </summary>
public static bool IsNullable(Type type)
{
return type.IsGenericType &&
type.GetGenericTypeDefinition() == typeof(Nullable<>);
}
public static string GetTypename(Type type) public static string GetTypename(Type type)
{ {
if (type == typeof(int)) if (type == typeof(int))
@@ -21,12 +86,7 @@ namespace Convention.RScript.Variable.CStyle
return "bool"; return "bool";
if (type == typeof(void)) if (type == typeof(void))
return "void"; return "void";
if (type.IsEnum) return GetFriendlyName(type).Replace('`', '_');
return type.FullName.Replace('`', '_');
if (type.IsClass)
return type.FullName.Replace('`', '_');
var name = type.Name.Replace('`', '_');
return name;
} }
private int m_layer = 0; private int m_layer = 0;
@@ -116,7 +176,9 @@ namespace Convention.RScript.Variable.CStyle
protected override string WritePageHead(Type currentType) protected override string WritePageHead(Type currentType)
{ {
return $"#include\"{GetFilename(currentType.BaseType)}\""; if (currentType.BaseType != null)
return $"#include\"{GetFilename(currentType.BaseType)}\"";
return string.Empty;
} }
public override string GetFilename(Type currentType) public override string GetFilename(Type currentType)

View File

@@ -5,7 +5,6 @@ using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using UnityEditor;
namespace Convention.RScript.Variable namespace Convention.RScript.Variable
{ {

View File

@@ -6,7 +6,6 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using UnityEngine;
using static Convention.RScript.RScriptContext; using static Convention.RScript.RScriptContext;
namespace Convention.RScript namespace Convention.RScript
@@ -78,6 +77,7 @@ namespace Convention.RScript
public interface IRSentenceRunner public interface IRSentenceRunner
{ {
[return: MaybeNull] object Run(ExpressionParser parser, RScriptSentence sentence, RScriptContext context); [return: MaybeNull] object Run(ExpressionParser parser, RScriptSentence sentence, RScriptContext context);
[return: MaybeNull] IEnumerator RunAsync(ExpressionParser parser, RScriptSentence sentence, RScriptContext context);
void Compile(ExpressionParser parser, RScriptSentence sentence, RScriptContext context); void Compile(ExpressionParser parser, RScriptSentence sentence, RScriptContext context);
} }
@@ -92,6 +92,8 @@ namespace Convention.RScript
Dictionary<string, RScriptVariableEntry> GetCurrentVariables(); Dictionary<string, RScriptVariableEntry> GetCurrentVariables();
void Run(ExpressionParser parser); void Run(ExpressionParser parser);
IEnumerator RunAsync(ExpressionParser parser); IEnumerator RunAsync(ExpressionParser parser);
public void ReRun(ExpressionParser parser);
public IEnumerator ReRunAsync(ExpressionParser parser);
SerializableClass Compile(ExpressionParser parser); SerializableClass Compile(ExpressionParser parser);
SerializableClass CompileFromCurrent(ExpressionParser parser); SerializableClass CompileFromCurrent(ExpressionParser parser);
} }
@@ -112,7 +114,7 @@ namespace Convention.RScript
public Tuple<string, int>[] Labels; public Tuple<string, int>[] Labels;
public Tuple<int, int>[] NamespaceLayer; public Tuple<int, int>[] NamespaceLayer;
public Tuple<string, int>[] NamespaceLabels; public Tuple<string, int>[] NamespaceLabels;
public ExpressionParser.SerializableParser CompileParser; //public ExpressionParser.SerializableParser CompileParser;
public Tuple<Tuple<int, int>, Tuple<int, int>>[] JumpPointerCache; public Tuple<Tuple<int, int>, Tuple<int, int>>[] JumpPointerCache;
} }
@@ -265,11 +267,8 @@ namespace Convention.RScript
public RScriptSentence CurrentSentence => Sentences[CurrentRuntimePointer]; public RScriptSentence CurrentSentence => Sentences[CurrentRuntimePointer];
public int StepCount { get; private set; }
internal object RunNextStep(ExpressionParser parser) internal object RunNextStep(ExpressionParser parser)
{ {
StepCount++;
var sentence = CurrentSentence; var sentence = CurrentSentence;
try try
{ {
@@ -277,15 +276,19 @@ namespace Convention.RScript
} }
catch (RScriptException) catch (RScriptException)
{ {
Debug.LogError($"current sentence: {sentence}");
throw; throw;
} }
catch (Exception ex) catch (Exception ex)
{ {
Debug.LogError($"current sentence: {sentence}");
throw new RScriptRuntimeException($"Runtime error: {ex.Message}", CurrentRuntimePointer, ex); throw new RScriptRuntimeException($"Runtime error: {ex.Message}", CurrentRuntimePointer, ex);
} }
} }
internal IEnumerator RunNextStepAsync(ExpressionParser parser)
{
var sentence = CurrentSentence;
if (SentenceRunners.TryGetValue(sentence.mode, out var runner))
yield return runner.RunAsync(parser, sentence, this);
}
internal readonly Stack<int> RuntimePointerStack = new(); internal readonly Stack<int> RuntimePointerStack = new();
internal readonly Stack<int> GotoPointerStack = new(); internal readonly Stack<int> GotoPointerStack = new();
@@ -305,7 +308,6 @@ namespace Convention.RScript
private void BeforeRun(ExpressionParser parser) private void BeforeRun(ExpressionParser parser)
{ {
StepCount = 0;
CurrentLocalSpaceVariableNames.Clear(); CurrentLocalSpaceVariableNames.Clear();
RuntimePointerStack.Clear(); RuntimePointerStack.Clear();
GotoPointerStack.Clear(); GotoPointerStack.Clear();
@@ -323,6 +325,21 @@ namespace Convention.RScript
} }
} }
private void ResetAndSureRunAgain(ExpressionParser parser)
{
CurrentLocalSpaceVariableNames.Clear();
RuntimePointerStack.Clear();
GotoPointerStack.Clear();
CurrentLocalSpaceVariableNames.Clear();
CurrentLocalSpaceVariableNames.Push(new());
JumpPointerCache.Clear();
parser.context.Variables.Clear();
foreach (var (name, varObject) in Variables)
{
parser.context.Variables[name] = varObject.data;
}
}
private void AfterRun(ExpressionParser parser) private void AfterRun(ExpressionParser parser)
{ {
foreach (var (varName, varValue) in parser.context.Variables) foreach (var (varName, varValue) in parser.context.Variables)
@@ -335,6 +352,7 @@ namespace Convention.RScript
public void Run(ExpressionParser parser) public void Run(ExpressionParser parser)
{ {
BeforeRun(parser); BeforeRun(parser);
Stack<IEnumerator> buffer = new();
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++) for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
{ {
RunNextStep(parser); RunNextStep(parser);
@@ -347,12 +365,27 @@ namespace Convention.RScript
BeforeRun(parser); BeforeRun(parser);
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++) for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
{ {
var ret = RunNextStep(parser); yield return RunNextStepAsync(parser);
if (ret is IEnumerator ir) }
{ AfterRun(parser);
yield return ir; }
}
yield return null; public void ReRun(ExpressionParser parser)
{
ResetAndSureRunAgain(parser);
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
{
RunNextStep(parser);
}
AfterRun(parser);
}
public IEnumerator ReRunAsync(ExpressionParser parser)
{
ResetAndSureRunAgain(parser);
for (CurrentRuntimePointer = 0; CurrentRuntimePointer < Sentences.Length; CurrentRuntimePointer++)
{
yield return RunNextStepAsync(parser);
} }
AfterRun(parser); AfterRun(parser);
} }
@@ -360,14 +393,14 @@ namespace Convention.RScript
public SerializableClass Compile(ExpressionParser parser) public SerializableClass Compile(ExpressionParser parser)
{ {
BeforeRun(parser); BeforeRun(parser);
foreach (var item in Sentences) //foreach (var item in Sentences)
{ //{
if (SentenceRunners.TryGetValue(item.mode, out var runner)) // if (SentenceRunners.TryGetValue(item.mode, out var runner))
runner.Compile(parser, item, this); // runner.Compile(parser, item, this);
} //}
return new SerializableClass() return new SerializableClass()
{ {
CompileParser = parser.Serialize(), //CompileParser = parser.Serialize(),
Labels = (from item in Labels select Tuple.Create(item.Key, item.Value)).ToArray(), Labels = (from item in Labels select Tuple.Create(item.Key, item.Value)).ToArray(),
NamespaceLayer = (from item in NamespaceLayer select Tuple.Create(item.Key, item.Value)).ToArray(), NamespaceLayer = (from item in NamespaceLayer select Tuple.Create(item.Key, item.Value)).ToArray(),
NamespaceLabels = (from item in NamespaceLabels select Tuple.Create(item.Key, item.Value)).ToArray(), NamespaceLabels = (from item in NamespaceLabels select Tuple.Create(item.Key, item.Value)).ToArray(),
@@ -379,7 +412,7 @@ namespace Convention.RScript
{ {
return new SerializableClass() return new SerializableClass()
{ {
CompileParser = parser.Serialize(), //CompileParser = parser.Serialize(),
Labels = (from item in Labels select Tuple.Create(item.Key, item.Value)).ToArray(), Labels = (from item in Labels select Tuple.Create(item.Key, item.Value)).ToArray(),
NamespaceLayer = (from item in NamespaceLayer select Tuple.Create(item.Key, item.Value)).ToArray(), NamespaceLayer = (from item in NamespaceLayer select Tuple.Create(item.Key, item.Value)).ToArray(),
NamespaceLabels = (from item in NamespaceLabels select Tuple.Create(item.Key, item.Value)).ToArray(), NamespaceLabels = (from item in NamespaceLabels select Tuple.Create(item.Key, item.Value)).ToArray(),

View File

@@ -143,9 +143,8 @@ namespace Convention.RScript
{ {
parser = new(new()); parser = new(new());
context = CreateContext(SplitScript(script).ToArray(), import, variables); context = CreateContext(SplitScript(script).ToArray(), import, variables);
return context.RunAsync(parser); yield return context.RunAsync(parser);
} }
public SerializableClass Compile(string script, RScriptImportClass import = null, RScriptVariables variables = null) public SerializableClass Compile(string script, RScriptImportClass import = null, RScriptVariables variables = null)
{ {
parser = new(new()); parser = new(new());
@@ -171,7 +170,17 @@ namespace Convention.RScript
parser = new(new()); parser = new(new());
//parser.Deserialize(data.CompileParser); //parser.Deserialize(data.CompileParser);
context = CreateContext(data, import, variables); context = CreateContext(data, import, variables);
return context.RunAsync(parser); yield return context.RunAsync(parser);
} }
public Dictionary<string, RScriptVariableEntry> ReRun()
{
context.ReRun(parser);
return context.GetCurrentVariables();
}
public IEnumerator ReRunAsync()
{
yield return context.ReRunAsync(parser);
}
} }
} }

View File

@@ -89,81 +89,66 @@ namespace Convention.RScript
// 反序列化 Sentences 数组 // 反序列化 Sentences 数组
int sentencesLength = reader.ReadInt32(); int sentencesLength = reader.ReadInt32();
if (sentencesLength > 0) result.Sentences = new RScriptSentence[sentencesLength];
for (int i = 0; i < sentencesLength; i++)
{ {
result.Sentences = new RScriptSentence[sentencesLength]; var sentence = new RScriptSentence();
for (int i = 0; i < sentencesLength; i++) sentence.content = reader.ReadString();
int infoLength = reader.ReadInt32();
if (infoLength > 0)
{ {
var sentence = new RScriptSentence(); sentence.info = new string[infoLength];
sentence.content = reader.ReadString(); for (int j = 0; j < infoLength; j++)
int infoLength = reader.ReadInt32();
if (infoLength > 0)
{ {
sentence.info = new string[infoLength]; sentence.info[j] = reader.ReadString();
for (int j = 0; j < infoLength; j++)
{
sentence.info[j] = reader.ReadString();
}
} }
sentence.mode = (RScriptSentence.Mode)reader.ReadInt32();
result.Sentences[i] = sentence;
} }
sentence.mode = (RScriptSentence.Mode)reader.ReadInt32();
result.Sentences[i] = sentence;
} }
// 反序列化 Labels 数组 // 反序列化 Labels 数组
int labelsLength = reader.ReadInt32(); int labelsLength = reader.ReadInt32();
if (labelsLength > 0) result.Labels = new Tuple<string, int>[labelsLength];
for (int i = 0; i < labelsLength; i++)
{ {
result.Labels = new Tuple<string, int>[labelsLength]; string item1 = reader.ReadString();
for (int i = 0; i < labelsLength; i++) int item2 = reader.ReadInt32();
{ result.Labels[i] = Tuple.Create(item1, item2);
string item1 = reader.ReadString();
int item2 = reader.ReadInt32();
result.Labels[i] = Tuple.Create(item1, item2);
}
} }
// 反序列化 NamespaceLayer 数组 // 反序列化 NamespaceLayer 数组
int namespaceLayerLength = reader.ReadInt32(); int namespaceLayerLength = reader.ReadInt32();
if (namespaceLayerLength > 0) result.NamespaceLayer = new Tuple<int, int>[namespaceLayerLength];
for (int i = 0; i < namespaceLayerLength; i++)
{ {
result.NamespaceLayer = new Tuple<int, int>[namespaceLayerLength]; int item1 = reader.ReadInt32();
for (int i = 0; i < namespaceLayerLength; i++) int item2 = reader.ReadInt32();
{ result.NamespaceLayer[i] = Tuple.Create(item1, item2);
int item1 = reader.ReadInt32();
int item2 = reader.ReadInt32();
result.NamespaceLayer[i] = Tuple.Create(item1, item2);
}
} }
// 反序列化 NamespaceLabels 数组 // 反序列化 NamespaceLabels 数组
int namespaceLabelsLength = reader.ReadInt32(); int namespaceLabelsLength = reader.ReadInt32();
if (namespaceLabelsLength > 0) result.NamespaceLabels = new Tuple<string, int>[namespaceLabelsLength];
for (int i = 0; i < namespaceLabelsLength; i++)
{ {
result.NamespaceLabels = new Tuple<string, int>[namespaceLabelsLength]; string item1 = reader.ReadString();
for (int i = 0; i < namespaceLabelsLength; i++) int item2 = reader.ReadInt32();
{ result.NamespaceLabels[i] = Tuple.Create(item1, item2);
string item1 = reader.ReadString();
int item2 = reader.ReadInt32();
result.NamespaceLabels[i] = Tuple.Create(item1, item2);
}
} }
// 反序列化 JumpPointerCache 数组 // 反序列化 JumpPointerCache 数组
int jumpPointerCacheLength = reader.ReadInt32(); int jumpPointerCacheLength = reader.ReadInt32();
if (jumpPointerCacheLength > 0) result.JumpPointerCache = new Tuple<Tuple<int, int>, Tuple<int, int>>[jumpPointerCacheLength];
for (int i = 0; i < jumpPointerCacheLength; i++)
{ {
result.JumpPointerCache = new Tuple<Tuple<int, int>, Tuple<int, int>>[jumpPointerCacheLength]; int x = reader.ReadInt32();
for(int i=0;i<jumpPointerCacheLength;i++) int y = reader.ReadInt32();
{ int z = reader.ReadInt32();
int x= reader.ReadInt32(); int w = reader.ReadInt32();
int y= reader.ReadInt32(); result.JumpPointerCache[i] = Tuple.Create(Tuple.Create(x, y), Tuple.Create(z, w));
int z= reader.ReadInt32();
int w= reader.ReadInt32();
result.JumpPointerCache[i] = Tuple.Create(Tuple.Create(x, y), Tuple.Create(z, w));
}
} }
return result; return result;