private void LogScan(int origin, EarleyItem state, IToken token) { if (Options.LoggingEnabled) { Debug.WriteLine($"{GetOriginStateOperationString("Scan", origin, state)} \"{token.Value}\""); } }
private void Log(string operation, int origin, EarleyItem state) { if (Options.LoggingEnabled) { Debug.WriteLine(GetOriginStateOperationString(operation, origin, state)); } }
private void Parse(string word, List <List <EarleyItem> > positionArray) { for (int i = 0; i < positionArray.Count; i++) { for (int j = 0; j < positionArray[i].Count; j++) { EarleyItem item = positionArray[i][j]; if (item.Completed) { Complete(positionArray, i, item); } else if (item.CurrentSymbol is NonTerminal nt) { Predict(positionArray, i, nt); } else if (i < word.Length) // next symbol is a terminal, so we scan if able { if (word[i].ToString() == item.CurrentSymbol.Name) { EarleyItem newItem = item with { CurrentPosition = item.CurrentPosition + 1 }; AddToPosition(positionArray, i + 1, newItem); } } } } }
private void Complete(List <List <EarleyItem> > positionArray, int position, EarleyItem item) { int startPositon = item.StartPosition; foreach (EarleyItem starter in positionArray[startPositon]) { if (!starter.Completed && starter.CurrentSymbol == item.ReplacedSymbol) { AddToPosition(positionArray, position, starter with { CurrentPosition = starter.CurrentPosition + 1 });
private void PredictAycockHorspool(EarleyItem evidence, int location) { var nullParseNode = CreateNullParseNode(evidence.DottedRule.PostDotSymbol as NonTerminal, location); var dottedRule = DottedRules.GetNext(evidence.DottedRule); //var evidenceParseNode = evidence.ParseNode as IInternalForestNode; IForestNode parseNode; if (evidence.ParseNode is IInternalForestNode evidenceParseNode && evidenceParseNode.Children.Count > 0) { parseNode = CreateParseNode( dottedRule, evidence.Origin, evidenceParseNode, nullParseNode, location); }
private static string GetOriginStateOperationString(string operation, int origin, EarleyItem state) { return($"{origin.ToString().PadRight(9)}{state.ToString().PadRight(100)}{operation}"); }