mirror of
				https://github.com/Laupetin/OpenAssetTools.git
				synced 2025-10-30 18:17:15 +00:00 
			
		
		
		
	Import code from previous AssetBuilder version
This commit is contained in:
		| @@ -0,0 +1,67 @@ | ||||
| using System; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using ZoneCodeGenerator.Interface; | ||||
| using ZoneCodeGenerator.Parsing.CommandFile.Impl; | ||||
| using ZoneCodeGenerator.Parsing.CommandFile.PostProcessor; | ||||
| using ZoneCodeGenerator.Parsing.Impl; | ||||
| using ZoneCodeGenerator.Persistence; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile | ||||
| { | ||||
|     static class CommandFileReader | ||||
|     { | ||||
|         private static readonly IDataPostProcessor[] postProcessors = | ||||
|         { | ||||
|             new PostProcessorDefaultBlock(), | ||||
|         }; | ||||
|  | ||||
|         public static bool ReadFile(string path, CUISession session) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 using (IIncludingParsingStream streamFileSystem = new IncludingStreamFileSystem(path)) | ||||
|                 { | ||||
|                     var state = new CommandParserState(session.Repository); | ||||
|  | ||||
|                     using (IParsingFileStream preprocessorStream = new CommandFilePreprocessor(streamFileSystem)) | ||||
|                     { | ||||
|                         var lexer = new Lexer(preprocessorStream); | ||||
|                         var parser = new Parser<ICommandParserState>(state, lexer); | ||||
|  | ||||
|                         if (!parser.Parse()) | ||||
|                             return false; | ||||
|  | ||||
|                         preprocessorStream.Close(); | ||||
|                         streamFileSystem.Close(); | ||||
|  | ||||
|                         if (!state.Apply(session)) | ||||
|                         { | ||||
|                             Console.WriteLine("Finalizing from command file failed"); | ||||
|                             return false; | ||||
|                         } | ||||
|  | ||||
|                         if (!PostProcessRepository(session.Repository)) | ||||
|                         { | ||||
|                             Console.WriteLine("Postprocessing commands failed."); | ||||
|                             return false; | ||||
|                         } | ||||
|                     } | ||||
|                      | ||||
|                     return true; | ||||
|                 } | ||||
|             } | ||||
|             catch (IOException) | ||||
|             { | ||||
|  | ||||
|             } | ||||
|  | ||||
|             return false; | ||||
|         } | ||||
|          | ||||
|         private static bool PostProcessRepository(IDataRepository repository) | ||||
|         { | ||||
|             return postProcessors.All(postProcessor => postProcessor.PostProcess(repository)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,15 @@ | ||||
| using System.Collections.Generic; | ||||
| using ZoneCodeGenerator.Domain; | ||||
| using ZoneCodeGenerator.Domain.FastFileStructure; | ||||
| using ZoneCodeGenerator.Persistence; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile | ||||
| { | ||||
|     interface ICommandParserState : IParserState<ICommandParserState> | ||||
|     { | ||||
|         string Game { get; set; } | ||||
|         IReadOnlyDataRepository Repository { get; } | ||||
|         List<FastFileBlock> FastFileBlocks { get; } | ||||
|         DataTypeWithMembers DataTypeInUse { get; set; } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,56 @@ | ||||
| using System.Text.RegularExpressions; | ||||
| using ZoneCodeGenerator.Parsing.Impl; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Impl | ||||
| { | ||||
|     class CommandFilePreprocessor : IParsingFileStream | ||||
|     { | ||||
|         private static readonly Regex includeRegex = new Regex(@"^\s*include\s*(?:\""(.*)\""|\<(.*)\>)\s*$"); | ||||
|  | ||||
|         private readonly IIncludingParsingStream parsingStream; | ||||
|         private readonly ICommentProcessor commentProcessor; | ||||
|  | ||||
|         public CommandFilePreprocessor(IIncludingParsingStream parsingStream) | ||||
|         { | ||||
|             this.parsingStream = parsingStream; | ||||
|             commentProcessor = new CommentProcessor(); | ||||
|         } | ||||
|  | ||||
|         public void Dispose() | ||||
|         { | ||||
|             parsingStream.Close(); | ||||
|         } | ||||
|  | ||||
|         public bool EndOfStream => parsingStream.EndOfStream; | ||||
|         public string Filename => parsingStream.Filename; | ||||
|         public int Line => parsingStream.Line; | ||||
|  | ||||
|         public string ReadLine() | ||||
|         { | ||||
|             return Preprocess(parsingStream.ReadLine()); | ||||
|         } | ||||
|  | ||||
|         public void Close() | ||||
|         { | ||||
|             parsingStream.Close(); | ||||
|         } | ||||
|  | ||||
|         private string Preprocess(string line) | ||||
|         { | ||||
|             line = commentProcessor.RemoveComments(line); | ||||
|  | ||||
|             var includeMatch = includeRegex.Match(line); | ||||
|  | ||||
|             if (includeMatch.Success) | ||||
|             { | ||||
|                 var filename = includeMatch.Groups[1].Success ? includeMatch.Groups[1].Value : includeMatch.Groups[2].Value; | ||||
|  | ||||
|                 parsingStream.IncludeFile(filename); | ||||
|  | ||||
|                 return ""; | ||||
|             } | ||||
|  | ||||
|             return line; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,53 @@ | ||||
| using System.Collections.Generic; | ||||
| using ZoneCodeGenerator.Domain; | ||||
| using ZoneCodeGenerator.Domain.FastFileStructure; | ||||
| using ZoneCodeGenerator.Interface; | ||||
| using ZoneCodeGenerator.Parsing.CommandFile.Tests; | ||||
| using ZoneCodeGenerator.Parsing.Testing; | ||||
| using ZoneCodeGenerator.Persistence; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Impl | ||||
| { | ||||
|     class CommandParserState : ICommandParserState | ||||
|     { | ||||
|         private static readonly ITokenTest<ICommandParserState>[] tests = { | ||||
|             new TestAsset(), | ||||
|             new TestBlock(), | ||||
|             new TestCondition(), | ||||
|             new TestCount(), | ||||
|             new TestGame(), | ||||
|             new TestReorder(), | ||||
|             new TestScriptString(), | ||||
|             new TestUse() | ||||
|         }; | ||||
|  | ||||
|         public string Game { get; set; } | ||||
|         public IReadOnlyDataRepository Repository { get; } | ||||
|         public List<FastFileBlock> FastFileBlocks { get; } | ||||
|         public DataTypeWithMembers DataTypeInUse { get; set; } | ||||
|  | ||||
|         public CommandParserState(IReadOnlyDataRepository repository) | ||||
|         { | ||||
|             Repository = repository; | ||||
|             FastFileBlocks = new List<FastFileBlock>(); | ||||
|             DataTypeInUse = null; | ||||
|         } | ||||
|  | ||||
|         public IEnumerable<ITokenTest<ICommandParserState>> GetTests() | ||||
|         { | ||||
|             return tests; | ||||
|         } | ||||
|  | ||||
|         public bool Apply(CUISession session) | ||||
|         { | ||||
|             session.Game = Game; | ||||
|  | ||||
|             foreach (var block in FastFileBlocks) | ||||
|             { | ||||
|                 session.Repository.Add(block); | ||||
|             } | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,33 @@ | ||||
| using System.Linq; | ||||
| using ZoneCodeGenerator.Domain; | ||||
| using ZoneCodeGenerator.Domain.FastFileStructure; | ||||
| using ZoneCodeGenerator.Persistence; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.PostProcessor | ||||
| { | ||||
|     class PostProcessorDefaultBlock : IDataPostProcessor | ||||
|     { | ||||
|         public bool PostProcess(IDataRepository repository) | ||||
|         { | ||||
|             var memberDataTypes =  | ||||
|                 repository.GetAllStructs() | ||||
|                 .AsEnumerable<DataTypeWithMembers>() | ||||
|                 .Concat(repository.GetAllUnions()); | ||||
|  | ||||
|             var defaultTemp = repository.GetAllFastFileBlocks().First(block => block.BlockType == FastFileBlock.Type.Temp && block.IsDefault) ?? | ||||
|                               repository.GetAllFastFileBlocks().First(block => block.BlockType == FastFileBlock.Type.Temp); | ||||
|  | ||||
|             var defaultNormal = repository.GetAllFastFileBlocks().First(block => block.BlockType == FastFileBlock.Type.Normal && block.IsDefault) ?? | ||||
|                               repository.GetAllFastFileBlocks().First(block => block.BlockType == FastFileBlock.Type.Normal); | ||||
|  | ||||
|             foreach (var memberType in memberDataTypes) | ||||
|             { | ||||
|                 var info = repository.GetInformationFor(memberType); | ||||
|  | ||||
|                 info.Block = info.IsAsset ? defaultTemp : defaultNormal; | ||||
|             } | ||||
|  | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										59
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestAsset.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestAsset.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using ZoneCodeGenerator.Domain; | ||||
| using ZoneCodeGenerator.Parsing.Matching; | ||||
| using ZoneCodeGenerator.Parsing.Matching.Matchers; | ||||
| using ZoneCodeGenerator.Parsing.Testing; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Tests | ||||
| { | ||||
|     class TestAsset : AbstractTokenTest<ICommandParserState> | ||||
|     { | ||||
|         private const string AssetTypeNameToken = "name"; | ||||
|         private const string AssetEnumEntryToken = "enumEntry"; | ||||
|  | ||||
|         private static readonly TokenMatcher[] matchers = { | ||||
|             new MatcherLiteral("asset"), | ||||
|             new MatcherTypename().WithName(AssetTypeNameToken), | ||||
|             new MatcherName().WithName(AssetEnumEntryToken),  | ||||
|             new MatcherLiteral(";") | ||||
|         }; | ||||
|  | ||||
|         public TestAsset() : base(matchers) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         protected override void ProcessMatch(ICommandParserState state) | ||||
|         { | ||||
|             var assetTypeName = GetMatcherTokens(AssetTypeNameToken)[0]; | ||||
|  | ||||
|             var assetType = state.Repository.GetDataTypeByName(assetTypeName); | ||||
|             if (assetType == null) | ||||
|             { | ||||
|                 throw new LoadingException($"Could not find type '{assetTypeName}' to mark it as an asset."); | ||||
|             } | ||||
|              | ||||
|             if (!(assetType is DataTypeWithMembers assetTypeWithMembers)) | ||||
|             { | ||||
|                 throw new LoadingException($"Type of asset '{assetTypeName}' needs to be struct or union."); | ||||
|             } | ||||
|  | ||||
|             var assetInfo = state.Repository.GetInformationFor(assetTypeWithMembers); | ||||
|             if (assetType == null) | ||||
|             { | ||||
|                 throw new LoadingException($"Could not find information for type '{assetTypeName}' to mark it as an asset."); | ||||
|             } | ||||
|  | ||||
|             var enumEntryName = GetMatcherTokens(AssetEnumEntryToken)[0]; | ||||
|             var enumEntry = state.Repository.GetAllEnums() | ||||
|                 .SelectMany(_enum => _enum.Members) | ||||
|                 .FirstOrDefault(member => member.Name.Equals(enumEntryName, StringComparison.CurrentCultureIgnoreCase)); | ||||
|  | ||||
|             assetInfo.AssetEnumEntry = enumEntry ?? throw new LoadingException( | ||||
|                     $"Could not find enum entry '{enumEntryName}' as an asset type index for asset type '{assetTypeName}'."); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										52
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestBlock.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestBlock.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| using System; | ||||
| using System.Linq; | ||||
| using ZoneCodeGenerator.Domain.FastFileStructure; | ||||
| using ZoneCodeGenerator.Parsing.Matching; | ||||
| using ZoneCodeGenerator.Parsing.Matching.Matchers; | ||||
| using ZoneCodeGenerator.Parsing.Testing; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Tests | ||||
| { | ||||
|     class TestBlock : AbstractTokenTest<ICommandParserState> | ||||
|     { | ||||
|         private const string BlockNumberToken = "num"; | ||||
|         private const string BlockTypeToken = "type"; | ||||
|         private const string BlockNameToken = "name"; | ||||
|         private const string DefaultToken = "default"; | ||||
|  | ||||
|         private static readonly TokenMatcher[] matchers = { | ||||
|             new MatcherLiteral("block"),  | ||||
|             new MatcherNumber().WithName(BlockNumberToken), | ||||
|             new MatcherName().WithName(BlockTypeToken), | ||||
|             new MatcherName().WithName(BlockNameToken), | ||||
|             new MatcherGroupLoop(MatcherGroupLoop.LoopMode.ZeroOneMultiple,new MatcherGroupOr( | ||||
|                 new MatcherLiteral("default").WithName(DefaultToken) | ||||
|             )),  | ||||
|             new MatcherLiteral(";") | ||||
|         }; | ||||
|  | ||||
|         public TestBlock() : base(matchers) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         protected override void ProcessMatch(ICommandParserState state) | ||||
|         { | ||||
|             var blockName = GetMatcherTokens(BlockNameToken)[0]; | ||||
|             var blockNumber = int.Parse(GetMatcherTokens(BlockNumberToken)[0]); | ||||
|  | ||||
|             var blockTypeInput = GetMatcherTokens(BlockTypeToken)[0]; | ||||
|             if (!Enum.TryParse(blockTypeInput, true, out FastFileBlock.Type blockType)) | ||||
|             { | ||||
|                 var blockTypeValues = Enum.GetValues(typeof(FastFileBlock.Type)).OfType<FastFileBlock.Type>() | ||||
|                     .Select(type => type.ToString()); | ||||
|                  | ||||
|                 throw new TestFailedException($"Unknown fastfile block type '{blockTypeInput}'. Must be one of the following: {string.Join(", ", blockTypeValues)}"); | ||||
|             } | ||||
|  | ||||
|             var block = new FastFileBlock(blockName, blockNumber, blockType, HasMatcherTokens(DefaultToken)); | ||||
|  | ||||
|             state.FastFileBlocks.Add(block); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,93 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| using ZoneCodeGenerator.Parsing.Matching; | ||||
| using ZoneCodeGenerator.Parsing.Matching.Matchers; | ||||
| using ZoneCodeGenerator.Parsing.Testing; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Tests | ||||
| { | ||||
|     class TestCondition : AbstractTokenTest<ICommandParserState> | ||||
|     { | ||||
|         private const string TypeNameToken = "typeName"; | ||||
|         private const string ConditionStatementTag = "conditionStatement"; | ||||
|         private const string ConditionChainTag = "conditionChain"; | ||||
|         private const string ConditionChainLinkTag = "conditionChainLink"; | ||||
|         private const string OperationTag = "operation"; | ||||
|         private const string OperandTag = "operand"; | ||||
|  | ||||
|         private static readonly TokenMatcher operand = new MatcherGroupOr( | ||||
|                 new MatcherGroupAnd( | ||||
|                     new MatcherTypename(), | ||||
|                     new MatcherGroupLoop(MatcherGroupLoop.LoopMode.ZeroOneMultiple, new MatcherArray()) | ||||
|                     ), | ||||
|                 new MatcherNumber(), | ||||
|                 new MatcherLiteral("true"), | ||||
|                 new MatcherLiteral("false") | ||||
|             ).WithTag(OperandTag); | ||||
|  | ||||
|         private static readonly TokenMatcher operation = new MatcherGroupOr( | ||||
|                 new MatcherLiteral("+"), | ||||
|                 new MatcherLiteral("-"), | ||||
|                 new MatcherLiteral("*"), | ||||
|                 new MatcherLiteral("/"), | ||||
|                 new MatcherGroupAnd(new MatcherLiteral("<"), new MatcherLiteral("<")), | ||||
|                 new MatcherGroupAnd(new MatcherLiteral(">"), new MatcherLiteral(">")) | ||||
|             ).WithTag(OperationTag); | ||||
|  | ||||
|         private static readonly TokenMatcher conditionStatement = new MatcherGroupOr( | ||||
|             new MatcherGroupAnd( | ||||
|                 new MatcherLiteral("("), | ||||
|                 new MatcherWithTag(ConditionStatementTag), | ||||
|                 new MatcherLiteral(")") | ||||
|                 ), | ||||
|             new MatcherGroupAnd( | ||||
|                 new MatcherWithTag(OperandTag), | ||||
|                 new MatcherGroupOptional(new MatcherGroupAnd( | ||||
|                     new MatcherWithTag(OperationTag), | ||||
|                     new MatcherWithTag(OperandTag) | ||||
|                     )) | ||||
|                 ) | ||||
|             ).WithTag(ConditionStatementTag); | ||||
|  | ||||
|         private static readonly TokenMatcher conditionChainLink = new MatcherGroupOr( | ||||
|                 new MatcherGroupAnd(new MatcherLiteral("="), new MatcherLiteral("=")), | ||||
|                 new MatcherGroupAnd(new MatcherLiteral("!"), new MatcherLiteral("=")), | ||||
|                 new MatcherGroupAnd(new MatcherLiteral("<"), new MatcherLiteral("=")), | ||||
|                 new MatcherGroupAnd(new MatcherLiteral(">"), new MatcherLiteral("=")), | ||||
|                 new MatcherLiteral("<"), | ||||
|                 new MatcherLiteral(">") | ||||
|             ).WithTag(ConditionChainLinkTag); | ||||
|  | ||||
|         private static readonly TokenMatcher conditionChain = new MatcherGroupAnd( | ||||
|             new MatcherWithTag(ConditionStatementTag), | ||||
|                 new MatcherWithTag(ConditionChainLinkTag), | ||||
|                 new MatcherWithTag(ConditionStatementTag) | ||||
|             ).WithTag(ConditionChainTag); | ||||
|  | ||||
|         private static readonly TokenMatcher[] matchers = { | ||||
|             new MatcherLiteral("set"), | ||||
|             new MatcherLiteral("condition"), | ||||
|             new MatcherTypename().WithName(TypeNameToken), | ||||
|             new MatcherGroupOr( | ||||
|                 new MatcherLiteral("never"), | ||||
|                 new MatcherWithTag(ConditionChainTag) | ||||
|                 ), | ||||
|             new MatcherLiteral(";") | ||||
|         }; | ||||
|  | ||||
|         public TestCondition() : base(matchers) | ||||
|         { | ||||
|             AddTaggedMatcher(conditionChain); | ||||
|             AddTaggedMatcher(conditionChainLink); | ||||
|             AddTaggedMatcher(conditionStatement); | ||||
|             AddTaggedMatcher(operation); | ||||
|             AddTaggedMatcher(operand); | ||||
|         } | ||||
|  | ||||
|         protected override void ProcessMatch(ICommandParserState state) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										87
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestCount.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestCount.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using ZoneCodeGenerator.Parsing.Matching; | ||||
| using ZoneCodeGenerator.Parsing.Matching.Matchers; | ||||
| using ZoneCodeGenerator.Parsing.Testing; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Tests | ||||
| { | ||||
|     class TestCount : AbstractTokenTest<ICommandParserState> | ||||
|     { | ||||
|         private const string TypeNameToken = "typeName"; | ||||
|         private const string ConditionStatementTag = "conditionStatement"; | ||||
|         private const string ConditionChainTag = "conditionChain"; | ||||
|         private const string ConditionChainLinkTag = "conditionChainLink"; | ||||
|         private const string OperationTag = "operation"; | ||||
|         private const string OperandTag = "operand"; | ||||
|  | ||||
|         private static readonly TokenMatcher operand = new MatcherGroupOr( | ||||
|             new MatcherGroupAnd( | ||||
|                 new MatcherTypename(), | ||||
|                 new MatcherGroupLoop(MatcherGroupLoop.LoopMode.ZeroOneMultiple, new MatcherArray()) | ||||
|                 ), | ||||
|             new MatcherNumber() | ||||
|             ).WithTag(OperandTag); | ||||
|  | ||||
|         private static readonly TokenMatcher operation = new MatcherGroupOr( | ||||
|             new MatcherLiteral("+"), | ||||
|             new MatcherLiteral("-"), | ||||
|             new MatcherLiteral("*"), | ||||
|             new MatcherLiteral("/"), | ||||
|             new MatcherGroupAnd(new MatcherLiteral("<"), new MatcherLiteral("<")), | ||||
|             new MatcherGroupAnd(new MatcherLiteral(">"), new MatcherLiteral(">")) | ||||
|             ).WithTag(OperationTag); | ||||
|  | ||||
|         private static readonly TokenMatcher conditionStatement = new MatcherGroupOr( | ||||
|             new MatcherGroupAnd( | ||||
|                 new MatcherLiteral("("), | ||||
|                 new MatcherWithTag(ConditionStatementTag), | ||||
|                 new MatcherLiteral(")") | ||||
|                 ), | ||||
|             new MatcherGroupAnd( | ||||
|                 new MatcherWithTag(OperandTag), | ||||
|                 new MatcherGroupOptional(new MatcherGroupAnd( | ||||
|                     new MatcherWithTag(OperationTag), | ||||
|                     new MatcherWithTag(OperandTag) | ||||
|                     )) | ||||
|                 ) | ||||
|             ).WithTag(ConditionStatementTag); | ||||
|  | ||||
|         private static readonly TokenMatcher conditionChainLink = new MatcherGroupOr( | ||||
|             new MatcherGroupAnd(new MatcherLiteral("|"), new MatcherLiteral("|")), | ||||
|             new MatcherGroupAnd(new MatcherLiteral("&"), new MatcherLiteral("&")) | ||||
|             ).WithTag(ConditionChainLinkTag); | ||||
|  | ||||
|         private static readonly TokenMatcher conditionChain = new MatcherGroupAnd( | ||||
|             new MatcherWithTag(ConditionStatementTag), | ||||
|             new MatcherGroupLoop(MatcherGroupLoop.LoopMode.ZeroOneMultiple, new MatcherGroupAnd( | ||||
|                 new MatcherWithTag(ConditionChainLinkTag), | ||||
|                 new MatcherWithTag(ConditionStatementTag) | ||||
|                 )) | ||||
|             ).WithTag(ConditionChainTag); | ||||
|  | ||||
|         private static readonly TokenMatcher[] matchers = { | ||||
|             new MatcherLiteral("set"), | ||||
|             new MatcherLiteral("count"), | ||||
|             new MatcherTypename().WithName(TypeNameToken), | ||||
|             new MatcherWithTag(ConditionChainTag), | ||||
|             new MatcherLiteral(";") | ||||
|         }; | ||||
|  | ||||
|         public TestCount() : base(matchers) | ||||
|         { | ||||
|             AddTaggedMatcher(conditionStatement); | ||||
|             AddTaggedMatcher(conditionChain); | ||||
|             AddTaggedMatcher(conditionChainLink); | ||||
|             AddTaggedMatcher(operation); | ||||
|             AddTaggedMatcher(operand); | ||||
|         } | ||||
|  | ||||
|         protected override void ProcessMatch(ICommandParserState state) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										37
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestGame.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestGame.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using ZoneCodeGenerator.Domain.FastFileStructure; | ||||
| using ZoneCodeGenerator.Parsing.Matching; | ||||
| using ZoneCodeGenerator.Parsing.Matching.Matchers; | ||||
| using ZoneCodeGenerator.Parsing.Testing; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Tests | ||||
| { | ||||
|     class TestGame : AbstractTokenTest<ICommandParserState> | ||||
|     { | ||||
|         private const string GameNameToken = "name"; | ||||
|  | ||||
|         private static readonly TokenMatcher[] matchers = { | ||||
|             new MatcherLiteral("game"),  | ||||
|             new MatcherName().WithName(GameNameToken), | ||||
|             new MatcherLiteral(";") | ||||
|         }; | ||||
|  | ||||
|         public TestGame() : base(matchers) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         protected override void ProcessMatch(ICommandParserState state) | ||||
|         { | ||||
|             if (!string.IsNullOrEmpty(state.Game)) | ||||
|             { | ||||
|                 throw new TestFailedException($"Game has already been set with value '{state.Game}'"); | ||||
|             } | ||||
|  | ||||
|             state.Game = GetMatcherTokens(GameNameToken)[0]; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,33 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Text; | ||||
| using ZoneCodeGenerator.Parsing.Matching; | ||||
| using ZoneCodeGenerator.Parsing.Matching.Matchers; | ||||
| using ZoneCodeGenerator.Parsing.Testing; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Tests | ||||
| { | ||||
|     class TestReorder : AbstractTokenTest<ICommandParserState> | ||||
|     { | ||||
|         private const string TypeNameToken = "typeName"; | ||||
|         private const string ReorderMemberNameToken = "member"; | ||||
|  | ||||
|         private static readonly TokenMatcher[] matchers = { | ||||
|             new MatcherLiteral("reorder"), | ||||
|             new MatcherGroupOptional(new MatcherTypename().WithName(TypeNameToken)),  | ||||
|             new MatcherLiteral(":"), | ||||
|             new MatcherGroupLoop(MatcherGroupLoop.LoopMode.OneMultiple, new MatcherName().WithName(ReorderMemberNameToken)), | ||||
|             new MatcherLiteral(";") | ||||
|         }; | ||||
|  | ||||
|         public TestReorder() : base(matchers) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         protected override void ProcessMatch(ICommandParserState state) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,33 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Text; | ||||
| using ZoneCodeGenerator.Domain; | ||||
| using ZoneCodeGenerator.Parsing.Matching; | ||||
| using ZoneCodeGenerator.Parsing.Matching.Matchers; | ||||
| using ZoneCodeGenerator.Parsing.Testing; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Tests | ||||
| { | ||||
|     class TestScriptString : AbstractTokenTest<ICommandParserState> | ||||
|     { | ||||
|         private const string MemberTypeNameToken = "name"; | ||||
|  | ||||
|         private static readonly TokenMatcher[] matchers = { | ||||
|             new MatcherLiteral("set"), | ||||
|             new MatcherLiteral("scriptstring"), | ||||
|             new MatcherTypename().WithName(MemberTypeNameToken), | ||||
|             new MatcherLiteral(";") | ||||
|         }; | ||||
|  | ||||
|         public TestScriptString() : base(matchers) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         protected override void ProcessMatch(ICommandParserState state) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										41
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestUse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestUse.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| using ZoneCodeGenerator.Domain; | ||||
| using ZoneCodeGenerator.Parsing.Matching; | ||||
| using ZoneCodeGenerator.Parsing.Matching.Matchers; | ||||
| using ZoneCodeGenerator.Parsing.Testing; | ||||
|  | ||||
| namespace ZoneCodeGenerator.Parsing.CommandFile.Tests | ||||
| { | ||||
|     class TestUse : AbstractTokenTest<ICommandParserState> | ||||
|     { | ||||
|         private const string TypeNameToken = "typeName"; | ||||
|  | ||||
|         private static readonly TokenMatcher[] matchers = { | ||||
|             new MatcherLiteral("use"), | ||||
|             new MatcherTypename().WithName(TypeNameToken), | ||||
|             new MatcherLiteral(";") | ||||
|         }; | ||||
|  | ||||
|         public TestUse() : base(matchers) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         protected override void ProcessMatch(ICommandParserState state) | ||||
|         { | ||||
|             var typeName = GetMatcherTokens(TypeNameToken)[0]; | ||||
|             var dataTypeToUse = state.Repository.GetDataTypeByName(typeName); | ||||
|  | ||||
|             if (dataTypeToUse == null) | ||||
|             { | ||||
|                 throw new LoadingException($"Could not find data type '{typeName}'"); | ||||
|             } | ||||
|  | ||||
|             if (!(dataTypeToUse is DataTypeWithMembers dataTypeWithMembersToUse)) | ||||
|             { | ||||
|                 throw new LoadingException($"To use data type '{typeName}' it must either be a struct or a union."); | ||||
|             } | ||||
|  | ||||
|             state.DataTypeInUse = dataTypeWithMembersToUse; | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user