예제 #1
0
        /// <summary>
        /// Parses the portion of the document at the current position, according to the
        /// instructions available in the macro.
        /// </summary>
        /// <param name="Document">ASN.1 document being parsed.</param>
        /// <param name="Macro">Macro being executed.</param>
        /// <returns>Parsed ASN.1 node.</returns>
        public override Asn1Node Parse(Asn1Document Document, Asn1Macro Macro)
        {
            int      Bak     = Document.pos;
            int      BestPos = -1;
            Asn1Node Best    = null;
            Asn1Node Option;

            foreach (UserDefinedItem Item in this.options)
            {
                Document.pos = Bak;

                try
                {
                    Option = Item.Parse(Document, Macro);
                    if (Best is null || Document.pos > BestPos)
                    {
                        BestPos = Document.pos;
                        Best    = Option;
                    }
                }
                catch (Exception)
                {
                    // Ignore
                }
            }

            if (BestPos < 0)
            {
                throw Document.SyntaxError("Invalid option.");
            }

            Document.pos = BestPos;

            return(Best);
        }
예제 #2
0
        /// <summary>
        /// Parses the portion of the document at the current position, according to the
        /// instructions available in the macro.
        /// </summary>
        /// <param name="Document">ASN.1 document being parsed.</param>
        /// <param name="Macro">Macro being executed.</param>
        /// <returns>Parsed ASN.1 node.</returns>
        public override Asn1Node Parse(Asn1Document Document, Asn1Macro Macro)
        {
            if (Document.namedNodes.TryGetValue(this.identifier, out Asn1Node Node))
            {
                if (Node is Asn1TypeDefinition TypeDef)
                {
                    return(TypeDef.Definition.Parse(Document, Macro));
                }
                else if (Node is Asn1Type Type)
                {
                    return(Type.Parse(Document, Macro));
                }
                else
                {
                    throw Document.SyntaxError("Type reference expected: " + this.identifier);
                }
            }

            foreach (SupportingSyntax Syntax in Macro.SupportingSyntax)
            {
                if (Syntax.Name == this.identifier)
                {
                    return(Syntax.Parse(Document, Macro));
                }
            }

            throw Document.SyntaxError("Supporting syntax for " + this.identifier + " not found.");
        }
예제 #3
0
        /// <summary>
        /// Parses the portion of the document at the current position, according to the
        /// instructions available in the macro.
        /// </summary>
        /// <param name="Document">ASN.1 document being parsed.</param>
        /// <param name="Macro">Macro being executed.</param>
        /// <returns>Parsed ASN.1 node.</returns>
        public override Asn1Node Parse(Asn1Document Document, Asn1Macro Macro)
        {
            Asn1Node Result = null;

            foreach (UserDefinedItem Item in this.items)
            {
                Result = Item.Parse(Document, Macro);
            }

            return(Result);
        }
예제 #4
0
        /// <summary>
        /// Parses the portion of the document at the current position, according to the
        /// instructions available in the macro.
        /// </summary>
        /// <param name="Document">ASN.1 document being parsed.</param>
        /// <param name="Macro">Macro being executed.</param>
        /// <returns>Parsed ASN.1 node.</returns>
        public override Asn1Node Parse(Asn1Document Document, Asn1Macro Macro)
        {
            switch (this.Identifier.ToUpper())
            {
            case "TYPE": return(Document.ParseType(this.Identifier, false));

            case "VALUE": return(Document.ParseValue());

            default: return(this.type.Parse(Document, Macro));
            }
        }
예제 #5
0
        /// <summary>
        /// Parses the portion of the document at the current position, according to the
        /// instructions available in the macro.
        /// </summary>
        /// <param name="Document">ASN.1 document being parsed.</param>
        /// <param name="Macro">Macro being executed.</param>
        /// <returns>Parsed ASN.1 node.</returns>
        public override Asn1Node Parse(Asn1Document Document, Asn1Macro Macro)
        {
            int Bak = Document.pos;

            foreach (UserDefinedItem Item in this.options)
            {
                Document.pos = Bak;

                try
                {
                    return(Item.Parse(Document, Macro));
                }
                catch (Exception)
                {
                    // Ignore
                }
            }

            throw Document.SyntaxError("Invalid option.");
        }
예제 #6
0
        /// <summary>
        /// Parses the portion of the document at the current position, according to the
        /// instructions available in the macro.
        /// </summary>
        /// <param name="Document">ASN.1 document being parsed.</param>
        /// <param name="Macro">Macro being executed.</param>
        /// <returns>Parsed ASN.1 node.</returns>
        public override Asn1Node Parse(Asn1Document Document, Asn1Macro Macro)
        {
            if (Macro.Document.namedNodes.TryGetValue(this.identifier, out Asn1Node Node))
            {
                if (Node is Asn1TypeDefinition TypeDef)
                {
                    return(TypeDef.Definition.Parse(Document, Macro));
                }
                else if (Node is Asn1Type Type)
                {
                    return(Type.Parse(Document, Macro));
                }
                else if (Node is Asn1FieldDefinition FieldDef)
                {
                    return(FieldDef.Type.Parse(Document, Macro));
                }
                else
                {
                    throw Document.SyntaxError("Type reference expected: " + this.identifier);
                }
            }

            if (Macro.supportingSyntax.TryGetValue(this.identifier, out SupportingSyntax Syntax))
            {
                return(Syntax.Parse(Document, Macro));
            }

            switch (this.identifier.ToLower())
            {
            case "empty": return(null);

            case "type": return(Document.ParseType(this.Identifier, false));

            case "value": return(Document.ParseValue());

            default: throw Document.SyntaxError("Supporting syntax for " + this.identifier + " not found.");
            }
        }
예제 #7
0
 /// <summary>
 /// Parses the portion of the document at the current position, according to the
 /// instructions available in the macro.
 /// </summary>
 /// <param name="Document">ASN.1 document being parsed.</param>
 /// <param name="Macro">Macro being executed.</param>
 /// <returns>Parsed ASN.1 node.</returns>
 public override Asn1Node Parse(Asn1Document Document, Asn1Macro Macro)
 {
     Document.AssertNextToken(this.value);
     return(new Values.Asn1StringValue(this.value));
 }
예제 #8
0
 /// <summary>
 /// Parses the portion of the document at the current position, according to the
 /// instructions available in the macro.
 /// </summary>
 /// <param name="Document">ASN.1 document being parsed.</param>
 /// <param name="Macro">Macro being executed.</param>
 /// <returns>Parsed ASN.1 node.</returns>
 public override Asn1Node Parse(Asn1Document Document, Asn1Macro Macro)
 {
     return(this.type.Parse(Document, Macro));
 }
예제 #9
0
 /// <summary>
 /// Parses the portion of the document at the current position, according to the
 /// instructions available in the macro.
 /// </summary>
 /// <param name="Document">ASN.1 document being parsed.</param>
 /// <param name="Macro">Macro being executed.</param>
 /// <returns>Parsed ASN.1 node.</returns>
 public abstract Asn1Node Parse(Asn1Document Document, Asn1Macro Macro);