コード例 #1
0
        static CtrlParser()
        {
            NextStateRec next, back;     // used to create a sequence of token states
            NextStateRec record;         // used to create a sequence of token states
            NextStateRec @base = null;   // holds the current record used as the base for a sequence of tokens


            FileRef ctrlParserDef = Settings.Default.CSLangDefFilePath;

            Initialise(ctrlParserDef);
            //string[] lines = File.ReadAllLines(filepath);
            //foreach (string line in lines)
            //{
            //    Match match = s_langDefRE.Match(line);
            //    // HACK: building the definition by hand for now -just reading file to confirm completeness

            //    if (!match.Success)
            //        continue;

            //    string name = match.Groups["name"].Value;

            //}

            NextStateFunc = s_nxtStateFuncBldr.NextStateFunc;
        }
コード例 #2
0
        private static void ProcessNSRecReferencesAndReset()
        {
            // Get the Sequence and Alternate references, find their references in the
            foreach (KeyValuePair <NSRecRef, NextStateRec> item in s_seqRefBldr)
            {
                int seqNo;
                // HACK: no error checking
                NSRecRef     nsRecRef = item.Key;
                NextStateRec nsRec    = item.Value;
                Debug.WriteLine($"SeqNo={nsRecRef.SeqNo}, ID={nsRecRef.Identifier}, Hash={nsRecRef.GetHashCode()} ", "NSRecRef");
                string objRef = nsRecRef.Sequence;
                if (!string.IsNullOrEmpty(objRef))
                {
                    seqNo = NSRecRef.ExtractReference(ref objRef);
                    NSRecRef nsSeqRef = new NSRecRef(seqNo, objRef);
                    Debug.WriteLine(objRef, "nsSeqRef");
                    NextStateRec nsSeqRec = s_seqRefBldr[nsSeqRef];
                    s_nxtStateFuncBldr.AddSequenceNSRecord(nsRec, nsSeqRec);
                }
                objRef = nsRecRef.Alternate;
                if (!string.IsNullOrEmpty(objRef))
                {
                    seqNo = NSRecRef.ExtractReference(ref objRef);
                    NSRecRef     nsAltRef = new NSRecRef(seqNo, objRef);
                    NextStateRec nsAltRec = s_seqRefBldr[nsAltRef];
                    s_nxtStateFuncBldr.AddAlternativeNSRecord(nsRec, nsAltRec);
                }
            }

            s_seqRefBldr.Clear();    // clears the list for the next Gramma definition
                                     //throw new NotImplementedException();
        }
コード例 #3
0
        static CtrlParser()
        {
            NextStateRec nsStart = NextStateRec.CreateGrammaDef("Start");

            NSBldr = new NextStateBuilder(nsStart, OnParserAction);
            Initialise(nsStart);
            NextStateFunc = NSBldr.NextStateFunc;
            StructBldr.SetNextStateFunc(NextStateFunc);
        }
コード例 #4
0
        private static NextStateRec ProcessDefLine(string line, out int seqNo, out string seq2Obj, out string alt2Obj)
        {
            NextStateRec nsRec, nsDef = null;

            UnEscapeQuotes(ref line);

            // extract the lines values as required
            string[] cols   = line.Split(10, ',');
            string   objRef = cols[2];

            if (!string.IsNullOrWhiteSpace(objRef))
            {
                if (!Enum.TryParse(cols[5].Trim(), out ParseResponse response))
                {
                    throw new FormatException($"Response '{cols[5].Trim()}' not a valid ParseResponse value in: {line}");
                }
                seqNo = NSRecRef.ExtractReference(ref objRef);
                nsRec = NextStateRec.CreateNSObject(objRef, response);
            }
            else  // must be a blank line so return nothing
            {
                seq2Obj = string.Empty;
                alt2Obj = string.Empty;
                seqNo   = 0;
                return(null);
            }
            string gramma = cols[0];

            // column '1' ignored, is for user reference to the gramma being defined
            seq2Obj = cols[3].Trim();
            alt2Obj = cols[4].Trim();
            string action = cols[6].Trim();

            // columns 7 onwards ignored and can be used for comments as desired


            // process a Gramma definition line (1st line in sequence) if existant and return nsDEf/nsRec sequence pair
            if (!string.IsNullOrWhiteSpace(gramma))
            {
                nsDef = NextStateRec.CreateGrammaDef(gramma.TrimEnd(':'));    //NOTE: colon is optional
                s_nxtStateFuncBldr.AddSequenceNSRecord(nsDef, nsRec);
                return(nsDef);
            }

            // OR: just return the Next State Record
            else
            {
                return(nsRec);
            }
        }
