///|
pub(all) enum RdfContext {
NQuadsRecognizerContext(NQuadsRecognizerContext)
}
///|
pub(all) enum RdfOut {
Quad(Quad)
Triple(Triple)
} derive(Debug)
///|
pub impl Show for RdfOut with fn output(self, logger : &Logger) -> Unit {
match self {
Quad(quad) => logger.write_object(quad)
Triple(triple) => logger.write_object(triple)
}
}
///|
pub fn RdfOut::new(quad : Quad) -> RdfOut {
Quad(quad)
}
///|
pub fn[TR : TokenRecognizer, RR : GenMachine] SliceIterator::next(
self : SliceIterator[TR, RR],
) -> Result[RdfOut, LexerError]? {
while !self.parser.is_end() {
if self.parser.parse_next() is Some(result) {
// 修复:将 TurtleError 转换为 String
return Some(
result.map_err(e => {
LexerError::SyntaxError("Syntax Error: \{e.to_string()}")
}),
)
}
// 对于 slice 迭代器,数据已经在 parser 中,不需要额外读取
break
}
None
}
///|
pub(all) struct Parser[TR, M] {
mut lexer : Lexer[TR]
mut engine : GenericStateMachine[M] // ← 泛型状态机引擎
context : RdfContext
errors : Array[RuleRecognizerError]
}
///|
pub fn[TR, M] Parser::Parser(
lexer : Lexer[TR],
engine : GenericStateMachine[M], // ← 泛型状态机引擎
context : RdfContext,
) -> Parser[TR, M] {
{ lexer, engine, context, errors: [] }
// pending_token: None,
}
///|
pub fn[TR : TokenRecognizer, M : GenMachine] Parser::parse_next(
self : Parser[TR, M],
) -> Result[RdfOut, TokenRecognizerError]? {
for ;; {
// 1. 优先处理错误
if self.errors.pop() is Some(e) {
let range = self.lexer.current_token_range()
let bytes = self.lexer.range_to_bytes(range)
return Some(
Err(TokenRecognizerError::InvalidToken(e.message(), bytes, range)),
)
}
// 2. ✅ 从状态机获取输出
if self.try_output() is Some(result) {
return Some(result)
}
// 3. 尝试从 Lexer 获取下一个 Token
let ctx = self.lexer_options()
// let ctx = self.lexer_options()
match self.lexer.parse_next(ctx) {
Some(Ok(located_token)) => {
let previous_state = self.engine.current_state()
self.engine.debug_logger.info("Parser::parse_token = \{located_token}")
// ✅ 驱动状态机
self.engine = self.engine.step(located_token)
// ✅ 检查是否状态变化(token 没被消费)
if self.engine.current_state() == previous_state {
// 状态没变 = token 没被消费,重新用同一个 token 调用
// 防止无限循环:最多重试一次
self.engine = self.engine.step(located_token)
}
// ✅ 检查是否完成
if self.try_finish() is Some(result) {
return Some(result)
}
continue
}
Some(Err(e)) => {
// 词法错误
self.engine = self.engine.reset()
let range = self.lexer.current_token_range()
let bytes = self.lexer.range_to_bytes(range)
let range = self.lexer.current_token_range()
// self.errors.push(RuleRecognizerError::SyntaxError(e.message(), range))
self.engine.lexer_errors.push((e.message(), bytes, range))
// 跳过至少一个字符
// 消费并继续
self.lexer.position.buffer_offset += bytes.length().max(1)
self.engine = self.engine.reset()
self.engine = self.engine.reset()
// ★ 跳过到下一个空白或换行
// while self.lexer.position.buffer_offset < self.lexer.data.length() {
// if self.lexer.data[self.lexer.position.buffer_offset] == b'\n' {
// self.lexer.position.buffer_offset += 1 // 跳过换行
// break
// }
// self.lexer.position.buffer_offset += 1
// }
continue
// ★ 继续解析下一行!
// return Some(
// Err(TokenRecognizerError::InvalidToken(e.message(), bytes, range)),
// )
}
None =>
if self.lexer.is_end() {
// ✅ 结束处理
if self.engine.is_accepting() {
// 返回剩余输出
if self.engine.outputs.length() > 0 {
let output = match self.engine.outputs.pop() {
Some(o) => o
None => return None
}
self.engine = self.engine.remove_first_output()
return Some(Ok(output))
}
return None
} else {
// 未完成
self.errors.push(
RuleRecognizerError::SyntaxError(
"Unexpected end of last input",
self.lexer.last_token_range().to_range(),
),
)
// return Some(
// Err(
// TurtleError::UnexpectedEndOfInput(
// self.lexer.last_token_end(),
// "Unexpected end of input.",
// ),
// ),
// )
}
} else {
return None
}
}
}
}
// ===== Parser 辅助方法 =====
///|
pub fn[TR, M : GenMachine] Parser::is_end(self : Parser[TR, M]) -> Bool {
self.lexer.is_end() &&
self.engine.is_accepting() &&
self.engine.outputs.is_empty() &&
self.errors.is_empty()
}
///|
pub fn[TR, M] Parser::end(self : Parser[TR, M]) -> Unit {
self.lexer.end()
}
///|
/// 尝试返回一个输出
pub fn[TR, M] Parser::try_output(
self : Parser[TR, M],
) -> Result[RdfOut, TokenRecognizerError]? {
// 先检查是否有输出
if self.engine.outputs.length() > 0 {
let output = match self.engine.outputs.get(0) {
Some(o) => o
None => return None
}
self.engine = self.engine.remove_first_output()
// ★ 如果还有词法错误,记录到输出中(或者先清空)
return Some(Ok(output))
}
// 没有输出了,检查词法错误
if self.engine.lexer_errors.length() > 0 {
let (msg, bytes, range) = self.engine.lexer_errors.pop().unwrap()
return Some(Err(TokenRecognizerError::InvalidToken(msg, bytes, range)))
}
None
}
///|
/// 检查并处理完成状态
pub fn[TR, M : GenMachine] Parser::try_finish(
self : Parser[TR, M],
) -> Result[RdfOut, TokenRecognizerError]? {
if self.engine.is_accepting() {
if self.engine.outputs.length() > 0 {
let output = match self.engine.outputs.get(0) {
Some(o) => o
None => return None
}
self.engine = self.engine.remove_first_output()
return Some(Ok(output))
}
// 已接受但无输出,可能是一个空的成功状态,继续解析
return None
} else {
// 尚未接受,属于中间状态,继续获取下一个 Token
return None
}
}
///|
pub fn[TR, RR] Parser::extend_from_slice(
self : Parser[TR, RR],
other : Array[Byte],
) -> Unit {
self.lexer.extend_from_slice(other)
}
///|
pub fn[TR, RR] Parser::for_reader(
self : Parser[TR, RR],
reader : &Reader,
) -> ReaderIterator[TR, RR] {
{ reader, parser: self }
}
///|
pub fn[TR, RR] Parser::for_async_reader(
self : Parser[TR, RR],
reader : &Reader,
) -> AsyncReaderIterator[TR, RR] {
{ reader, parser: self }
}
///|
pub fn[TR, RR] Parser::lexer_options(self : Parser[TR, RR]) -> LexerOptions? {
match self.context {
NQuadsRecognizerContext(ctx) => Some(ctx.lexer_options)
}
}
///|
pub struct ReaderIterator[TR, RR] {
reader : &Reader
parser : Parser[TR, RR]
}
///|
pub async fn[RR : GenMachine] ReaderIterator::next(
self : ReaderIterator[RdfLexer, RR],
) -> Result[RdfOut, LexerError]? {
while !self.parser.is_end() {
if self.parser.parse_next() is Some(result) {
debug("Parser::parse_next: \{@debug.to_string(result)}")
return Some(
result.map_err(e => {
LexerError::SyntaxError("Syntax Error: \{e.to_string()}")
}),
)
}
// 尝试从 Reader 填充数据
match self.parser.lexer.extend_from_reader(self.reader) {
Ok(bytes_read) =>
if bytes_read == 0 {
// EOF reached
self.parser.lexer.end()
// 如果此时 parser 还没有结束,下一轮循环会处理结束逻辑或报错
} else {
// 成功读取数据,继续循环让 parse_next 尝试解析
}
Err(e) =>
return Some(
Err(LexerError::IoReadError("IO Read Error: \{e.to_string()}")),
)
}
}
None
}
///|
pub struct AsyncReaderIterator[TR, RR] {
reader : &Reader
parser : Parser[TR, RR]
}
///|
pub async fn[TR : TokenRecognizer, RR : GenMachine] AsyncReaderIterator::next(
self : AsyncReaderIterator[TR, RR],
) -> Result[RdfOut, LexerError]? {
while !self.parser.is_end() {
if self.parser.parse_next() is Some(result) {
// 修复:将 TurtleError 转换为 String
return Some(
result.map_err(e => {
LexerError::SyntaxError("Syntax Error: \{e.to_string()}")
}),
)
}
if self.parser.lexer.extend_from_async_read(self.reader) is Err(e) {
return Some(
Err(LexerError::IoReadError("IO Read Error: \{e.to_string()}")),
)
}
}
None
}
///|
pub(all) struct SliceIterator[TR, RR] {
parser : Parser[TR, RR]
}