public ParserEngine(TransitionTable transitions, SyntaxErrors errorDef) { CodeContract.RequiresArgumentNotNull(transitions, "transitions"); CodeContract.RequiresArgumentNotNull(errorDef, "errorDef"); m_transitions = transitions; m_reducer = new ReduceVisitor(transitions); m_heads = new List <ParserHead>(); m_shiftedHeads = new List <ParserHead>(); m_acceptedHeads = new List <ParserHead>(); m_errorCandidates = new List <ParserHead>(); m_tempHeads = new List <ParserHead>(); m_reducedHeads = new List <ParserHead>(); m_recoverReducedHeads = new List <ParserHead>(); m_errorDef = errorDef; m_cleaner = new ParserHeadCleaner(); EnableDeletionRecovery = true; EnableInsertionRecovery = true; EnableReplacementRecovery = true; //init state m_heads.Add(new ParserHead(new StackNode(0, null, null))); }
public void Reduce(IProduction production, ReduceVisitor reducer, Lexeme lookahead) { #if HISTORY var from = m_topStack.StateIndex; #endif if (production == null) { //Accept Debug.Assert(m_topStack.PrevNode.StateIndex == 0); //TODO: accepted IsAccepted = true; return; } if (production.AggregatesAmbiguities) { AmbiguityAggregator = ((ProductionBase)production).CreateAggregator(); } var reduceResult = production.Accept(reducer, m_topStack); m_topStack = reduceResult.NewTopStack; var reduceError = reduceResult.ReduceError; if (reduceError != null) { IncreaseErrorRecoverLevel(); if (reduceError.ErrorPosition == null) { reduceError = new ErrorRecord(reduceError.ErrorId, lookahead.Value.Span); } AddError(reduceError); } #if HISTORY var to = m_topStack.StateIndex; History.Add(String.Format("R{0}:{1}", from, to)); #endif }