コード例 #5
0
        private static void Initialise(NextStateRec nsStart)
        {
            NextStateRec nsRec1, nsRec2, nsRec3, nsRec4, nsRec5, nsRec6;

            // create the Definition Next States and assign Start state
            NextStateRec nsUsingDir     = NextStateRec.CreateGrammaDef("UsingDir");
            NextStateRec nsNamespaceDec = NextStateRec.CreateGrammaDef("NamespaceDec");
            NextStateRec nsNamespace    = NextStateRec.CreateGrammaDef("Namespace");

            // Build the 'Start' definition NS sequence
            nsRec1 = NextStateRec.CreateGrammaRef("UsingDir");
            nsRec2 = NextStateRec.CreateGrammaRef("NamespaceDec");
            nsRec3 = NextStateRec.CreateEmpty(ParseResponse.Accept);
            NSBldr.AddSequenceNSRecord(nsStart, nsRec1);         // Seq: Start > UsingDir
            NSBldr.AddSequenceNSRecord(nsRec1, nsRec1);          // Seq: UsingDir > UsingDir
            NSBldr.AddAlternativeNSRecord(nsRec1, nsRec2);       // Alt: UsingDir > NamespaceDec
            NSBldr.AddSequenceNSRecord(nsRec2, nsRec1);          // Seq: NamespaceDec > UsingDir
            NSBldr.AddAlternativeNSRecord(nsRec2, nsRec3);       // Alt: NamespaceDec > &Empty

            // Begin the 'using' Directive NS sequence
            nsRec1 = NextStateRec.CreateTokenRef("using", TokenRef.Type.Keyword);
            nsRec2 = NextStateRec.CreateGrammaRef("Namespace");
            nsRec3 = NextStateRec.CreateTokenRef(";", TokenRef.Type.Operator, ParseResponse.Accept);
            NSBldr.AddSequenceNSRecord(nsUsingDir, nsRec1);      // Seq: UsingDir > "Using"
            NSBldr.AddSequenceNSRecord(nsRec1, nsRec2);          // Seq: "Using" > Namespace
            NSBldr.AddSequenceNSRecord(nsRec2, nsRec3);          // Seq: Namespace > ';'      Accept gramma -no sequence required

            // Begin the Namespace NS sequence
            nsRec1 = NextStateRec.CreateTokenRef(TokenRef.Type.Identifier, ParseResponse.Append);
            nsRec2 = NextStateRec.CreateTokenRef(".", TokenRef.Type.Operator, ParseResponse.Append);
            nsRec3 = NextStateRec.CreateEmpty(ParseResponse.Accept);
            NSBldr.AddSequenceNSRecord(nsNamespace, nsRec1);     // Seq: UsingDir > &Identifier
            NSBldr.AddSequenceNSRecord(nsRec1, nsRec2);          // Seq: '.' > Namespace
            NSBldr.AddSequenceNSRecord(nsRec2, nsRec3);          // Seq: Namespace > ';'      Accept gramma -no sequence required

            //nsRec4 = NextStateRec.CreateTokenRef(TokenRef.Type.Identifier);
            //nsRec5 = NextStateRec.CreateTokenRef(".", TokenRef.Type.Operator);
            //nsRec6 = NextStateRec.CreateTokenRef(";", TokenRef.Type.Operator, ParseResponse.Accept);
            //NSBldr.AddSequenceNSRecord(nsRec1, nsRec2);
            //ns
        }