///|
pub fn NQuadsState::to_str(self : NQuadsState) -> String {
Show::to_string(self)
}
// ===== NQuadsRecognizer 实现 =====
///|
pub impl StateMachine for NQuadsRecognizer with fn initial_state(
_self : NQuadsRecognizer,
) -> RdfState {
RdfState::NQuadsState(NQuadsState::ExpectSubject)
}
///|
pub impl StateMachine for NQuadsRecognizer with fn error_recovery_statemachine(
self,
) -> NQuadsRecognizer {
self.error_recovery_state()
}
///|
pub impl StateMachine for NQuadsRecognizer with fn current_state(self) -> RdfState {
self.stack.last().unwrap_or(NQuadsState::ExpectSubject).as_state_enum()
}
///|
pub impl StateMachine for NQuadsRecognizer with fn step(self, event : Event) -> NQuadsRecognizer {
let current_state = self.current_state()
let result = self.transition(
current_state.as_state_enum(),
event,
self.context(),
)
match result {
Ok((new_machine, new_state, _output)) => {
let new_context = new_machine.context()
let new_machine = new_machine.set_context(new_context)
let new_machine = new_machine.set_current_state(new_state)
new_machine
}
Err(_e) => abort("Error")
}
}
///|
pub impl StateMachine for NQuadsRecognizer with fn reset(self) -> NQuadsRecognizer {
self.error_recovery_state()
}
///|
pub impl StateMachine for NQuadsRecognizer with fn transition(
self : NQuadsRecognizer,
state : RdfState,
event : Event,
context : RdfContext,
) -> TransitionResult[NQuadsRecognizer, RdfState, RdfOut] { // 1. 修正返回类型为 Result
// 解包 RdfState
let nquads_state = match state {
RdfState::NQuadsState(s) => s
_ =>
return Err(
RuleRecognizerError::SyntaxError(
"Invalid state type for NQuadsRecognizer",
self.last_range,
),
)
}
let context = match context {
RdfContext::NQuadsRecognizerContext(c) => c
_ =>
return Err(
RuleRecognizerError::SyntaxError(
"Invalid context for NQuads",
self.last_range,
),
)
}
self.debug_logger.info("NQuads State: \{nquads_state}, Event: \{event}")
let result = match nquads_state {
NQuadsState::ExpectSubject => self.handle_expect_subject_m(event, context)
NQuadsState::ExpectPredicate =>
self.handle_expect_predicate_m(event, context)
NQuadsState::ExpectedObject => self.handle_expected_object_m(event, context)
NQuadsState::ExpectLiteralAnnotationOrGraphNameOrDot(value~) =>
self.handle_expect_literal_annotation_or_graph_name_or_dot_m(
event, context, value,
)
NQuadsState::ExpectLiteralDatatype(value~) =>
self.handle_expect_literal_datatype_m(event, context, value)
NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple =>
self.handle_expect_possible_graph_or_end_of_quoted_triple_m(
event, context,
)
NQuadsState::ExpectDot => self.handle_expect_dot_m(event, context)
NQuadsState::ExpectLineJump =>
self.handle_expect_line_jump_m(event, context)
NQuadsState::RecoverToLineJump =>
self.handle_recover_to_line_jump_m(event, context)
_ => {
self.debug_logger.info(
">>> FALLBACK to _ case: \{nquads_state.to_string()}",
)
let err = RuleRecognizerError::SyntaxError(
"Unhandled state: \{nquads_state.to_string()}",
self.last_range,
)
let new_self = self.add_error(err)
Ok((new_self, nquads_state, None))
}
}
match result {
Ok((new_self, new_state, output)) =>
Ok((new_self, new_state.as_state_enum(), output))
Err(e) => Err(e)
}
}
///|
pub impl StateMachine for NQuadsRecognizer with fn is_accepting(
self : NQuadsRecognizer,
) -> Bool {
self.current_state() == RdfState::NQuadsState(NQuadsState::ExpectSubject) &&
self.stack.is_empty()
}
///|
pub impl StateMachine for NQuadsRecognizer with fn context(
_self : NQuadsRecognizer,
) -> RdfContext {
RdfContext::NQuadsRecognizerContext({
lexer_options: LexerOptions::{ base_iri: None },
with_graph_name: false,
})
}
///|
pub impl StateMachine for NQuadsRecognizer with fn set_context(
self : NQuadsRecognizer,
_context : RdfContext,
) -> NQuadsRecognizer {
// 假设 NQuadsRecognizer 有一个 context 字段或者通过其他方式管理
// 这里简单返回 self,实际可能需要更新内部状态
self
}
///|
pub impl StateMachine for NQuadsRecognizer with fn[ST : StateWrapper] set_current_state(
self : NQuadsRecognizer,
state : ST,
) -> NQuadsRecognizer {
let state = ST::as_state_enum(state)
match state {
RdfState::NQuadsState(s) => {
// 返回一个新的 NQuadsRecognizer 实例,其中 stack 被更新
// 假设有一个 with_stack 或类似的方法,或者直接构造新实例
// 这里简化处理,实际需要根据 NQuadsRecognizer 的结构体定义来更新
// debug("[Step 3] Set current state: \{s}")
let new_stack = self.stack
if new_stack.is_empty() {
new_stack.push(s)
} else {
let _ = new_stack.pop() // 移除旧状态
new_stack.push(s) // 添加新状态
}
{ ..self, stack: new_stack }
}
_ => self
}
}
// 辅助方法:统一处理 TransitionResult 并返回更新后的 Self
///|
pub fn NQuadsRecognizer::process_transition_result(
self : NQuadsRecognizer,
current_state : NQuadsState,
result : TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut],
) -> (NQuadsRecognizer, RdfState, RdfOut?) {
match result {
Ok((self, new_state, output)) => (self, new_state.as_state_enum(), output)
Err(e) => {
let new_self = self.add_error(e)
(new_self, current_state.as_state_enum(), None)
}
}
}
///|
fn NQuadsRecognizer::add_error(
self : NQuadsRecognizer,
err : RuleRecognizerError,
) -> NQuadsRecognizer {
let new_errors = self.errors
new_errors.push(err)
{ ..self, errors: new_errors }
}