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; }
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(); }
static CtrlParser() { NextStateRec nsStart = NextStateRec.CreateGrammaDef("Start"); NSBldr = new NextStateBuilder(nsStart, OnParserAction); Initialise(nsStart); NextStateFunc = NSBldr.NextStateFunc; StructBldr.SetNextStateFunc(NextStateFunc); }
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); } }
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 }