diff --git a/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestCondition.cs b/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestCondition.cs index 9da49f0b..ad23a06a 100644 --- a/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestCondition.cs +++ b/src/ZoneCodeGenerator/Parsing/CommandFile/Tests/TestCondition.cs @@ -11,83 +11,109 @@ namespace ZoneCodeGenerator.Parsing.CommandFile.Tests { private const string TypeNameToken = "typeName"; private const string ConditionStatementTag = "conditionStatement"; - private const string ConditionChainTag = "conditionChain"; - private const string ConditionChainLinkTag = "conditionChainLink"; + private const string ConditionTag = "condition"; + private const string ConditionRelationTag = "conditionRelation"; private const string OperationTag = "operation"; private const string OperandTag = "operand"; + private const string ConditionChainLinkTag = "conditionChainLink"; + private const string ConditionChainTag = "conditionChain"; + // operand ::= + | | true | false 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); + new MatcherGroupAnd( + new MatcherTypename(), + new MatcherGroupLoop(MatcherGroupLoop.LoopMode.ZeroOneMultiple, new MatcherArray()) + ), + new MatcherNumber(), + new MatcherLiteral("true"), + new MatcherLiteral("false") + ).WithTag(OperandTag); + // operation ::= + | - | * | / | << | >> 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); + new MatcherLiteral("+"), + new MatcherLiteral("-"), + new MatcherLiteral("*"), + new MatcherLiteral("/"), + new MatcherGroupAnd(new MatcherLiteral("<"), new MatcherLiteral("<")), + new MatcherGroupAnd(new MatcherLiteral(">"), new MatcherLiteral(">")) + ).WithTag(OperationTag); + // conditionStatement ::= ( ) | [ ] 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); + )) + ) + ).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); + // conditionChainLink ::= == | != | <= | >= | < | > + private static readonly TokenMatcher conditionRelation = 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(ConditionRelationTag); - private static readonly TokenMatcher conditionChain = new MatcherGroupAnd( + // condition ::= + private static readonly TokenMatcher condition = new MatcherGroupAnd( new MatcherWithTag(ConditionStatementTag), - new MatcherWithTag(ConditionChainLinkTag), - new MatcherWithTag(ConditionStatementTag) - ).WithTag(ConditionChainTag); + new MatcherWithTag(ConditionRelationTag), + new MatcherWithTag(ConditionStatementTag) + ).WithTag(ConditionTag); - private static readonly TokenMatcher[] matchers = { + // conditionChainLink ::= && | || + private static readonly TokenMatcher conditionChainLink = new MatcherGroupOr( + new MatcherGroupAnd(new MatcherLiteral("&"), new MatcherLiteral("&")), + new MatcherGroupAnd(new MatcherLiteral("|"), new MatcherLiteral("|")) + ).WithTag(ConditionChainLinkTag); + + // conditionChain ::= ( )* + private static readonly TokenMatcher conditionChain = new MatcherGroupAnd( + new MatcherWithTag(ConditionTag), + new MatcherGroupLoop(MatcherGroupLoop.LoopMode.ZeroOneMultiple, new MatcherGroupAnd( + new MatcherWithTag(ConditionChainLinkTag), + new MatcherWithTag(ConditionTag) + )) + ).WithTag(ConditionChainTag); + + // set condition (always | never | ); + private static readonly TokenMatcher[] matchers = + { new MatcherLiteral("set"), new MatcherLiteral("condition"), new MatcherTypename().WithName(TypeNameToken), new MatcherGroupOr( + new MatcherLiteral("always"), new MatcherLiteral("never"), new MatcherWithTag(ConditionChainTag) - ), + ), new MatcherLiteral(";") }; public TestCondition() : base(matchers) { - AddTaggedMatcher(conditionChain); - AddTaggedMatcher(conditionChainLink); - AddTaggedMatcher(conditionStatement); - AddTaggedMatcher(operation); AddTaggedMatcher(operand); + AddTaggedMatcher(operation); + AddTaggedMatcher(conditionStatement); + AddTaggedMatcher(conditionRelation); + AddTaggedMatcher(condition); + AddTaggedMatcher(conditionChainLink); + AddTaggedMatcher(conditionChain); } protected override void ProcessMatch(ICommandParserState state) { - } } -} +} \ No newline at end of file