rj-action-library/Runtime/Godot/Scenes/Parsers/SceneFileLexer.cs

129 lines
3.3 KiB
C#

using Godot;
using System.Collections.Generic;
namespace Rokojori
{
public class SceneFileLexer:Lexer
{
public SceneFileLexer()
{
AddAllMatchers(
LexerMatcherLibrary.DoubleQuotedStringMatcher,
LexerMatcherLibrary.NumberMatcher,
LexerMatcherLibrary.NullMatcher,
LexerMatcherLibrary.BoolMatcher,
LexerMatcherLibrary.BreakMatcher,
LexerMatcherLibrary.WhiteSpaceMatcher,
LexerMatcherLibrary.BracketMatcher,
LexerMatcherLibrary.OperatorMatcher,
LexerMatcherLibrary.CFunctionMatcher,
LexerMatcherLibrary.CwordMatcher,
LexerMatcherLibrary.AnySymbolMatcher
);
}
public class SceneFileAssignmentResult
{
public bool hasError = true;
public string errorMessage = "";
public string name;
public string value;
public SceneFileNamedValue GetNamedValue()
{
return SceneFileNamedValue.Create( name, value );
}
public int startOffset;
public int endOffset;
public static SceneFileAssignmentResult Create( int startOffset )
{
var r = new SceneFileAssignmentResult();
r.startOffset = startOffset;
return r;
}
public SceneFileAssignmentResult AsError( int offset, LexerEvent le, string message )
{
hasError = true;
endOffset = offset;
errorMessage = message + " Token: " + le.type + "'" + le.match + "'" ;
return this;
}
public SceneFileAssignmentResult AsValue( int offset, LexerEvent le )
{
hasError = false;
endOffset = offset;
value = le.match;
return this;
}
public SceneFileAssignmentResult AsValue( int offset, string value )
{
hasError = false;
endOffset = offset;
this.value = value;
return this;
}
}
public static SceneFileAssignmentResult ReadAssignment( List<LexerEvent> tokens, int offset )
{
var result = SceneFileAssignmentResult.Create( offset );
var token = tokens[ offset ];
if ( ! token.Is( LexerMatcherLibrary.CwordMatcher ) )
{
return result.AsError( offset, token, "Expected a word as name." ) ;
}
result.name = token.match;
offset ++; token = tokens[ offset ];
if ( ! token.Is( LexerMatcherLibrary.OperatorMatcher, "=" ) )
{
return result.AsError( offset, token, "Expected assignment operator." ) ;
}
offset ++; token = tokens[ offset ];
if ( token.Is( LexerMatcherLibrary.NumberMatcher ) ||
token.Is( LexerMatcherLibrary.DoubleQuotedStringMatcher )
)
{
return result.AsValue( offset, token );
}
else if ( token.Is( LexerMatcherLibrary.CFunctionMatcher ) )
{
var start = offset + 1;
var closer = LexerEvent.FindClosingBracket( tokens, offset + 1 );
if ( closer.type != LexerEvent.FindResultType.Found )
{
return result.AsError( offset, token, "Unmatched brackets.");
}
var length = ( closer.index - start ) + 1;
var value = LexerEvent.GetMatchFromRange( tokens, start, length );
return result.AsValue( closer.index, value );
}
else
{
return result.AsError( offset, token, "Unexpected token.");
}
}
}
}