예제 #1
0
        public GenericParserHelper(DslSyntax syntax, string overrideKeyword = null)
        {
            DslSyntax = syntax;
            ConceptType conceptType = DslSyntax.GetConceptType(typeof(TConceptInfo), overrideKeyword);

            GenericParser = new GenericParser(conceptType);
        }
 public TestDslParser(string dsl, DslSyntax syntax)
     : base(
         new TestTokenizer(dsl),
         new Lazy <DslSyntax>(() => syntax),
         new ConsoleLogProvider())
 {
     _syntax = syntax;
 }
예제 #3
0
        public static ConceptType GetConceptType(this DslSyntax dslSyntax, Type conceptInfoType, string overrideKeyword = null)
        {
            var conceptType = dslSyntax.ConceptTypes.Single(ct => ct.AssemblyQualifiedName == conceptInfoType.AssemblyQualifiedName);

            if (overrideKeyword != null)
            {
                conceptType.Keyword = overrideKeyword;
            }
            return(conceptType);
        }
예제 #4
0
        public static ConceptSyntaxNode CreateConceptSyntaxNode(this DslSyntax dslSyntax, IConceptInfo ci)
        {
            var conceptInfoType = ci.GetType();
            var node            = new ConceptSyntaxNode(dslSyntax.GetConceptType(conceptInfoType));
            var members         = ConceptMembers.Get(conceptInfoType);

            if (node.Parameters.Length != members.Length)
            {
                throw new InvalidOperationException(
                          $"{nameof(ConceptSyntaxNode)} parameters count ({node.Parameters.Length})" +
                          $" does not match {nameof(ConceptMembers)} count ({members.Length}).");
            }

            for (int m = 0; m < members.Length; m++)
            {
                object value = members[m].GetValue(ci);

                node.Parameters[m] = value;

                if (value == null)
                {
                    node.Parameters[m] = null;
                }
                else if (value is string)
                {
                    node.Parameters[m] = value;
                }
                else if (value is IConceptInfo referencedConceptInfo)
                {
                    var referencedNode = CreateConceptSyntaxNode(dslSyntax, referencedConceptInfo);
                    node.Parameters[m] = referencedNode;
                }
                else
                {
                    var valueType = value?.GetType().Name ?? "null";
                    throw new ArgumentException($"Value type {valueType} is not expected in '{ci.GetUserDescription()}', parameter {members[m].Name}.");
                }
            }

            return(node);
        }