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#[derive(Clone)]
64pub struct RustParser<'config> {
65 config: &'config RustLanguage,
67}
68
69static RS_PRATT: LazyLock<PrattParser<RustLanguage>> = LazyLock::new(|| {
70 use RustSyntaxKind::*;
71 let mut pratt = PrattParser::<RustLanguage>::new();
72 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 pratt.infix(OrOr, OperatorInfo::left(14), BinaryExpression).infix(AndAnd, OperatorInfo::left(15), BinaryExpression);
88
89 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 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 pratt.infix(Shl, OperatorInfo::left(35), BinaryExpression).infix(Shr, OperatorInfo::left(35), BinaryExpression);
107
108 pratt.infix(Plus, OperatorInfo::left(40), BinaryExpression).infix(Minus, OperatorInfo::left(40), BinaryExpression);
110
111 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 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 pub fn new(config: &'config RustLanguage) -> Self {
145 Self { config }
146 }
147
148 pub fn operator_rules(&self) -> &PrattParser<RustLanguage> {
153 &RS_PRATT
154 }
155}