147 lines
3.6 KiB
C#
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;
|
|
}
|
|
}
|
|
|
|
} |