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

147 lines
3.6 KiB
C#

using Godot;
using System.Collections.Generic;
namespace Rokojori
{
public class SceneFileHeaderParser
{
public bool hasError = true;
public string errorMessage;
string line;
public void Parse( SceneFileEntry entry )
{
line = entry.line.Substring( 1, entry.line.Length - 2 );
var lexer = new SceneFileLexer();
var tokens = lexer.LexToList( line );
if ( lexer.hasError || tokens.Count == 0)
{
errorMessage = "Lexing failed";
return;
}
lexer.GrabMatches( tokens, line );
/*var info = "";
tokens.ForEach(
( tk )=>
{
info += tk.type + " " + tk.match + "\n";
}
);*/
var offset = 0;
var token = tokens[ 0 ];
if ( ! token.Is( LexerMatcherLibrary.CwordMatcher ) )
{
errorMessage = "First token is not a word: "+ token.type + " '" + token.match + "'";
return;
}
var header = new SceneFileHeader();
entry.header = header;
header.type = tokens[ 0 ].match;
offset = 1; token = tokens[ offset ];
while ( offset < tokens.Count && token != null )
{
if ( ! token.Is( LexerMatcherLibrary.WhiteSpaceMatcher ) )
{
errorMessage = "Expected white space, but got: " + token.type + " '" + token.match + "'";
return;
}
offset ++; token = tokens[ offset ];
var assignmentResult = SceneFileLexer.ReadAssignment( tokens, offset );
if ( assignmentResult.hasError )
{
errorMessage = assignmentResult.errorMessage;
return;
}
header.attributes.Add( assignmentResult.GetNamedValue() );
offset = assignmentResult.endOffset;
token = tokens[ offset ];
/*if ( ! token.Is( LexerMatcherLibrary.CwordMatcher ) )
{
errorMessage = "Expected word for attribute name, but got: " + token.type + " '" + token.match + "'";
return;
}
var attribute = new SceneFileNamedValue();
attribute.name = token.match;
offset ++; token = tokens[ offset ];
if ( ! token.Is( LexerMatcherLibrary.OperatorMatcher, "=" ) )
{
errorMessage = "Expected assignment operator, but got:" + token.type + " '" + token.match + "'";
return;
}
offset ++; token = tokens[ offset ];
if ( token.Is( LexerMatcherLibrary.NumberMatcher ) )
{
attribute.value = token.match;
header.attributes.Add( attribute );
}
else if ( token.Is( LexerMatcherLibrary.DoubleQuotedStringMatcher ) )
{
attribute.value = token.match;
header.attributes.Add( attribute );
}
else if ( token.Is( LexerMatcherLibrary.CFunctionMatcher ) )
{
var closer = LexerEvent.FindClosingBracket( tokens, offset + 1 );
if ( closer.type != LexerEvent.FindResultType.Found )
{
errorMessage = "Function with unmatched brackets: " + token.type + " '" + token.match + "'";
return;
}
for ( int i = offset; i <= closer.index; i++ )
{
attribute.value += tokens[ i ].match;
}
offset = closer.index + 1;
}
else
{
errorMessage = "Unexpected token:" + token.type + " '" + token.match + "'";
return;
}
*/
offset ++;
token = ( offset < tokens.Count - 1 ) ? tokens[ offset ] : null ;
}
//RJLog.Log( info );
hasError = false;
}
}
}