use of priv.bajdcc.util.Position in project jMiniLang by bajdcc.
the class Semantic method validateTracker.
/**
* 分析跟踪器是否有继续分析的价值
*
* @param fatal
* 跟踪器是否遇到严重且不可恢复的错误
*/
private void validateTracker(boolean fatal) {
/* 无可用边,且单词流未结束,则报错 */
if (!tracker.bRaiseError) {
/* 如果是第一次发生错误则调整状态 */
tracker.bRaiseError = true;
iTrackerWithoutErrorCount--;
/* 如果存在没有发生错误的跟踪器,则删除当前跟踪器 */
if (iTrackerWithoutErrorCount > 0) {
tracker.iter = null;
trackerResource.freeTracker(tracker);
tracker = null;
}
}
/* 判断该跟踪器是否有继续分析的价值 */
if (tracker != null) {
Position position = new Position(fatal ? tracker.iter.position() : tracker.iter.ex().lastPosition());
TrackerError error = new TrackerError(position);
/* 寻找合适的错误处理器并处理 */
boolean processed = findCorrectHandler(tracker, error, position);
/* 若没有错误处理器接受这个错误,则调用缺省的错误处理器 */
if (!processed && !fatal) {
processed = handleError(tracker, error, position);
}
/* 如果没有错误处理程序或者错误处理程序放弃处理,则产生缺省的错误消息 */
if (!processed) {
if (!fatal) {
error.message = String.format("类型[%s],状态[%s]", tracker.iter.ex().token(), tracker.npaStatus.data.label);
} else {
error.message = String.format("状态[%s]", tracker.npaStatus.data.label);
}
// 跳过
tracker.iter.scan();
}
/* 提交错误 */
tracker.bInStepError = true;
tracker.rcdError.arrErrors.add(error);
}
}