1use rowan::{ast::{support, AstChildren, AstNode}, Language};
3
4macro_rules! decl_ast_node {
5 ($node:ident, $kind:ident $(, #[$meta:meta])?) => {
6 $(#[$meta])?
7 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
8 pub struct $node(SyntaxNode);
9 impl AstNode for $node {
10 type Language = Lang;
11
12 fn syntax(&self) -> &rowan::SyntaxNode<Self::Language> {
13 &self.0
14 }
15
16 fn can_cast(kind: <Self::Language as Language>::Kind) -> bool {
17 kind == SyntaxKind::$kind
18 }
19
20 fn cast(node: rowan::SyntaxNode<Self::Language>) -> Option<Self> {
21 if Self::can_cast(node.kind()) {
22 Some(Self(node))
23 } else {
24 None
25 }
26 }
27 }
28 impl core::fmt::Display for $node {
29 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
30 core::fmt::Display::fmt(self.syntax(), f)
31 }
32 }
33 };
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
37pub enum Lang {}
38impl Language for Lang {
39 type Kind = SyntaxKind;
40
41 fn kind_to_raw(kind: Self::Kind) -> ::rowan::SyntaxKind {
42 kind.into()
43 }
44
45 fn kind_from_raw(raw: ::rowan::SyntaxKind) -> Self::Kind {
46 raw.into()
47 }
48}
49
50pub type SyntaxNode = ::rowan::SyntaxNode<Lang>;
51pub type SyntaxToken = ::rowan::SyntaxToken<Lang>;
52
53::peg::parser!(pub grammar parser<'b>(state: &'b ::rowan_peg_utils::ParseState<'input>) for str {
54 use SyntaxKind::*;
55
56 rule comment() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(COMMENT)}) s:$(((()(g:({state.guard_none()})(";" (g:({state.guard_none()})((quiet!{[^::char_classes::any!(@"\n")]}/expected!("<^\\n>"))){g.accept_none()})*){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("comment"))
57 rule whitespace() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(WHITESPACE)}) s:$(((()(g:({state.guard_none()})((g:({state.guard_none()})((quiet!{[::char_classes::any!(@" \t\r\n")]}/expected!("< \\t\\r\\n>"))){g.accept_none()})*){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}))
58 pub rule trivia() = _
59 rule _() = (g:({state.guard(TRIVIA)}) ((()(g:({state.guard_none()})(whitespace() (g:({state.guard_none()})((()(g:({state.guard_none()})(comment() whitespace()){g.accept_none()}))){g.accept_none()})*){g.accept_none()}))) {g.accept()})
60 rule ident() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(IDENT)}) s:$(((()(g:({state.guard_none()})(!(g:({state.quiet().guard_none()}) (quiet!{(quiet!{[::char_classes::any!(@"0-9")]}/expected!("<0-9>"))}) {g.accept_none()}) (g:({state.guard_none()})((()(g:({state.guard_none()})((quiet!{[::char_classes::any!(@"0-9a-zA-Z_-")]}/expected!("<0-9a-zA-Z_->"))){g.accept_none()}) / ()(g:({state.guard_none()})((quiet!{[^::char_classes::any!(@"\u{00}-\u{a0}")]}/expected!("<^\\u{00}-\\u{a0}>"))){g.accept_none()}))){g.accept_none()})+){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("ident"))
61 rule number() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(NUMBER)}) s:$(((()(g:({state.guard_none()})((g:({state.guard_none()})((quiet!{[::char_classes::any!(@"0-9")]}/expected!("<0-9>"))){g.accept_none()})+){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("number"))
62 rule string() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(STRING)}) s:$(((()(g:({state.guard_none()})("\"" (g:({state.guard_none()})((quiet!{[^::char_classes::any!(@"\"\r\n")]}/expected!("<^\\\"\\r\\n>"))){g.accept_none()})* "\""){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("string"))
63 rule matches() = ()(()(g:({state.guard_none()})((g:({state.quiet().guard_token(MATCHES)}) s:$(((()(g:({state.guard_none()})("<" (g:({state.guard_none()})((quiet!{[^::char_classes::any!(@"\x3e\r\n")]}/expected!("<^\\x3e\\r\\n>"))){g.accept_none()})* ">"){g.accept_none()})))) {g.accept_token(s)})){g.accept_none()}) / expected!("matches"))
64 rule label() = (g:({state.guard(LABEL)}) ((()(g:({state.guard_none()})(ident()){g.accept_none()}) / ()(g:({state.guard_none()})(string()){g.accept_none()}))) {g.accept()})
65 rule repeat_rest() = (g:({state.guard(REPEAT_REST)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(STAR)}) s:$(("*")) {g.accept_token(s)}) (g:({state.guard_none()})((()(g:({state.guard_none()})(number()){g.accept_none()}))){g.accept_none()})?){g.accept_none()}))) {g.accept()})
66 rule repeat() = (g:({state.guard(REPEAT)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(PLUS)}) s:$(("+")) {g.accept_token(s)})){g.accept_none()}) / ()(g:({state.guard_none()})(number() (g:({state.guard_none()})((()(g:({state.guard_none()})(repeat_rest()){g.accept_none()}))){g.accept_none()})?){g.accept_none()}) / ()(g:({state.guard_none()})(repeat_rest()){g.accept_none()}))) {g.accept()})
67 rule pat_expect() = (g:({state.guard(PAT_EXPECT)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(AT)}) s:$(("@")) {g.accept_token(s)}) label()){g.accept_none()}))) {g.accept()})
68 rule pat_atom() = (g:({state.guard(PAT_ATOM)}) ((()(g:({state.guard_none()})(ident() !(g:({state.quiet().guard_none()}) (quiet!{(()(g:({state.guard_none()})(_() (g:({state.quiet().guard_token(EQ)}) s:$(("=")) {g.accept_token(s)})){g.accept_none()}))}) {g.accept_none()})){g.accept_none()}) / ()(g:({state.guard_none()})(string()){g.accept_none()}) / ()(g:({state.guard_none()})(matches()){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(L_BRACK)}) s:$(("[")) {g.accept_token(s)}) _() pat_choice() _() (g:({state.quiet().guard_token(R_BRACK)}) s:$(("]")) {g.accept_token(s)})){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(L_PAREN)}) s:$(("(")) {g.accept_token(s)}) _() pat_choice() _() (g:({state.quiet().guard_token(R_PAREN)}) s:$((")")) {g.accept_token(s)})){g.accept_none()}))) {g.accept()})
69 rule pat_op() = (g:({state.guard(PAT_OP)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(AMP)}) s:$(("&")) {g.accept_token(s)}) pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(BANG)}) s:$(("!")) {g.accept_token(s)}) pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(TILDE)}) s:$(("~")) {g.accept_token(s)}) pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})((g:({state.quiet().guard_token(DOLLAR)}) s:$(("$")) {g.accept_token(s)}) pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})(repeat() _() pat_atom()){g.accept_none()}) / ()(g:({state.guard_none()})(pat_atom()){g.accept_none()}))) {g.accept()})
70 rule pat_list() = (g:({state.guard(PAT_LIST)}) ((()(g:({state.guard_none()})(pat_op() (g:({state.guard_none()})((()(g:({state.guard_none()})(_() pat_op()){g.accept_none()}))){g.accept_none()})*){g.accept_none()}))) {g.accept()})
71 rule pat_choice() = (g:({state.guard(PAT_CHOICE)}) ((()(g:({state.guard_none()})(pat_list() (g:({state.guard_none()})((()(g:({state.guard_none()})(_() (g:({state.quiet().guard_token(SLASH)}) s:$(("/")) {g.accept_token(s)}) _() pat_list()){g.accept_none()}))){g.accept_none()})* (g:({state.guard_none()})((()(g:({state.guard_none()})(_() pat_expect()){g.accept_none()}))){g.accept_none()})?){g.accept_none()}))) {g.accept()})
72 rule named() = (g:({state.guard(NAMED)}) ((()(g:({state.guard_none()})(ident() _() (g:({state.quiet().guard_token(EQ)}) s:$(("=")) {g.accept_token(s)}) _()){g.accept_none()}))) {g.accept()})
73 rule decl() = (g:({state.guard(DECL)}) ((()(g:({state.guard_none()})(named() pat_choice()){g.accept_none()}))) {g.accept()})
74 rule export() = (g:({state.guard(EXPORT)}) ((()(g:({state.guard_none()})((g:({state.guard_none()})((()(g:({state.guard_none()})(named()){g.accept_none()}))){g.accept_none()})? ident()){g.accept_none()}))) {g.accept()})
75 rule export_list() = (g:({state.guard(EXPORT_LIST)}) ((()(g:({state.guard_none()})((g:({state.quiet().guard_token(EXPORTS_KW)}) s:$(("exports")) {g.accept_token(s)}) _() (g:({state.quiet().guard_token(L_BRACK)}) s:$(("[")) {g.accept_token(s)}) _() (g:({state.guard_none()})((()(g:({state.guard_none()})(export() _()){g.accept_none()}))){g.accept_none()})* (g:({state.quiet().guard_token(R_BRACK)}) s:$(("]")) {g.accept_token(s)})){g.accept_none()}))) {g.accept()})
76 pub rule decl_list() = (g:({state.guard(DECL_LIST)}) ((()(g:({state.guard_none()})(_() (g:({state.guard_none()})((()(g:({state.guard_none()})(export_list() _()){g.accept_none()}))){g.accept_none()})? (g:({state.guard_none()})((()(g:({state.guard_none()})(decl() _()){g.accept_none()}))){g.accept_none()})+){g.accept_none()}))) {g.accept()})
77});
78#[repr(u16)]
79#[allow(non_camel_case_types)]
80#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
81pub enum SyntaxKind {
82 COMMENT = 0,
83 WHITESPACE,
84 TRIVIA,
85 IDENT,
86 NUMBER,
87 STRING,
88 MATCHES,
89 LABEL,
90 REPEAT_REST,
91 STAR,
92 REPEAT,
93 PLUS,
94 PAT_EXPECT,
95 AT,
96 PAT_ATOM,
97 L_PAREN,
98 R_PAREN,
99 PAT_OP,
100 AMP,
101 BANG,
102 TILDE,
103 DOLLAR,
104 PAT_LIST,
105 PAT_CHOICE,
106 SLASH,
107 NAMED,
108 EQ,
109 DECL,
110 EXPORT,
111 EXPORT_LIST,
112 EXPORTS_KW,
113 L_BRACK,
114 R_BRACK,
115 DECL_LIST,
116}
117impl From<::rowan::SyntaxKind> for SyntaxKind { fn from(kind: ::rowan::SyntaxKind) -> Self { ::core::assert!(kind.0 <= Self::DECL_LIST as u16); unsafe { ::core::mem::transmute::<u16, SyntaxKind>(kind.0) } } }
118impl From<SyntaxKind> for ::rowan::SyntaxKind { fn from(kind: SyntaxKind) -> Self { ::rowan::SyntaxKind(kind as u16) } }
119decl_ast_node!(Trivia, TRIVIA, #[doc = "```abnf\n_ = whitespace *(comment whitespace)\n```"]);
120impl Trivia {
121 pub fn comment_tokens(&self) -> impl Iterator<Item = SyntaxToken> {
122 ::rowan_peg_utils::tokens(self.syntax(), SyntaxKind::COMMENT)
123 }
124 pub fn whitespace_tokens(&self) -> impl Iterator<Item = SyntaxToken> {
125 ::rowan_peg_utils::tokens(self.syntax(), SyntaxKind::WHITESPACE)
126 }
127}
128decl_ast_node!(Label, LABEL, #[doc = "```abnf\nlabel = ident / string\n```"]);
129impl Label {
130 pub fn ident(&self) -> Option<SyntaxToken> {
131 support::token(self.syntax(), SyntaxKind::IDENT)
132 }
133 pub fn string(&self) -> Option<SyntaxToken> {
134 support::token(self.syntax(), SyntaxKind::STRING)
135 }
136}
137decl_ast_node!(RepeatRest, REPEAT_REST, #[doc = "```abnf\nrepeat-rest = \"*\" [number]\n```"]);
138impl RepeatRest {
139 pub fn number(&self) -> Option<SyntaxToken> {
140 support::token(self.syntax(), SyntaxKind::NUMBER)
141 }
142 #[doc(alias = "*")]
144 pub fn star(&self) -> SyntaxToken {
145 support::token(self.syntax(), SyntaxKind::STAR).unwrap()
146 }
147}
148decl_ast_node!(Repeat, REPEAT, #[doc = "```abnf\nrepeat = \"+\"\n / number [repeat-rest]\n / repeat-rest\n```"]);
149impl Repeat {
150 pub fn number(&self) -> Option<SyntaxToken> {
151 support::token(self.syntax(), SyntaxKind::NUMBER)
152 }
153 #[doc(alias = "+")]
155 pub fn plus(&self) -> Option<SyntaxToken> {
156 support::token(self.syntax(), SyntaxKind::PLUS)
157 }
158 pub fn repeat_rest(&self) -> Option<RepeatRest> {
159 support::child(self.syntax())
160 }
161}
162decl_ast_node!(PatExpect, PAT_EXPECT, #[doc = "```abnf\npat-expect = \"@\" label\n```"]);
163impl PatExpect {
164 #[doc(alias = "@")]
166 pub fn at(&self) -> SyntaxToken {
167 support::token(self.syntax(), SyntaxKind::AT).unwrap()
168 }
169 pub fn label(&self) -> Label {
170 support::child(self.syntax()).unwrap()
171 }
172}
173decl_ast_node!(PatAtom, PAT_ATOM, #[doc = "```abnf\npat-atom = ident !(_ \"=\") ; a rule reference\n / string ; keyword\n / matches ; char classes\n / \"[\" _ pat-choice _ \"]\" ; optional\n / \"(\" _ pat-choice _ \")\"\n```"]);
174impl PatAtom {
175 pub fn ident(&self) -> Option<SyntaxToken> {
176 support::token(self.syntax(), SyntaxKind::IDENT)
177 }
178 #[doc(alias = "[")]
180 pub fn l_brack(&self) -> Option<SyntaxToken> {
181 support::token(self.syntax(), SyntaxKind::L_BRACK)
182 }
183 #[doc(alias = "(")]
185 pub fn l_paren(&self) -> Option<SyntaxToken> {
186 support::token(self.syntax(), SyntaxKind::L_PAREN)
187 }
188 pub fn matches(&self) -> Option<SyntaxToken> {
189 support::token(self.syntax(), SyntaxKind::MATCHES)
190 }
191 pub fn pat_choice(&self) -> Option<PatChoice> {
192 support::child(self.syntax())
193 }
194 #[doc(alias = "]")]
196 pub fn r_brack(&self) -> Option<SyntaxToken> {
197 support::token(self.syntax(), SyntaxKind::R_BRACK)
198 }
199 #[doc(alias = ")")]
201 pub fn r_paren(&self) -> Option<SyntaxToken> {
202 support::token(self.syntax(), SyntaxKind::R_PAREN)
203 }
204 pub fn string(&self) -> Option<SyntaxToken> {
205 support::token(self.syntax(), SyntaxKind::STRING)
206 }
207 pub fn trivias(&self) -> AstChildren<Trivia> {
208 support::children(self.syntax())
209 }
210}
211decl_ast_node!(PatOp, PAT_OP, #[doc = "```abnf\npat-op = \"&\" pat-atom ; positive lookahead\n / \"!\" pat-atom ; negative lookahead\n / \"~\" pat-atom ; quiet\n / \"$\" pat-atom ; slice\n / repeat _ pat-atom\n / pat-atom\n```"]);
212impl PatOp {
213 #[doc(alias = "&")]
215 pub fn amp(&self) -> Option<SyntaxToken> {
216 support::token(self.syntax(), SyntaxKind::AMP)
217 }
218 #[doc(alias = "!")]
220 pub fn bang(&self) -> Option<SyntaxToken> {
221 support::token(self.syntax(), SyntaxKind::BANG)
222 }
223 #[doc(alias = "$")]
225 pub fn dollar(&self) -> Option<SyntaxToken> {
226 support::token(self.syntax(), SyntaxKind::DOLLAR)
227 }
228 pub fn pat_atom(&self) -> PatAtom {
229 support::child(self.syntax()).unwrap()
230 }
231 pub fn repeat(&self) -> Option<Repeat> {
232 support::child(self.syntax())
233 }
234 #[doc(alias = "~")]
236 pub fn tilde(&self) -> Option<SyntaxToken> {
237 support::token(self.syntax(), SyntaxKind::TILDE)
238 }
239 pub fn trivia(&self) -> Option<Trivia> {
240 support::child(self.syntax())
241 }
242}
243decl_ast_node!(PatList, PAT_LIST, #[doc = "```abnf\npat-list = pat-op *(_ pat-op)\n```"]);
244impl PatList {
245 pub fn pat_ops(&self) -> AstChildren<PatOp> {
246 support::children(self.syntax())
247 }
248 pub fn trivias(&self) -> AstChildren<Trivia> {
249 support::children(self.syntax())
250 }
251}
252decl_ast_node!(PatChoice, PAT_CHOICE, #[doc = "```abnf\npat-choice = pat-list *(_ \"/\" _ pat-list)\n [_ pat-expect]\n```"]);
253impl PatChoice {
254 pub fn pat_expect(&self) -> Option<PatExpect> {
255 support::child(self.syntax())
256 }
257 pub fn pat_lists(&self) -> AstChildren<PatList> {
258 support::children(self.syntax())
259 }
260 #[doc(alias = "/")]
262 pub fn slash_tokens(&self) -> impl Iterator<Item = SyntaxToken> {
263 ::rowan_peg_utils::tokens(self.syntax(), SyntaxKind::SLASH)
264 }
265 pub fn trivias(&self) -> AstChildren<Trivia> {
266 support::children(self.syntax())
267 }
268}
269decl_ast_node!(Named, NAMED, #[doc = "```abnf\nnamed = ident _ \"=\" _\n```"]);
270impl Named {
271 #[doc(alias = "=")]
273 pub fn eq(&self) -> SyntaxToken {
274 support::token(self.syntax(), SyntaxKind::EQ).unwrap()
275 }
276 pub fn ident(&self) -> SyntaxToken {
277 support::token(self.syntax(), SyntaxKind::IDENT).unwrap()
278 }
279 pub fn trivias(&self) -> AstChildren<Trivia> {
280 support::children(self.syntax())
281 }
282}
283decl_ast_node!(Decl, DECL, #[doc = "```abnf\ndecl = named pat-choice\n```"]);
284impl Decl {
285 pub fn named(&self) -> Named {
286 support::child(self.syntax()).unwrap()
287 }
288 pub fn pat_choice(&self) -> PatChoice {
289 support::child(self.syntax()).unwrap()
290 }
291}
292decl_ast_node!(Export, EXPORT, #[doc = "```abnf\nexport = [named] ident\n```"]);
293impl Export {
294 pub fn ident(&self) -> SyntaxToken {
295 support::token(self.syntax(), SyntaxKind::IDENT).unwrap()
296 }
297 pub fn named(&self) -> Option<Named> {
298 support::child(self.syntax())
299 }
300}
301decl_ast_node!(ExportList, EXPORT_LIST, #[doc = "```abnf\nexport-list = \"exports\" _ \"[\" _ *(export _) \"]\"\n```"]);
302impl ExportList {
303 pub fn exports(&self) -> AstChildren<Export> {
304 support::children(self.syntax())
305 }
306 pub fn exports_kw(&self) -> SyntaxToken {
307 support::token(self.syntax(), SyntaxKind::EXPORTS_KW).unwrap()
308 }
309 #[doc(alias = "[")]
311 pub fn l_brack(&self) -> SyntaxToken {
312 support::token(self.syntax(), SyntaxKind::L_BRACK).unwrap()
313 }
314 #[doc(alias = "]")]
316 pub fn r_brack(&self) -> SyntaxToken {
317 support::token(self.syntax(), SyntaxKind::R_BRACK).unwrap()
318 }
319 pub fn trivias(&self) -> AstChildren<Trivia> {
320 support::children(self.syntax())
321 }
322}
323decl_ast_node!(DeclList, DECL_LIST, #[doc = "```abnf\ndecl-list = _ [export-list _] +(decl _)\n```"]);
324impl DeclList {
325 pub fn decls(&self) -> AstChildren<Decl> {
326 support::children(self.syntax())
327 }
328 pub fn export_list(&self) -> Option<ExportList> {
329 support::child(self.syntax())
330 }
331 pub fn trivias(&self) -> AstChildren<Trivia> {
332 support::children(self.syntax())
333 }
334}
335