daily update on 20250214 by nitload youmu, building syntax analysor, tough!

This commit is contained in:
Nitload
2025-02-14 13:30:17 +08:00
parent c23b640cae
commit ccef0de6f6
68 changed files with 2594 additions and 913 deletions
@@ -37,45 +37,61 @@ namespace StgSharp.Script.Express
public class ExpSwitchToken : ExpToken
{
private Dictionary<ExpToken, List<ExpToken>> _cases;
private Dictionary<ExpToken, ExpToken> _cases;
private ExpToken _default;
private ExpToken _target;
private List<ExpToken> _default;
public ExpSwitchToken(
string name,
ExpSchema context,
ExpToken target,
IEnumerable<ExpToken> @default,
params (ExpToken label, IEnumerable<ExpToken> op)[] cases )
ExpToken defaultCase,
params (ExpToken label, ExpToken op)[] cases )
: base( name, context )
{
_target = target;
if( @default == null ) {
_default = new List<ExpToken>();
} else {
_default = new List<ExpToken>( @default );
}
_cases = new Dictionary<ExpToken, List<ExpToken>>();
foreach( (ExpToken label, IEnumerable<ExpToken> op) item in cases ) {
_default = defaultCase;
_cases = new Dictionary<ExpToken, ExpToken>();
foreach( (ExpToken label, ExpToken op ) item in cases ) {
if( item.op == null ) {
_cases.Add( item.label, new List<ExpToken>() );
_cases.Add( item.label, null! );
} else {
_cases.Add( item.label, new List<ExpToken>( item.op ) );
_cases.Add( item.label, item.op );
}
}
}
public List<ExpToken> this[ ExpToken index ]
public ExpToken this[ ExpToken index ]
{
get
{
if( _cases.TryGetValue( index, out List<ExpToken>? ret ) ) {
if( _cases.TryGetValue( index, out ExpToken? ret ) ) {
return ret;
}
return _default;
}
}
public override ExpToken Left => throw new NotImplementedException();
public override ExpToken Next
{
get => throw new NotImplementedException();
set => throw new NotImplementedException();
}
public override ExpToken Right => throw new NotImplementedException();
public override IExpElementSource EqualityTypeConvert => throw new NotImplementedException(
);
public void AddOperationToDefault( ExpToken expressionRoot )
{
if( expressionRoot != null ) {
_default.AppendToken( expressionRoot );
}
}
/// <summary>
/// Adds an expression to certain <see langword="case" />. The added expression will be run
/// at last.
@@ -83,25 +99,18 @@ namespace StgSharp.Script.Express
/// <param name="label"> Label of case to add operation </param>
/// <param name="expressionRoot"> Root token of the expression to be added. </param>
/// <exception cref="ExpCaseNotFoundException"> Cannot fine the case label in current witch expression. </exception>
public void AddOperationToCase(
public void AppendOperationToCase(
ExpToken label,
ExpToken expressionRoot )
{
AssertSchemaInclude( expressionRoot );
if( _cases.TryGetValue( label, out List<ExpToken>? op ) ) {
op.Add( expressionRoot );
if( _cases.TryGetValue( label, out ExpToken? op ) ) {
op.AppendToken( expressionRoot );
} else {
throw new ExpCaseNotFoundException( this, label );
}
}
public void AddOperationToDefault( ExpToken expressionRoot )
{
if( expressionRoot != null ) {
_default.Add( expressionRoot );
}
}
public bool ContainsCase( ExpToken token )
{
return _cases.ContainsKey( token );