Search in sources :

Example 6 with Position

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);
    }
}
Also used : Position(priv.bajdcc.util.Position)

Aggregations

Position (priv.bajdcc.util.Position)6 Token (priv.bajdcc.util.lexer.token.Token)1