mf_expression/parser/
result.rs

1use crate::parser::{Node, ParserError};
2use nohash_hasher::BuildNoHashHasher;
3use std::collections::HashMap;
4
5/// 语法分析结果结构体
6/// 包含解析生成的AST根节点和相关元数据
7#[derive(Debug)]
8pub struct ParserResult<'a> {
9    pub root: &'a Node<'a>, // AST的根节点
10    pub is_complete: bool,  // 解析是否完整(是否处理了所有令牌)
11    pub metadata:
12        Option<HashMap<usize, NodeMetadata, BuildNoHashHasher<usize>>>, // 节点元数据映射
13}
14
15/// 节点元数据结构体
16/// 存储节点在源代码中的位置信息
17#[derive(Debug, Clone)]
18pub struct NodeMetadata {
19    pub span: (u32, u32), // 节点在源代码中的位置范围(开始位置,结束位置)
20}
21
22impl<'a> ParserResult<'a> {
23    /// 检查解析结果是否包含错误
24    /// 返回第一个遇到的错误,如果没有错误则返回Ok(())
25    pub fn error(&self) -> Result<(), ParserError> {
26        // 首先检查解析是否完整
27        if !self.is_complete {
28            return Err(ParserError::Incomplete);
29        }
30
31        // 检查AST中是否包含错误节点
32        match self.root.first_error() {
33            None => Ok(()),
34            Some(err) => Err(ParserError::NodeError(err.to_string())),
35        }
36    }
37}