oak_rust/parser/
mod.rs

1use crate::{RustLanguage, RustSyntaxKind};
2use oak_core::{
3    errors::OakDiagnostics, parser::{OperatorInfo, ParserState, PrattParser}, source::Source, tree::{Arc, GreenLeaf, GreenTree},
4    GreenNode,
5    IncrementalCache,
6    OakError,
7    Parser,
8};
9use std::sync::LazyLock;
10
11mod parse;
12
13/// A parser for the Rust programming language.
14///
15/// The `RustParser` is responsible for parsing Rust source code and building an Abstract Syntax Tree (AST).
16/// It uses a Pratt parser for handling operator precedence in expressions and supports all Rust syntax features.
17///
18/// # Examples
19///
20/// Basic usage:
21///
22/// ```
23/// use oak_core::Parser;
24/// use oak_rust::{RustLanguage, RustParser, SourceText};
25///
26/// let language = RustLanguage::default();
27/// let parser = RustParser::new(&language);
28/// let source = SourceText::new("fn main() { println!(\"Hello, world!\"); }");
29/// let result = parser.parse(source, 0);
30///
31/// // The result contains the parsed AST
32/// assert!(result.is_ok());
33/// ```
34///
35/// Parsing a more complex Rust structure:
36///
37/// ```
38/// use oak_core::Parser;
39/// use oak_rust::{RustLanguage, RustParser, SourceText};
40///
41/// let language = RustLanguage::default();
42/// let parser = RustParser::new(&language);
43///
44/// let source = SourceText::new(
45///     r#"
46/// struct Point {
47///     x: f64,
48///     y: f64,
49/// }
50///
51/// impl Point {
52///     fn new(x: f64, y: f64) -> Self {
53///         Point { x, y }
54///     }
55/// }
56/// "#,
57/// );
58/// let result = parser.parse(source, 0);
59///
60/// // Verify that parsing succeeded
61/// assert!(result.is_ok());
62/// ```
63#[derive(Clone)]
64pub struct RustParser<'config> {
65    /// Language configuration
66    config: &'config RustLanguage,
67}
68
69static RS_PRATT: LazyLock<PrattParser<RustLanguage>> = LazyLock::new(|| {
70    use RustSyntaxKind::*;
71    let mut pratt = PrattParser::<RustLanguage>::new();
72    // 赋值(右结合,最低优先级)
73    pratt
74        .infix(Eq, OperatorInfo::right(10), BinaryExpression)
75        .infix(PlusEq, OperatorInfo::right(10), BinaryExpression)
76        .infix(MinusEq, OperatorInfo::right(10), BinaryExpression)
77        .infix(StarEq, OperatorInfo::right(10), BinaryExpression)
78        .infix(SlashEq, OperatorInfo::right(10), BinaryExpression)
79        .infix(PercentEq, OperatorInfo::right(10), BinaryExpression)
80        .infix(CaretEq, OperatorInfo::right(10), BinaryExpression)
81        .infix(AndEq, OperatorInfo::right(10), BinaryExpression)
82        .infix(OrEq, OperatorInfo::right(10), BinaryExpression)
83        .infix(ShlEq, OperatorInfo::right(10), BinaryExpression)
84        .infix(ShrEq, OperatorInfo::right(10), BinaryExpression);
85
86    // 逻辑或/与
87    pratt.infix(OrOr, OperatorInfo::left(14), BinaryExpression).infix(AndAnd, OperatorInfo::left(15), BinaryExpression);
88
89    // 位运算:或、异或、与
90    pratt.infix(Or, OperatorInfo::left(20), BinaryExpression).infix(Caret, OperatorInfo::left(21), BinaryExpression).infix(
91        And,
92        OperatorInfo::left(22),
93        BinaryExpression,
94    );
95
96    // 比较(非结合)
97    pratt
98        .infix(EqEq, OperatorInfo::none(25), BinaryExpression)
99        .infix(Ne, OperatorInfo::none(25), BinaryExpression)
100        .infix(Lt, OperatorInfo::none(30), BinaryExpression)
101        .infix(Gt, OperatorInfo::none(30), BinaryExpression)
102        .infix(Le, OperatorInfo::none(30), BinaryExpression)
103        .infix(Ge, OperatorInfo::none(30), BinaryExpression);
104
105    // 位移
106    pratt.infix(Shl, OperatorInfo::left(35), BinaryExpression).infix(Shr, OperatorInfo::left(35), BinaryExpression);
107
108    // 加减
109    pratt.infix(Plus, OperatorInfo::left(40), BinaryExpression).infix(Minus, OperatorInfo::left(40), BinaryExpression);
110
111    // 乘除取余
112    pratt.infix(Star, OperatorInfo::left(50), BinaryExpression).infix(Slash, OperatorInfo::left(50), BinaryExpression).infix(
113        Percent,
114        OperatorInfo::left(50),
115        BinaryExpression,
116    );
117
118    // 前缀:逻辑非、正负、解引用、借用
119    pratt
120        .prefix(Not, OperatorInfo::right(60), UnaryExpression)
121        .prefix(Minus, OperatorInfo::right(60), UnaryExpression)
122        .prefix(Plus, OperatorInfo::right(60), UnaryExpression)
123        .prefix(Star, OperatorInfo::right(60), UnaryExpression)
124        .prefix(And, OperatorInfo::right(60), UnaryExpression);
125    pratt
126});
127
128impl<'config> RustParser<'config> {
129    /// Creates a new `RustParser` with the given language configuration.
130    ///
131    /// # Parameters
132    ///
133    /// * `config` - A reference to the `RustLanguage` configuration that controls
134    ///   language-specific parsing behavior.
135    ///
136    /// # Examples
137    ///
138    /// ```
139    /// use oak_rust::{RustLanguage, RustParser};
140    ///
141    /// let language = RustLanguage::default();
142    /// let parser = RustParser::new(&language);
143    /// ```
144    pub fn new(config: &'config RustLanguage) -> Self {
145        Self { config }
146    }
147
148    /// Returns a reference to the Pratt parser containing operator precedence rules.
149    ///
150    /// The Pratt parser defines the precedence and associativity of all Rust operators,
151    /// which is used to correctly parse expressions with multiple operators.
152    pub fn operator_rules(&self) -> &PrattParser<RustLanguage> {
153        &RS_PRATT
154    }
155}