// // ===== State: ExpectSubject =====
// ///|
// fn NQuadsRecognizer::handle_expect_subject(
// self : NQuadsRecognizer,
// token : LocatedToken,
// _ctx : NQuadsRecognizerContext,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// self.debug_logger.info(
// "ExpectSubject with token: \{token} Token stack: \{@debug.to_string(self.stack)}",
// )
// match token {
// LocatedToken(N3Token::End, _) =>
// Ok((self, NQuadsState::ExpectSubject, None))
// LocatedToken(N3Token::Iri(s), _) => {
// let new_self = self
// new_self.subjects.push(NamedNodeRef::new_unchecked(s).as_enum())
// // 状态转换为 ExpectPredicate,无语句产生
// Ok((new_self, NQuadsState::ExpectPredicate, None))
// }
// LocatedToken(N3Token::BlankNodeLabel(s), _) => {
// let new_self = self
// new_self.subjects.push(BlankNodeRef::new_unchecked(s).as_enum())
// Ok((new_self, NQuadsState::ExpectPredicate, None))
// }
// _ => Err(RuleRecognizerError::BlankNodeOrIriError)
// }
// }
// // ===== State: ExpectPredicate =====
// ///|
// fn NQuadsRecognizer::handle_expect_predicate(
// self : NQuadsRecognizer,
// token : LocatedToken,
// _ctx : NQuadsRecognizerContext,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// self.debug_logger.info(
// "ExpectPredicate with token: \{token} Token stack: \{@debug.to_string(self.stack)}",
// )
// match token {
// LocatedToken(N3Token::Iri(p), _) => {
// let new_self = self
// new_self.predicates.push(NamedNodeRef::new_unchecked(p))
// Ok((new_self, NQuadsState::ExpectedObject, None))
// }
// _ => Err(RuleRecognizerError::PredicateNotAnIRI)
// }
// }
// // ===== State: ExpectedObject =====
// ///|
// fn NQuadsRecognizer::handle_expected_object(
// self : NQuadsRecognizer,
// token : LocatedToken,
// ctx : NQuadsRecognizerContext,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// self.debug_logger.info(
// " ExpectedObject: \{token} Token stack: \{@debug.to_string(self.stack)}",
// )
// match token {
// LocatedToken(N3Token::Iri(o), _) => {
// let new_self = self
// new_self.objects.push(
// TermRef::NamedNodeRef(NamedNodeRef::new_unchecked(o)),
// )
// if ctx.with_graph_name {
// Ok(
// (new_self, NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple, None),
// )
// } else {
// // N-Triples 直接进入 ExpectDot
// Ok((new_self, NQuadsState::ExpectDot, None))
// }
// }
// LocatedToken(N3Token::BlankNodeLabel(o), _) => {
// let new_self = self
// new_self.objects.push(NamedNodeRef::new_unchecked(o).as_term())
// Ok((new_self, NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple, None))
// }
// LocatedToken(N3Token::String(value), _) => {
// let new_self = self
// // new_self.temp_literal_value = Some(value)
// Ok(
// (
// new_self,
// NQuadsState::ExpectLiteralAnnotationOrGraphNameOrDot(value~),
// None,
// ),
// )
// }
// LocatedToken(N3Token::Punctuation("<<("), _) => {
// let new_self = self
// new_self.stack.push(NQuadsState::AfterQuotedTriple)
// new_self.stack.push(NQuadsState::ExpectSubject)
// Ok((new_self, NQuadsState::ExpectSubject, None)) // 立即进入子解析
// }
// _ => Err(RuleRecognizerError::BlankNodeOrIriError)
// }
// }
// // ===== State: ExpectLiteralAnnotationOrGraphNameOrDot =====
// ///|
// fn NQuadsRecognizer::handle_expect_literal_annotation_or_graph_name_or_dot(
// self : NQuadsRecognizer,
// token : LocatedToken,
// _ctx : NQuadsRecognizerContext,
// value : String,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// self.debug_logger.info("Token stack: \{@debug.to_string(self.stack)}")
// match token {
// LocatedToken(N3Token::LangTag(language~, direction~), _) if direction
// is Some(_) => {
// let dir = match direction {
// Some(d) => d
// None => BaseDirection::Ltr
// }
// let lang_tag = LanguageTag::from_str(language.to_lower()) catch {
// _e => return Err(RuleRecognizerError::InvalidLanguageTag) // 简化错误处理
// }
// match lang_tag {
// lang_tag => {
// let new_self = self
// let literal = LiteralRef::new_directional_language_tagged_literal_unchecked(
// value, lang_tag, dir,
// ).as_term()
// new_self.objects.push(literal)
// // new_self.temp_literal_value = None // 清除临时值
// Ok(
// (
// new_self,
// NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple,
// None,
// ),
// )
// }
// }
// }
// LocatedToken(N3Token::LangTag(language~, direction~), _) if direction
// is None => {
// let lang_tag = LanguageTag::from_str(language.to_lower()) catch {
// _e => return Err(RuleRecognizerError::InvalidLanguageTag)
// }
// match lang_tag {
// lang_tag => {
// let new_self = self
// let literal = TermRef::LiteralRef(
// Literal::new_language_tagged_literal_unchecked(
// value,
// lang_tag.to_string(),
// ).as_ref(),
// )
// new_self.objects.push(literal)
// // new_self.temp_literal_value = None
// Ok(
// (
// new_self,
// NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple,
// None,
// ),
// )
// }
// // Err(_e) => Err(RuleRecognizerError::InvalidLanguageTag)
// }
// }
// LocatedToken(N3Token::Punctuation("^^"), _) => {
// let new_self = self
// // new_self.temp_literal_value = Some(value) // 传递给 datatype 状态
// Ok((new_self, NQuadsState::ExpectLiteralDatatype(value~), None))
// }
// _ =>
// // 检查是否是句点
// match token {
// LocatedToken(N3Token::Punctuation("."), _) => {
// let new_self = self
// let literal = TermRef::LiteralRef(
// LiteralRef::new_simple_literal(value),
// )
// new_self.objects.push(literal)
// let stmt = new_self.emit_current_quad()
// let _ = new_self.error_recovery_state()
// Ok((new_self, NQuadsState::ExpectLineJump, stmt))
// }
// _ => {
// let new_self = self
// let literal = TermRef::LiteralRef(
// LiteralRef::new_simple_literal(value),
// )
// new_self.objects.push(literal)
// Ok(
// (
// new_self,
// NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple,
// None,
// ),
// )
// }
// }
// }
// // _ => {
// // let new_self = self
// // let literal = TermRef::LiteralRef(LiteralRef::new_simple_literal(value))
// // new_self.objects.push(literal)
// // // new_self.temp_literal_value = None
// // Ok((new_self, NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple, None))
// // }
// }
// // ===== State: ExpectLiteralDatatype =====
// ///|
// pub fn NQuadsRecognizer::handle_expect_literal_datatype(
// self : NQuadsRecognizer,
// token : LocatedToken,
// _ctx : NQuadsRecognizerContext,
// value : String,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// // let value = match self.temp_literal_value {
// // Some(v) => v
// // None => return Err(RuleRecognizerError::SyntaxError("Missing literal value for datatype", Range::default()))
// // }
// self.debug_logger.info(
// "ExpectLiteralDatatype with value: \{value} Token stack: \{@debug.to_string(self.stack)}",
// )
// match token {
// LocatedToken(N3Token::Iri(d), _) => {
// if !self.lenient && d == lwLANG_STRING.to_string() {
// return Err(
// RuleRecognizerError::SyntaxError(
// "The datatype of a literal without a language tag must not be rdf:langString",
// Range::default(),
// ),
// )
// }
// if !self.lenient && d == lwDIR_LANG_STRING.to_string() {
// return Err(
// RuleRecognizerError::SyntaxError(
// "The datatype of a literal without a base direction must not be rdf:dirLangString",
// Range::default(),
// ),
// )
// }
// let d_ref = NamedNodeRef::new_unchecked(d)
// let data_value = d_ref.into_datatype(value)
// let new_self = self
// let literal = TermRef::LiteralRef(
// LiteralRef::new_typed_literal(data_value, d_ref),
// )
// new_self.objects.push(literal)
// // new_self.temp_literal_value = None
// Ok((new_self, NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple, None))
// }
// _ => Err(RuleRecognizerError::LiteralDatatypeError)
// }
// }
// // ===== State: ExpectPossibleGraphOrEndOfQuotedTriple =====
// ///|
// pub fn NQuadsRecognizer::handle_expect_possible_graph_or_end_of_quoted_triple(
// self : NQuadsRecognizer,
// token : LocatedToken,
// ctx : NQuadsRecognizerContext,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// self.debug_logger.info(
// "ExpectPossibleGraphOrEndOfQuotedTriple Token stack: \{@debug.to_string(self.stack)}",
// )
// // 首先检查是否是图名 IRI(无论是顶层还是嵌套在引用的三元组中)
// if ctx.with_graph_name {
// match token {
// LocatedToken(N3Token::Iri(g), _) => {
// let stmt = self.emit_current_quad(
// graph_name=GraphNameRef::new_unchecked(g).into_owned(),
// )
// let new_self = self
// let _ = new_self.error_recovery_state()
// return Ok((new_self, NQuadsState::ExpectDot, stmt))
// }
// LocatedToken(N3Token::BlankNodeLabel(_g), _) => {
// let stmt = self.emit_current_quad()
// let new_self = self
// let _ = new_self.error_recovery_state()
// return Ok((new_self, NQuadsState::ExpectDot, stmt))
// }
// _ => ()
// }
// }
// // 检查是否是句点(默认图结束)
// match token {
// LocatedToken(N3Token::Punctuation("."), _) => {
// let stmt = self.emit_current_quad()
// let new_self = self
// let _ = new_self.error_recovery_state()
// return Ok((new_self, NQuadsState::ExpectLineJump, stmt))
// }
// _ => ()
// }
// // 检查是否是引用的三元组结束
// if !self.stack.is_empty() {
// match token {
// LocatedToken(N3Token::Punctuation(")>>"), _) =>
// // 结束引用三元组,返回当前解析器状态,不产生顶层语句
// return Ok((self, NQuadsState::AfterQuotedTriple, None))
// _ => ()
// }
// // 如果在栈中且不是结束符,可能是错误
// return Err(
// RuleRecognizerError::SyntaxError(
// "Expecting the end of a quoted triple ')>>'",
// Range::default(),
// ),
// )
// }
// // 栈为空且没有特殊 token,返回 ExpectSubject 并输出 quad
// let stmt = self.emit_current_quad()
// let new_self = self
// let _ = new_self.error_recovery_state()
// Ok((new_self, NQuadsState::ExpectSubject, stmt))
// }
// // ===== State: ExpectDot =====
// ///|
// fn NQuadsRecognizer::handle_expect_dot(
// self : NQuadsRecognizer,
// token : LocatedToken,
// _ctx : NQuadsRecognizerContext,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// self.debug_logger.info(
// "ExpectDot with token: \{token} Token stack: \{@debug.to_string(self.stack)}",
// )
// match token {
// LocatedToken(N3Token::Punctuation("."), _) => {
// let stmt = self.emit_current_quad()
// Ok((self, NQuadsState::ExpectLineJump, stmt))
// }
// t =>
// Err(
// RuleRecognizerError::SyntaxError("Quads must be followed by a dot", t.1),
// )
// // _ =>
// // Err(RuleRecognizerError::SyntaxError("Expecting a dot", Range::default()))
// }
// }
// // ===== State: ExpectLineJump =====
// ///|
// pub fn NQuadsRecognizer::handle_expect_line_jump(
// self : NQuadsRecognizer,
// token : LocatedToken,
// _ctx : NQuadsRecognizerContext,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// self.debug_logger.info("Entering ExpectLineJump with token: \{token}")
// let tok = match token {
// LocatedToken(N3Token::LineJump, range) => "LineJump(\{range})"
// LocatedToken(N3Token::End, _) => "End"
// t => "N3Token: \{t.0}"
// }
// self.debug_logger.info("Token type: \{tok}")
// match token {
// LocatedToken(N3Token::LineJump, _) =>
// // 成功:换行后回到 ExpectSubject 开始下一个语句
// Ok((self, NQuadsState::ExpectSubject, None))
// LocatedToken(N3Token::End, _) =>
// // 文件结束,安静地接受
// Ok((self, NQuadsState::ExpectSubject, None))
// _ =>
// // 换行符之后不应该有其他内容
// // 跳过并继续等待换行(lenient 模式)
// if self.lenient {
// Ok((self, NQuadsState::ExpectLineJump, None))
// } else {
// Err(
// RuleRecognizerError::SyntaxError(
// "Only a single triple or quad can be written in a line",
// Range::default(),
// ),
// )
// }
// }
// }
// // ===== State: AfterQuotedTriple =====
// ///|
// pub fn NQuadsRecognizer::handle_after_quoted_triple(
// self : NQuadsRecognizer,
// token : LocatedToken,
// _ctx : NQuadsRecognizerContext,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// self.debug_logger.info(
// " AfterQuotedTriple with token: \{token} Token stack: \{@debug.to_string(self.stack)}",
// )
// let subject_opt = self.subjects.pop()
// let predicate_opt = self.predicates.pop()
// let object_opt = self.objects.pop()
// match (subject_opt, predicate_opt, object_opt) {
// (Some(subject), Some(predicate), Some(object)) => {
// let triple : TripleRef = { subject, predicate, object }
// let new_self = self
// // 将引用的三元组作为对象推入外层对象的栈
// new_self.objects.push(TermRef::TripleRef(triple))
// // 弹出 AfterQuotedTriple 状态,回到之前的状态
// // 原逻辑: self.stack.push(NQuadsState::ExpectPossibleGraphOrEndOfQuotedTriple)
// let prev_state = new_self.stack.pop()
// match prev_state {
// Some(state) => Ok((new_self, state, None))
// None =>
// Err(
// RuleRecognizerError::SyntaxError(
// "Stack underflow after quoted triple",
// Range::default(),
// ),
// )
// }
// }
// _ =>
// Err(
// RuleRecognizerError::SyntaxError(
// "Internal error: incomplete quoted triple on stack",
// Range::default(),
// ),
// )
// }
// }
// // ===== State: RecoverToLineJump =====
// ///|
// pub fn NQuadsRecognizer::handle_recover_to_line_jump(
// self : NQuadsRecognizer,
// token : LocatedToken,
// _ctx : NQuadsRecognizerContext,
// ) -> TransitionResult[NQuadsRecognizer, NQuadsState, RdfOut] {
// self.debug_logger.info(
// "RecoverToLineJump with token: \{token} Token stack: \{@debug.to_string(self.stack)}",
// )
// match token {
// LocatedToken(N3Token::LineJump, _) =>
// // 恢复完成,通常意味着要重新开始或结束
// // 返回一个初始状态
// Ok((self, NQuadsState::ExpectSubject, None))
// _ =>
// // 继续等待 LineJump,保持状态
// Ok((self, NQuadsState::RecoverToLineJump, None))
// }
// }