1#![allow(dead_code)]
2#![cfg_attr(rustfmt, rustfmt_skip)]
3use crate::core::{RuleValue, Param, Hook, LangBuilder};
23use crate::core::rule::{parse_rule, parse_rule_value};
24use crate::core::param::parse_param;
25use crate::core::hook::parse_hook;
26use crate::core::token::{parse_token_def, parse_token_ignore_rule, parse_token_rule};
27use crate::core::{parse_context, parse_semantic, parse_include};
28
29crate::sdk!(
31 context: LangBuilder;
32 target: TopLevelStatement;
33 tokens: [
34 TKeyword,
35 TIdentifier,
36 TRegExp,
37 TLiteral,
38 TSymbol,
39 TComment,
40 ];
41 rules: [
42 lex::Rule::Regex(Regex::new(r"^\s+").unwrap(),lex::Target::Ignore),
43 lex::Rule::Regex(Regex::new(r"^//[^\n]*\n?").unwrap(), lex::Target::Extract(Tok::TComment)),
44 lex::Rule::Regex(Regex::new(r"^/\*([^\*]|(\*[^/]))*\*/").unwrap(), lex::Target::Extract(Tok::TComment)),
45 lex::Rule::Regex(Regex::new(r#"^"((\\.)|[^\\"])*""#).unwrap(), lex::Target::Keep(Tok::TLiteral)),
46 lex::Rule::Regex(Regex::new(r"^/((\\.)|[^\\/])*/").unwrap(), lex::Target::Keep(Tok::TRegExp)),
47 lex::Rule::Literal("ignore".to_owned(), lex::Target::Keep(Tok::TKeyword)),
48 lex::Rule::Literal("extract".to_owned(), lex::Target::Keep(Tok::TKeyword)),
49 lex::Rule::Literal("token".to_owned(), lex::Target::Keep(Tok::TKeyword)),
50 lex::Rule::Literal("semantic".to_owned(), lex::Target::Keep(Tok::TKeyword)),
51 lex::Rule::Literal("rule".to_owned(), lex::Target::Keep(Tok::TKeyword)),
52 lex::Rule::Literal("optional".to_owned(), lex::Target::Keep(Tok::TKeyword)),
53 lex::Rule::Literal("context".to_owned(), lex::Target::Keep(Tok::TKeyword)),
54 lex::Rule::Regex(Regex::new(r"^[{};|()=,:\.\[\]\+]").unwrap(), lex::Target::Keep(Tok::TSymbol)),
55 lex::Rule::Regex(Regex::new(r"^[_a-zA-Z]\w*").unwrap(), lex::Target::Keep(Tok::TIdentifier)),
56 ];
57 semantics: [
58 SVariable,
59 SToken,
60 SSemantic,
61 SRule,
62 SHookName,
63 SHookType,
64 SContextType,
65 ];
66);
67pub mod ast {
68 use super::*;
69 #[derive(Debug)] pub struct DefineContextStatement {
70 pub m_0: Token,
71 pub m_context_type: Token,
72 }
73 #[derive(Debug)] pub struct DefineIgnoreTokenRuleStatement {
74 pub m_0: Token,
75 pub m_value: Box<LiteralOrRegExp>,
76 }
77 #[derive(Debug)] pub struct DefineIncludeStatement {
78 pub m_path: Token,
79 }
80 #[derive(Debug)] pub struct DefineRuleStatement {
81 pub m_0: Token,
82 pub m_hook_attr: Option<Box<HookAttribute>>,
83 pub m_rule_name: Token,
84 pub m_body: Box<RuleDefineBody>,
85 }
86 #[derive(Debug)] pub struct DefineSemanticStatement {
87 pub m_0: Token,
88 pub m_id: Token,
89 }
90 #[derive(Debug)] pub struct DefineTokenRuleStatement {
91 pub m_token_type: Token,
92 pub m_value: Box<LiteralOrRegExp>,
93 }
94 #[derive(Debug)] pub struct DefineTokenTypeStatement {
95 pub m_kw_extract: Option<Token>,
96 pub m_1: Token,
97 pub m_token_type: Token,
98 }
99 #[derive(Debug)] pub struct FunctionalRuleBody {
100 pub m_0: Token,
101 pub m_first_param: Option<Box<Parameter>>,
102 pub m_rest_params: Vec<ParamListTail>,
103 pub m_3: Token,
104 }
105 #[derive(Debug)] pub struct HookAttribute {
106 pub m_0: Token,
107 pub m_hook_name: Token,
108 pub m_2: Token,
109 pub m_hook_type: Token,
110 pub m_4: Token,
111 }
112 #[derive(Debug)] pub enum LiteralOrRegExp {
113 TokenLiteral(Box<TokenLiteral>),
114 TokenRegExp(Box<TokenRegExp>),
115 }
116 #[derive(Debug)] pub struct ParamListTail {
117 pub m_0: Token,
118 pub m_p: Box<Parameter>,
119 }
120 #[derive(Debug)] pub struct ParamSemantic {
121 pub m_0: Token,
122 pub m_semantic_name: Option<Token>,
123 pub m_2: Token,
124 }
125 #[derive(Debug)] pub struct Parameter {
126 pub m_sem_attr: Option<Box<ParamSemantic>>,
127 pub m_variable: Token,
128 pub m_2: Token,
129 pub m_type: Option<Box<RuleType>>,
130 }
131 #[derive(Debug)] pub enum RuleDefineBody {
132 UnionRuleBody(Box<UnionRuleBody>),
133 FunctionalRuleBody(Box<FunctionalRuleBody>),
134 }
135 #[derive(Debug)] pub struct RuleType {
136 pub m_kw_optional: Option<Token>,
137 pub m_kw_token: Option<Token>,
138 pub m_id: Token,
139 pub m_token_content: Option<Token>,
140 pub m_is_list: Option<Token>,
141 }
142 #[derive(Debug)] pub struct TokenLiteral {
143 pub m_t: Token,
144 }
145 #[derive(Debug)] pub struct TokenRegExp {
146 pub m_t: Token,
147 }
148 #[derive(Debug)] pub enum TopLevelDefine {
149 DefineIncludeStatement(Box<DefineIncludeStatement>),
150 DefineContextStatement(Box<DefineContextStatement>),
151 DefineRuleStatement(Box<DefineRuleStatement>),
152 DefineTokenTypeStatement(Box<DefineTokenTypeStatement>),
153 DefineIgnoreTokenRuleStatement(Box<DefineIgnoreTokenRuleStatement>),
154 DefineTokenRuleStatement(Box<DefineTokenRuleStatement>),
155 DefineSemanticStatement(Box<DefineSemanticStatement>),
156 }
157 #[derive(Debug)] pub struct TopLevelStatement {
158 pub m_body: Box<TopLevelDefine>,
159 pub m_1: Token,
160 }
161 #[derive(Debug)] pub struct UnionRuleBody {
162 pub m_0: Token,
163 pub m_first: Option<Token>,
164 pub m_rest: Vec<UnionRuleListTail>,
165 }
166 #[derive(Debug)] pub struct UnionRuleListTail {
167 pub m_0: Token,
168 pub m_r: Token,
169 }
170}
171pub mod pt {
172 use super::*;
173 #[derive(Debug)] pub struct DefineContextStatement<'p> {
174 pub ast: &'p ast::DefineContextStatement,
175 pub m_context_type: String,
176 }
177 #[derive(Debug)] pub struct DefineIgnoreTokenRuleStatement<'p> {
178 pub ast: &'p ast::DefineIgnoreTokenRuleStatement,
179 pub m_value: Box<pt::LiteralOrRegExp<'p>>,
180 }
181 #[derive(Debug)] pub struct DefineIncludeStatement<'p> {
182 pub ast: &'p ast::DefineIncludeStatement,
183 pub m_path: String,
184 }
185 #[derive(Debug)] pub struct DefineRuleStatement<'p> {
186 pub ast: &'p ast::DefineRuleStatement,
187 pub m_hook_attr: Option<Box<ParseHook<Hook, pt::HookAttribute<'p>>>>,
188 pub m_rule_name: String,
189 pub m_body: Box<ParseHook<RuleValue, pt::RuleDefineBody<'p>>>,
190 }
191 #[derive(Debug)] pub struct DefineSemanticStatement<'p> {
192 pub ast: &'p ast::DefineSemanticStatement,
193 pub m_id: String,
194 }
195 #[derive(Debug)] pub struct DefineTokenRuleStatement<'p> {
196 pub ast: &'p ast::DefineTokenRuleStatement,
197 pub m_token_type: String,
198 pub m_value: Box<pt::LiteralOrRegExp<'p>>,
199 }
200 #[derive(Debug)] pub struct DefineTokenTypeStatement<'p> {
201 pub ast: &'p ast::DefineTokenTypeStatement,
202 pub m_kw_extract: bool,
203 pub m_token_type: String,
204 }
205 #[derive(Debug)] pub struct FunctionalRuleBody<'p> {
206 pub ast: &'p ast::FunctionalRuleBody,
207 pub m_first_param: Option<Box<ParseHook<Param, pt::Parameter<'p>>>>,
208 pub m_rest_params: Vec<pt::ParamListTail<'p>>,
209 }
210 #[derive(Debug)] pub struct HookAttribute<'p> {
211 pub ast: &'p ast::HookAttribute,
212 pub m_hook_name: String,
213 pub m_hook_type: String,
214 }
215 #[derive(Debug)] pub enum LiteralOrRegExp<'p> {
216 TokenLiteral(Box<pt::TokenLiteral<'p>>),
217 TokenRegExp(Box<pt::TokenRegExp<'p>>),
218 }
219 #[derive(Debug)] pub struct ParamListTail<'p> {
220 pub ast: &'p ast::ParamListTail,
221 pub m_p: Box<ParseHook<Param, pt::Parameter<'p>>>,
222 }
223 #[derive(Debug)] pub struct ParamSemantic<'p> {
224 pub ast: &'p ast::ParamSemantic,
225 pub m_semantic_name: Option<String>,
226 }
227 #[derive(Debug)] pub struct Parameter<'p> {
228 pub ast: &'p ast::Parameter,
229 pub m_sem_attr: Option<Box<pt::ParamSemantic<'p>>>,
230 pub m_variable: String,
231 pub m_type: Option<Box<pt::RuleType<'p>>>,
232 }
233 #[derive(Debug)] pub enum RuleDefineBody<'p> {
234 UnionRuleBody(Box<pt::UnionRuleBody<'p>>),
235 FunctionalRuleBody(Box<pt::FunctionalRuleBody<'p>>),
236 }
237 #[derive(Debug)] pub struct RuleType<'p> {
238 pub ast: &'p ast::RuleType,
239 pub m_kw_optional: bool,
240 pub m_kw_token: bool,
241 pub m_id: String,
242 pub m_token_content: Option<String>,
243 pub m_is_list: bool,
244 }
245 #[derive(Debug)] pub struct TokenLiteral<'p> {
246 pub ast: &'p ast::TokenLiteral,
247 pub m_t: String,
248 }
249 #[derive(Debug)] pub struct TokenRegExp<'p> {
250 pub ast: &'p ast::TokenRegExp,
251 pub m_t: String,
252 }
253 #[derive(Debug)] pub enum TopLevelDefine<'p> {
254 DefineIncludeStatement(Box<ParseHook<(), pt::DefineIncludeStatement<'p>>>),
255 DefineContextStatement(Box<ParseHook<(), pt::DefineContextStatement<'p>>>),
256 DefineRuleStatement(Box<ParseHook<(), pt::DefineRuleStatement<'p>>>),
257 DefineTokenTypeStatement(Box<ParseHook<(), pt::DefineTokenTypeStatement<'p>>>),
258 DefineIgnoreTokenRuleStatement(Box<ParseHook<(), pt::DefineIgnoreTokenRuleStatement<'p>>>),
259 DefineTokenRuleStatement(Box<ParseHook<(), pt::DefineTokenRuleStatement<'p>>>),
260 DefineSemanticStatement(Box<ParseHook<(), pt::DefineSemanticStatement<'p>>>),
261 }
262 #[derive(Debug)] pub struct TopLevelStatement<'p> {
263 pub ast: &'p ast::TopLevelStatement,
264 pub m_body: Box<pt::TopLevelDefine<'p>>,
265 }
266 #[derive(Debug)] pub struct UnionRuleBody<'p> {
267 pub ast: &'p ast::UnionRuleBody,
268 pub m_first: Option<String>,
269 pub m_rest: Vec<pt::UnionRuleListTail<'p>>,
270 }
271 #[derive(Debug)] pub struct UnionRuleListTail<'p> {
272 pub ast: &'p ast::UnionRuleListTail,
273 pub m_r: String,
274 }
275}
276impl ast::DefineContextStatement {
277 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
278 Some(Self {
279 m_0: required!(ts, token!(TKeyword::"context"(ts)))?,
280 m_context_type: required!(ts, token!(TLiteral::parse(ts)))?,
281 })
282 }
283 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
284 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
285 si.set(&self.m_context_type, _ovr.as_ref().cloned().unwrap_or(Tok::SContextType));
286 }
287}
288impl<'p> pt::DefineContextStatement<'p> {
289 fn from_ast_internal(ast: &'p ast::DefineContextStatement, _ctx: &mut Ctx) -> Self {
290 Self {
291 ast,
292 m_context_type: ast.m_context_type.value.clone(),
293 }
294 }
295 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::DefineContextStatement, ctx: &mut Ctx) -> ParseHook<(), pt::DefineContextStatement<'p>> {
296 let mut pt = Self::from_ast_internal(ast, ctx);
297 ParseHook { val: parse_context(&mut pt, ctx), pt }
298 }
299}
300impl ast::DefineIgnoreTokenRuleStatement {
301 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
302 Some(Self {
303 m_0: required!(ts, token!(TKeyword::"ignore"(ts)))?,
304 m_value: Box::new(required!(ts, ast::LiteralOrRegExp::parse(ts))?),
305 })
306 }
307 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
308 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
309 self.m_value.apply_semantic(si, _ovr);
310 }
311}
312impl<'p> pt::DefineIgnoreTokenRuleStatement<'p> {
313 fn from_ast_internal(ast: &'p ast::DefineIgnoreTokenRuleStatement, _ctx: &mut Ctx) -> Self {
314 Self {
315 ast,
316 m_value: Box::new(pt::LiteralOrRegExp::from_ast(ast.m_value.as_ref(), _ctx)),
317 }
318 }
319 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::DefineIgnoreTokenRuleStatement, ctx: &mut Ctx) -> ParseHook<(), pt::DefineIgnoreTokenRuleStatement<'p>> {
320 let mut pt = Self::from_ast_internal(ast, ctx);
321 ParseHook { val: parse_token_ignore_rule(&mut pt, ctx), pt }
322 }
323}
324impl ast::DefineIncludeStatement {
325 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
326 Some(Self {
327 m_path: required!(ts, token!(TLiteral::parse(ts)))?,
328 })
329 }
330 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
331 if let Some(o) = _ovr { si.set(&self.m_path, o.clone()); }
332 }
333}
334impl<'p> pt::DefineIncludeStatement<'p> {
335 fn from_ast_internal(ast: &'p ast::DefineIncludeStatement, _ctx: &mut Ctx) -> Self {
336 Self {
337 ast,
338 m_path: ast.m_path.value.clone(),
339 }
340 }
341 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::DefineIncludeStatement, ctx: &mut Ctx) -> ParseHook<(), pt::DefineIncludeStatement<'p>> {
342 let mut pt = Self::from_ast_internal(ast, ctx);
343 ParseHook { val: parse_include(&mut pt, ctx), pt }
344 }
345}
346impl ast::DefineRuleStatement {
347 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
348 Some(Self {
349 m_0: required!(ts, token!(TKeyword::"rule"(ts)))?,
350 m_hook_attr: (optional!(ts, ast::HookAttribute::parse(ts))).map(Box::new),
351 m_rule_name: required!(ts, token!(TIdentifier::parse(ts)))?,
352 m_body: Box::new(required!(ts, ast::RuleDefineBody::parse(ts))?),
353 })
354 }
355 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
356 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
357 if let Some(m) = &self.m_hook_attr { m.apply_semantic(si, _ovr); }
358 si.set(&self.m_rule_name, _ovr.as_ref().cloned().unwrap_or(Tok::SRule));
359 self.m_body.apply_semantic(si, _ovr);
360 }
361}
362impl<'p> pt::DefineRuleStatement<'p> {
363 fn from_ast_internal(ast: &'p ast::DefineRuleStatement, _ctx: &mut Ctx) -> Self {
364 Self {
365 ast,
366 m_hook_attr: ast.m_hook_attr.as_ref().map(|x| Box::new(pt::HookAttribute::from_ast(x, _ctx))),
367 m_rule_name: ast.m_rule_name.value.clone(),
368 m_body: Box::new(pt::RuleDefineBody::from_ast(ast.m_body.as_ref(), _ctx)),
369 }
370 }
371 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::DefineRuleStatement, ctx: &mut Ctx) -> ParseHook<(), pt::DefineRuleStatement<'p>> {
372 let mut pt = Self::from_ast_internal(ast, ctx);
373 ParseHook { val: parse_rule(&mut pt, ctx), pt }
374 }
375}
376impl ast::DefineSemanticStatement {
377 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
378 Some(Self {
379 m_0: required!(ts, token!(TKeyword::"semantic"(ts)))?,
380 m_id: required!(ts, token!(TIdentifier::parse(ts)))?,
381 })
382 }
383 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
384 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
385 si.set(&self.m_id, _ovr.as_ref().cloned().unwrap_or(Tok::SSemantic));
386 }
387}
388impl<'p> pt::DefineSemanticStatement<'p> {
389 fn from_ast_internal(ast: &'p ast::DefineSemanticStatement, _ctx: &mut Ctx) -> Self {
390 Self {
391 ast,
392 m_id: ast.m_id.value.clone(),
393 }
394 }
395 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::DefineSemanticStatement, ctx: &mut Ctx) -> ParseHook<(), pt::DefineSemanticStatement<'p>> {
396 let mut pt = Self::from_ast_internal(ast, ctx);
397 ParseHook { val: parse_semantic(&mut pt, ctx), pt }
398 }
399}
400impl ast::DefineTokenRuleStatement {
401 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
402 Some(Self {
403 m_token_type: required!(ts, token!(TIdentifier::parse(ts)))?,
404 m_value: Box::new(required!(ts, ast::LiteralOrRegExp::parse(ts))?),
405 })
406 }
407 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
408 si.set(&self.m_token_type, _ovr.as_ref().cloned().unwrap_or(Tok::SToken));
409 self.m_value.apply_semantic(si, _ovr);
410 }
411}
412impl<'p> pt::DefineTokenRuleStatement<'p> {
413 fn from_ast_internal(ast: &'p ast::DefineTokenRuleStatement, _ctx: &mut Ctx) -> Self {
414 Self {
415 ast,
416 m_token_type: ast.m_token_type.value.clone(),
417 m_value: Box::new(pt::LiteralOrRegExp::from_ast(ast.m_value.as_ref(), _ctx)),
418 }
419 }
420 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::DefineTokenRuleStatement, ctx: &mut Ctx) -> ParseHook<(), pt::DefineTokenRuleStatement<'p>> {
421 let mut pt = Self::from_ast_internal(ast, ctx);
422 ParseHook { val: parse_token_rule(&mut pt, ctx), pt }
423 }
424}
425impl ast::DefineTokenTypeStatement {
426 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
427 Some(Self {
428 m_kw_extract: optional!(ts, token!(TKeyword::"extract"(ts))),
429 m_1: required!(ts, token!(TKeyword::"token"(ts)))?,
430 m_token_type: required!(ts, token!(TIdentifier::parse(ts)))?,
431 })
432 }
433 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
434 if let Some(o) = _ovr { if let Some(m) = &self.m_kw_extract { si.set(m, o.clone()); } }
435 if let Some(o) = _ovr { si.set(&self.m_1, o.clone()); }
436 si.set(&self.m_token_type, _ovr.as_ref().cloned().unwrap_or(Tok::SToken));
437 }
438}
439impl<'p> pt::DefineTokenTypeStatement<'p> {
440 fn from_ast_internal(ast: &'p ast::DefineTokenTypeStatement, _ctx: &mut Ctx) -> Self {
441 Self {
442 ast,
443 m_kw_extract: ast.m_kw_extract.is_some(),
444 m_token_type: ast.m_token_type.value.clone(),
445 }
446 }
447 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::DefineTokenTypeStatement, ctx: &mut Ctx) -> ParseHook<(), pt::DefineTokenTypeStatement<'p>> {
448 let mut pt = Self::from_ast_internal(ast, ctx);
449 ParseHook { val: parse_token_def(&mut pt, ctx), pt }
450 }
451}
452impl ast::FunctionalRuleBody {
453 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
454 Some(Self {
455 m_0: required!(ts, token!(TSymbol::"("(ts)))?,
456 m_first_param: (optional!(ts, ast::Parameter::parse(ts))).map(Box::new),
457 m_rest_params: { let mut v = vec![]; list!(ts, v, ast::ParamListTail::parse(ts)) },
458 m_3: required!(ts, token!(TSymbol::")"(ts)))?,
459 })
460 }
461 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
462 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
463 if let Some(m) = &self.m_first_param { m.apply_semantic(si, _ovr); }
464 for m in &self.m_rest_params { m.apply_semantic(si, _ovr); }
465 if let Some(o) = _ovr { si.set(&self.m_3, o.clone()); }
466 }
467}
468impl<'p> pt::FunctionalRuleBody<'p> {
469 fn from_ast(ast: &'p ast::FunctionalRuleBody, _ctx: &mut Ctx) -> Self {
470 Self {
471 ast,
472 m_first_param: ast.m_first_param.as_ref().map(|x| Box::new(pt::Parameter::from_ast(x, _ctx))),
473 m_rest_params: ast.m_rest_params.iter().map(|x| pt::ParamListTail::from_ast(x, _ctx)).collect::<Vec<_>>(),
474 }
475 }
476}
477impl ast::HookAttribute {
478 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
479 Some(Self {
480 m_0: required!(ts, token!(TSymbol::"("(ts)))?,
481 m_hook_name: required!(ts, token!(TLiteral::parse(ts)))?,
482 m_2: required!(ts, token!(TSymbol::":"(ts)))?,
483 m_hook_type: required!(ts, token!(TLiteral::parse(ts)))?,
484 m_4: required!(ts, token!(TSymbol::")"(ts)))?,
485 })
486 }
487 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
488 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
489 si.set(&self.m_hook_name, _ovr.as_ref().cloned().unwrap_or(Tok::SHookName));
490 if let Some(o) = _ovr { si.set(&self.m_2, o.clone()); }
491 si.set(&self.m_hook_type, _ovr.as_ref().cloned().unwrap_or(Tok::SHookType));
492 if let Some(o) = _ovr { si.set(&self.m_4, o.clone()); }
493 }
494}
495impl<'p> pt::HookAttribute<'p> {
496 fn from_ast_internal(ast: &'p ast::HookAttribute, _ctx: &mut Ctx) -> Self {
497 Self {
498 ast,
499 m_hook_name: ast.m_hook_name.value.clone(),
500 m_hook_type: ast.m_hook_type.value.clone(),
501 }
502 }
503 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::HookAttribute, ctx: &mut Ctx) -> ParseHook<Hook, pt::HookAttribute<'p>> {
504 let mut pt = Self::from_ast_internal(ast, ctx);
505 ParseHook { val: parse_hook(&mut pt, ctx), pt }
506 }
507}
508crate::impl_union!(from_ast, LiteralOrRegExp, {
509 TokenLiteral,
510 TokenRegExp,
511});
512impl ast::ParamListTail {
513 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
514 Some(Self {
515 m_0: required!(ts, token!(TSymbol::","(ts)))?,
516 m_p: Box::new(required!(ts, ast::Parameter::parse(ts))?),
517 })
518 }
519 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
520 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
521 self.m_p.apply_semantic(si, _ovr);
522 }
523}
524impl<'p> pt::ParamListTail<'p> {
525 fn from_ast(ast: &'p ast::ParamListTail, _ctx: &mut Ctx) -> Self {
526 Self {
527 ast,
528 m_p: Box::new(pt::Parameter::from_ast(ast.m_p.as_ref(), _ctx)),
529 }
530 }
531}
532impl ast::ParamSemantic {
533 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
534 Some(Self {
535 m_0: required!(ts, token!(TSymbol::"("(ts)))?,
536 m_semantic_name: optional!(ts, token!(TIdentifier::parse(ts))),
537 m_2: required!(ts, token!(TSymbol::")"(ts)))?,
538 })
539 }
540 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
541 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
542 if let Some(m) = &self.m_semantic_name { si.set(m, _ovr.as_ref().cloned().unwrap_or(Tok::SSemantic)); }
543 if let Some(o) = _ovr { si.set(&self.m_2, o.clone()); }
544 }
545}
546impl<'p> pt::ParamSemantic<'p> {
547 fn from_ast(ast: &'p ast::ParamSemantic, _ctx: &mut Ctx) -> Self {
548 Self {
549 ast,
550 m_semantic_name: ast.m_semantic_name.as_ref().map(|t| t.value.clone()),
551 }
552 }
553}
554impl ast::Parameter {
555 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
556 Some(Self {
557 m_sem_attr: (optional!(ts, ast::ParamSemantic::parse(ts))).map(Box::new),
558 m_variable: required!(ts, token!(TIdentifier::parse(ts)))?,
559 m_2: required!(ts, token!(TSymbol::":"(ts)))?,
560 m_type: (optional!(ts, ast::RuleType::parse(ts))).map(Box::new),
561 })
562 }
563 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
564 if let Some(m) = &self.m_sem_attr { m.apply_semantic(si, _ovr); }
565 si.set(&self.m_variable, _ovr.as_ref().cloned().unwrap_or(Tok::SVariable));
566 if let Some(o) = _ovr { si.set(&self.m_2, o.clone()); }
567 if let Some(m) = &self.m_type { m.apply_semantic(si, _ovr); }
568 }
569}
570impl<'p> pt::Parameter<'p> {
571 fn from_ast_internal(ast: &'p ast::Parameter, _ctx: &mut Ctx) -> Self {
572 Self {
573 ast,
574 m_sem_attr: ast.m_sem_attr.as_ref().map(|x| Box::new(pt::ParamSemantic::from_ast(x, _ctx))),
575 m_variable: ast.m_variable.value.clone(),
576 m_type: ast.m_type.as_ref().map(|x| Box::new(pt::RuleType::from_ast(x, _ctx))),
577 }
578 }
579 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::Parameter, ctx: &mut Ctx) -> ParseHook<Param, pt::Parameter<'p>> {
580 let mut pt = Self::from_ast_internal(ast, ctx);
581 ParseHook { val: parse_param(&mut pt, ctx), pt }
582 }
583}
584crate::impl_union!(from_ast_internal, RuleDefineBody, {
585 UnionRuleBody,
586 FunctionalRuleBody,
587});
588impl<'p> pt::RuleDefineBody<'p> {
589 #[inline] #[allow(clippy::unnecessary_mut_passed)] fn from_ast(ast: &'p ast::RuleDefineBody, ctx: &mut Ctx) -> ParseHook<RuleValue, pt::RuleDefineBody<'p>> {
590 let mut pt = Self::from_ast_internal(ast, ctx);
591 ParseHook { val: parse_rule_value(&mut pt, ctx), pt }
592 }
593}
594impl ast::RuleType {
595 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
596 Some(Self {
597 m_kw_optional: optional!(ts, token!(TKeyword::"optional"(ts))),
598 m_kw_token: optional!(ts, token!(TKeyword::"token"(ts))),
599 m_id: required!(ts, token!(TIdentifier::parse(ts)))?,
600 m_token_content: optional!(ts, token!(TLiteral::parse(ts))),
601 m_is_list: optional!(ts, token!(TSymbol::"+"(ts))),
602 })
603 }
604 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
605 if let Some(o) = _ovr { if let Some(m) = &self.m_kw_optional { si.set(m, o.clone()); } }
606 if let Some(o) = _ovr { if let Some(m) = &self.m_kw_token { si.set(m, o.clone()); } }
607 if let Some(o) = _ovr { si.set(&self.m_id, o.clone()); }
608 if let Some(o) = _ovr { if let Some(m) = &self.m_token_content { si.set(m, o.clone()); } }
609 if let Some(o) = _ovr { if let Some(m) = &self.m_is_list { si.set(m, o.clone()); } }
610 }
611}
612impl<'p> pt::RuleType<'p> {
613 fn from_ast(ast: &'p ast::RuleType, _ctx: &mut Ctx) -> Self {
614 Self {
615 ast,
616 m_kw_optional: ast.m_kw_optional.is_some(),
617 m_kw_token: ast.m_kw_token.is_some(),
618 m_id: ast.m_id.value.clone(),
619 m_token_content: ast.m_token_content.as_ref().map(|t| t.value.clone()),
620 m_is_list: ast.m_is_list.is_some(),
621 }
622 }
623}
624impl ast::TokenLiteral {
625 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
626 Some(Self {
627 m_t: required!(ts, token!(TLiteral::parse(ts)))?,
628 })
629 }
630 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
631 if let Some(o) = _ovr { si.set(&self.m_t, o.clone()); }
632 }
633}
634impl<'p> pt::TokenLiteral<'p> {
635 fn from_ast(ast: &'p ast::TokenLiteral, _ctx: &mut Ctx) -> Self {
636 Self {
637 ast,
638 m_t: ast.m_t.value.clone(),
639 }
640 }
641}
642impl ast::TokenRegExp {
643 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
644 Some(Self {
645 m_t: required!(ts, token!(TRegExp::parse(ts)))?,
646 })
647 }
648 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
649 if let Some(o) = _ovr { si.set(&self.m_t, o.clone()); }
650 }
651}
652impl<'p> pt::TokenRegExp<'p> {
653 fn from_ast(ast: &'p ast::TokenRegExp, _ctx: &mut Ctx) -> Self {
654 Self {
655 ast,
656 m_t: ast.m_t.value.clone(),
657 }
658 }
659}
660crate::impl_union!(from_ast, TopLevelDefine, {
661 DefineIncludeStatement,
662 DefineContextStatement,
663 DefineRuleStatement,
664 DefineTokenTypeStatement,
665 DefineIgnoreTokenRuleStatement,
666 DefineTokenRuleStatement,
667 DefineSemanticStatement,
668});
669impl ast::TopLevelStatement {
670 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
671 Some(Self {
672 m_body: Box::new(required!(ts, ast::TopLevelDefine::parse(ts))?),
673 m_1: required!(ts, token!(TSymbol::";"(ts)))?,
674 })
675 }
676 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
677 self.m_body.apply_semantic(si, _ovr);
678 if let Some(o) = _ovr { si.set(&self.m_1, o.clone()); }
679 }
680}
681impl<'p> pt::TopLevelStatement<'p> {
682 fn from_ast(ast: &'p ast::TopLevelStatement, _ctx: &mut Ctx) -> Self {
683 Self {
684 ast,
685 m_body: Box::new(pt::TopLevelDefine::from_ast(ast.m_body.as_ref(), _ctx)),
686 }
687 }
688}
689impl ast::UnionRuleBody {
690 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
691 Some(Self {
692 m_0: required!(ts, token!(TSymbol::"="(ts)))?,
693 m_first: optional!(ts, token!(TIdentifier::parse(ts))),
694 m_rest: { let mut v = vec![]; list!(ts, v, ast::UnionRuleListTail::parse(ts)) },
695 })
696 }
697 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
698 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
699 if let Some(m) = &self.m_first { si.set(m, _ovr.as_ref().cloned().unwrap_or(Tok::SRule)); }
700 for m in &self.m_rest { m.apply_semantic(si, _ovr); }
701 }
702}
703impl<'p> pt::UnionRuleBody<'p> {
704 fn from_ast(ast: &'p ast::UnionRuleBody, _ctx: &mut Ctx) -> Self {
705 Self {
706 ast,
707 m_first: ast.m_first.as_ref().map(|t| t.value.clone()),
708 m_rest: ast.m_rest.iter().map(|x| pt::UnionRuleListTail::from_ast(x, _ctx)).collect::<Vec<_>>(),
709 }
710 }
711}
712impl ast::UnionRuleListTail {
713 pub fn parse(ts: &mut TokenStream<Tok>) -> Option<Self> {
714 Some(Self {
715 m_0: required!(ts, token!(TSymbol::"|"(ts)))?,
716 m_r: required!(ts, token!(TIdentifier::parse(ts)))?,
717 })
718 }
719 pub fn apply_semantic(&self, si: &mut TokenBlocks<Tok>, _ovr: &Option<Tok>) {
720 if let Some(o) = _ovr { si.set(&self.m_0, o.clone()); }
721 si.set(&self.m_r, _ovr.as_ref().cloned().unwrap_or(Tok::SRule));
722 }
723}
724impl<'p> pt::UnionRuleListTail<'p> {
725 fn from_ast(ast: &'p ast::UnionRuleListTail, _ctx: &mut Ctx) -> Self {
726 Self {
727 ast,
728 m_r: ast.m_r.value.clone(),
729 }
730 }
731}