1mod command;
2mod error;
3mod predicates;
4mod script_result;
5mod stream_message;
6mod token;
7mod value;
8mod variables;
9use std::collections::HashMap;
10
11pub(crate) use command::CommandError;
12use command::{Command, CommandElem};
13pub(crate) use stream_message::StreamMessage;
14use value::{
15 ClassProperties, ClassType, MethodName, Param, RuntimeObjectTrait, ScriptBlock, ValResult,
16};
17use variables::{Scope, SessionScope};
18type ParserResult<T> = core::result::Result<T, ParserError>;
19use error::ParserError;
20type PestError = pest::error::Error<Rule>;
21use pest::Parser;
22use pest_derive::Parser;
23use predicates::{ArithmeticPred, BitwisePred, LogicalPred, StringPred};
24pub use script_result::{PsValue, ScriptResult};
25pub use token::{CommandToken, ExpressionToken, MethodToken, StringExpandableToken, Token, Tokens};
26pub(crate) use value::Val;
27use value::ValType;
28pub use variables::Variables;
29use variables::{VarName, VariableError};
30
31use crate::parser::{command::CommandOutput, value::RuntimeError};
32
33type Pair<'i> = ::pest::iterators::Pair<'i, Rule>;
34type Pairs<'i> = ::pest::iterators::Pairs<'i, Rule>;
35
36pub(crate) const NEWLINE: &str = "\n";
37
38macro_rules! unexpected_token {
39 ($pair:expr) => {
40 panic!("Unexpected token: {:?}", $pair.as_rule())
41 };
42}
43
44macro_rules! check_rule {
45 ($pair:expr, $rule:pat) => {
46 if !matches!($pair.as_rule(), $rule) {
47 panic!(
48 "Unexpected token: {:?}, instead of {}",
49 $pair.as_rule(),
50 stringify!($rule)
51 );
52 }
53 };
54}
55
56macro_rules! not_implemented {
57 ($token:expr) => {
58 Err(ParserError::NotImplemented(format!(
59 "Not implemented: {:?}",
60 $token.as_rule()
61 )))
62 };
63}
64
65#[derive(Default, Clone)]
66pub(crate) struct Results {
67 output: Vec<StreamMessage>,
68 deobfuscated: Vec<String>,
69}
70
71impl Results {
72 fn new() -> Self {
73 Self {
74 output: Vec::new(),
75 deobfuscated: Vec::new(),
76 }
77 }
78}
79
80#[derive(Parser)]
81#[grammar = "powershell.pest"]
82pub struct PowerShellSession {
83 variables: Variables,
84 tokens: Tokens,
85 errors: Vec<ParserError>,
86 results: Vec<Results>,
87 skip_error: u32,
88}
89
90impl Default for PowerShellSession {
91 fn default() -> Self {
92 Self::new()
93 }
94}
95
96impl<'a> PowerShellSession {
97 pub fn new() -> Self {
117 Self {
118 variables: Variables::new(),
119 tokens: Tokens::new(),
120 errors: Vec::new(),
121 results: Vec::new(),
122 skip_error: 0,
123 }
124 }
125
126 pub fn with_variables(mut self, variables: Variables) -> Self {
151 self.variables = variables;
152 self
153 }
154
155 pub fn safe_eval(&mut self, script: &str) -> Result<String, ParserError> {
187 let script_res = self.parse_input(script)?;
188 Ok(script_res.result().to_string())
189 }
190
191 pub fn deobfuscate_script(&mut self, script: &str) -> Result<String, ParserError> {
192 self.push_scope_session();
193 let script_res = self.parse_input(script)?;
194 self.pop_scope_session();
195 Ok(script_res.deobfuscated().to_string())
196 }
197
198 pub fn env_variables(&self) -> HashMap<String, PsValue> {
199 self.variables
200 .get_env()
201 .into_iter()
202 .map(|(k, v)| (k, v.into()))
203 .collect()
204 }
205
206 pub fn session_variables(&self) -> HashMap<String, PsValue> {
207 self.variables
208 .get_global()
209 .into_iter()
210 .map(|(k, v)| (k, v.into()))
211 .collect()
212 }
213
214 pub fn parse_input(&mut self, input: &str) -> Result<ScriptResult, ParserError> {
246 self.variables.init();
247 let (script_last_output, mut result) = self.parse_subscript(input)?;
248 self.variables.clear_script_functions();
249 Ok(ScriptResult::new(
250 script_last_output,
251 std::mem::take(&mut result.output),
252 std::mem::take(&mut result.deobfuscated),
253 std::mem::take(&mut self.tokens),
254 std::mem::take(&mut self.errors),
255 self.variables
256 .script_scope()
257 .into_iter()
258 .map(|(k, v)| (k, v.into()))
259 .collect(),
260 ))
261 }
262
263 pub(crate) fn parse_subscript(&mut self, input: &str) -> Result<(Val, Results), ParserError> {
264 let mut pairs = PowerShellSession::parse(Rule::program, input)?;
265 self.results.push(Results::new());
267
268 let program_token = pairs.next().expect("");
269
270 let mut script_last_output = Val::default();
271
272 if let Rule::program = program_token.as_rule() {
273 let mut pairs = program_token.into_inner();
274 let _script_param_block_token = pairs.next().unwrap();
275 if let Some(named_blocks) = pairs.peek()
276 && named_blocks.as_rule() == Rule::named_blocks
277 {
278 let _ = pairs.next();
280 }
281 for token in pairs {
282 let token_str = token.as_str();
283 match token.as_rule() {
284 Rule::statement_terminator => continue,
285 Rule::EOI => break,
286 _ => {}
287 };
288
289 let result = self.eval_statement(token.clone());
290 self.variables.set_status(result.is_ok());
291
292 if let Ok(Val::NonDisplayed(_)) = &result {
293 continue;
294 }
295
296 script_last_output = match result {
297 Ok(val) => {
298 if val != Val::Null {
299 self.add_output_statement(val.display().into());
300 self.add_deobfuscated_statement(val.cast_to_script());
301 }
302
303 val
304 }
305 Err(e) => {
306 self.errors.push(e);
307 self.add_deobfuscated_statement(token_str.into());
308 Val::Null
309 }
310 };
311 }
312 }
313
314 Ok((script_last_output, self.results.pop().unwrap_or_default()))
315 }
316
317 fn add_function(
318 &mut self,
319 name: String,
320 func: ScriptBlock,
321 scope: Option<Scope>,
322 ) -> ParserResult<Val> {
323 if let Some(Scope::Global) = &scope {
327 self.variables.add_global_function(name.clone(), func);
328 } else {
329 self.variables.add_script_function(name.clone(), func);
330 }
331
332 Err(ParserError::Skip)
333 }
334
335 pub(crate) fn parse_function_statement(&mut self, token: Pair<'a>) -> ParserResult<Val> {
336 check_rule!(token, Rule::function_statement);
337
338 let mut pair = token.into_inner();
339
340 let function_keyword_token = pair.next().unwrap();
341 check_rule!(function_keyword_token, Rule::function_keyword);
342
343 let mut next_token = pair.next().unwrap();
344 let scope = if next_token.as_rule() == Rule::scope_keyword {
345 let scope = Scope::from(next_token.as_str());
346 next_token = pair.next().unwrap();
347 Some(scope)
348 } else {
349 None
350 };
351
352 let function_name_token = next_token;
353 check_rule!(function_name_token, Rule::function_name);
354 let fname = function_name_token.as_str().to_ascii_lowercase();
355
356 let Some(mut next_token) = pair.next() else {
357 return self.add_function(fname, ScriptBlock::empty(), scope);
359 };
360
361 let params = if next_token.as_rule() == Rule::parameter_list {
362 let param_list = self.parse_parameter_list(next_token)?;
363 if let Some(token) = pair.next() {
364 next_token = token;
365 } else {
366 return self.add_function(fname, ScriptBlock::empty(), scope);
367 }
368
369 param_list
370 } else {
371 Vec::new()
372 };
373 check_rule!(next_token, Rule::script_block);
374
375 let mut script_block = self.parse_script_block(next_token)?;
376
377 if script_block.params.0.is_empty() {
378 script_block = script_block.with_params(params);
379 }
380
381 self.add_function(fname, script_block, scope)
382 }
383
384 pub(crate) fn eval_if_statement(&mut self, token: Pair<'a>) -> ParserResult<Val> {
385 check_rule!(token, Rule::if_statement);
386
387 self.if_statement_collect_tokens(token.clone());
389
390 let mut pair = token.into_inner();
391 let condition_token = pair.next().unwrap();
392 let true_token = pair.next().unwrap();
393 let condition_val = self.eval_pipeline(condition_token.clone())?;
394 let res = if condition_val.cast_to_bool() {
395 self.eval_statement_block(true_token)?
396 } else if let Some(mut token) = pair.next() {
397 if token.as_rule() == Rule::elseif_clauses {
398 for else_if in token.into_inner() {
399 let mut pairs = else_if.into_inner();
400 let condition_token = pairs.next().unwrap();
401 let statement_token = pairs.next().unwrap();
402 let condition_val = self.eval_pipeline(condition_token)?;
403 if condition_val.cast_to_bool() {
404 return self.eval_statement_block(statement_token);
405 }
406 }
407 let Some(token2) = pair.next() else {
408 return Ok(Val::Null);
409 };
410 token = token2;
411 }
412 if token.as_rule() == Rule::else_condition {
413 let statement_token = token.into_inner().next().unwrap();
414 self.eval_statement_block(statement_token)?
415 } else {
416 Val::Null
417 }
418 } else {
419 Val::Null
420 };
421
422 Ok(res)
423 }
424
425 pub(crate) fn if_statement_collect_tokens(&mut self, token: Pair<'a>) {
426 let results = self.results.clone();
430 let current_variables = self.variables.clone();
431 if let Err(err) = self.impl_if_statement_collect_tokens(token.clone()) {
432 log::debug!("Error during if_statement_collect_tokens: {:?}", err);
433 }
434 self.variables = current_variables;
435 self.results = results;
436 }
437
438 pub(crate) fn impl_if_statement_collect_tokens(&mut self, token: Pair<'a>) -> ParserResult<()> {
439 check_rule!(token, Rule::if_statement);
440
441 let mut pair = token.into_inner();
442 let condition_token = pair.next().unwrap();
443 let true_token = pair.next().unwrap();
444 let _condition_val = self.eval_pipeline(condition_token.clone())?;
445 if let Err(err) = self.eval_statement_block(true_token) {
446 log::debug!(
447 "Error during if_statement_collect_tokens (true block): {:?}",
448 err
449 );
450 }
451 if let Some(mut token) = pair.next() {
452 if token.as_rule() == Rule::elseif_clauses {
453 for else_if in token.into_inner() {
454 let mut pairs = else_if.into_inner();
455 let condition_token = pairs.next().unwrap();
456 let statement_token = pairs.next().unwrap();
457 let _condition_val = self.eval_pipeline(condition_token)?;
458
459 if let Err(err) = self.eval_statement_block(statement_token) {
460 log::debug!(
461 "Error during if_statement_collect_tokens (else if block): {:?}",
462 err
463 );
464 }
465 }
466 let Some(token2) = pair.next() else {
467 return Ok(());
468 };
469 token = token2;
470 }
471 if token.as_rule() == Rule::else_condition {
472 let statement_token = token.into_inner().next().unwrap();
473 if let Err(err) = self.eval_statement_block(statement_token) {
474 log::debug!(
475 "Error during if_statement_collect_tokens (else block): {:?}",
476 err
477 );
478 }
479 }
480 }
481 Ok(())
482 }
483
484 fn eval_flow_control_statement(&mut self, token: Pair<'a>) -> ParserResult<Val> {
485 check_rule!(token, Rule::flow_control_statement);
486 let token = token.into_inner().next().unwrap();
487
488 Ok(match token.as_rule() {
489 Rule::flow_control_label_statement => Val::Null, Rule::flow_control_pipeline_statement => {
491 let token = token.into_inner().next().unwrap();
492 if let Some(pipeline_token) = token.into_inner().next() {
494 self.eval_pipeline(pipeline_token)?
495 } else {
496 Val::Null
497 }
498 }
499 _ => unexpected_token!(token),
500 })
501 }
502
503 fn parse_class_statement(&mut self, token: Pair<'a>) -> ParserResult<Val> {
504 check_rule!(token, Rule::class_statement);
505 let mut pair = token.into_inner();
506
507 let class_name_token = pair.next().unwrap();
508 check_rule!(class_name_token, Rule::simple_name);
509 let class_name = class_name_token.as_str().to_string();
510
511 let mut properties = ClassProperties::new();
512 let mut methods: HashMap<String, ScriptBlock> = HashMap::new();
513
514 for member_token in pair {
515 match member_token.as_rule() {
516 Rule::class_property_definition => {
517 let prop_pair = member_token.into_inner();
518
519 let mut prop_pair = prop_pair.skip_while(|p| p.as_rule() == Rule::attribute);
521
522 let mut token = prop_pair.next().unwrap();
523 let _is_static = if token.as_rule() == Rule::class_attribute_static {
524 token = prop_pair.next().unwrap();
525 true
526 } else {
527 false
528 };
529
530 let _is_hidden = if token.as_rule() == Rule::class_attribute_hidden {
531 token = prop_pair.next().unwrap();
532 true
533 } else {
534 false
535 };
536
537 let ttype = if token.as_rule() == Rule::type_literal {
538 let ttype = self.get_valtype_from_type_literal(token)?;
539 token = prop_pair.next().unwrap();
540 Some(ttype)
541 } else {
542 None
543 };
544 check_rule!(token, Rule::variable);
545 let var_name = Self::parse_variable(token)?;
546 let default_val = if let Some(expression_token) = prop_pair.next() {
547 Some(self.eval_expression(expression_token)?)
548 } else {
549 None
550 };
551 properties.add_property(var_name.name, ttype, default_val);
552 }
553 Rule::class_method_definition => {
554 let prop_pair = member_token.into_inner();
555
556 let mut prop_pair = prop_pair.skip_while(|p| p.as_rule() == Rule::attribute);
558
559 let mut token = prop_pair.next().unwrap();
560 let _is_static = if token.as_rule() == Rule::class_attribute_static {
561 token = prop_pair.next().unwrap();
562 true
563 } else {
564 false
565 };
566
567 let _is_hidden = if token.as_rule() == Rule::class_attribute_hidden {
568 token = prop_pair.next().unwrap();
569 true
570 } else {
571 false
572 };
573
574 let _ttype = if token.as_rule() == Rule::type_literal {
575 let ttype = self.eval_type_literal(token)?.ttype();
576 token = prop_pair.next().unwrap();
577 Some(ttype)
578 } else {
579 None
580 };
581 check_rule!(token, Rule::simple_name);
582 let method_name = token.as_str().to_ascii_lowercase();
583
584 let mut token = prop_pair.next().unwrap();
585 let parameters = if token.as_rule() == Rule::parameter_list {
586 let params = self.parse_parameter_list(token)?;
587 token = prop_pair.next().unwrap();
588 params
589 } else {
590 vec![]
591 };
592 check_rule!(token, Rule::script_block);
593
594 let method_name = MethodName::new(method_name.as_str(), ¶meters);
595 let script_block = self.parse_script_block(token)?.with_params(parameters);
596 methods.insert(method_name.full_name().to_string(), script_block);
597 }
598 _ => unexpected_token!(member_token),
599 }
600 }
601 let class_type = ClassType::new(class_name.clone(), properties, HashMap::new(), methods);
602 if let Ok(mut value) = value::RUNTIME_TYPE_MAP.try_lock() {
603 value.insert(
604 class_name.to_ascii_lowercase(),
605 Box::new(class_type.clone()),
606 );
607 }
608 Ok(Val::Null)
609 }
610
611 fn eval_statement(&mut self, token: Pair<'a>) -> ParserResult<Val> {
612 match token.as_rule() {
613 Rule::pipeline => self.eval_pipeline(token),
614 Rule::if_statement => self.eval_if_statement(token),
615 Rule::flow_control_statement => self.eval_flow_control_statement(token),
616 Rule::function_statement => self.parse_function_statement(token),
617 Rule::statement_terminator => Ok(Val::Null),
618 Rule::class_statement => self.parse_class_statement(token),
619 Rule::EOI => Ok(Val::Null),
620 _ => {
621 not_implemented!(token)
622 }
623 }
624 }
625
626 fn safe_eval_sub_expr(&mut self, token: Pair<'a>) -> ParserResult<Val> {
627 check_rule!(token, Rule::sub_expression);
628 let Some(inner_token) = token.into_inner().next() else {
629 return Ok(Val::Null);
630 };
631 let mut inner_val = self.eval_pipeline(inner_token)?;
632 if let Val::ScriptText(script) = &mut inner_val {
633 *script = format!("$({})", script);
634 }
636 Ok(inner_val)
637 }
638
639 fn eval_statement_block(&mut self, token: Pair<'a>) -> ParserResult<Val> {
640 Ok(self
641 .safe_eval_statements(token)?
642 .iter()
643 .last()
644 .cloned()
645 .unwrap_or(Val::Null))
646 }
647
648 fn eval_statements(&mut self, token: Pair<'a>) -> ParserResult<Vec<Val>> {
649 let pairs = token.into_inner();
651 let mut statements = vec![];
652
653 for token in pairs {
654 let s = self.eval_statement(token)?;
655 statements.push(s);
656 }
657 Ok(statements)
658 }
659
660 fn safe_eval_statements(&mut self, token: Pair<'a>) -> ParserResult<Vec<Val>> {
661 let pairs = token.into_inner();
663 let mut statements = vec![];
664
665 for token in pairs {
666 match self.eval_statement(token.clone()) {
667 Ok(s) => statements.push(s),
668 Err(err) => {
669 self.errors.push(err);
670 statements.push(Val::ScriptText(token.as_str().to_string()));
671 }
672 }
673 }
674 Ok(statements)
675 }
676
677 fn parse_dq(&mut self, token: Pair<'a>) -> ParserResult<String> {
678 let mut res_str = String::new();
679 let pairs = token.into_inner();
680 for token in pairs {
681 let token = token.into_inner().next().unwrap();
682 let s = match token.as_rule() {
683 Rule::variable => self.get_variable(token)?.cast_to_string(),
684 Rule::sub_expression => self.safe_eval_sub_expr(token)?.cast_to_string(),
685 Rule::backtick_escape => token
686 .as_str()
687 .strip_prefix("`")
688 .unwrap_or_default()
689 .to_string(),
690 _ => token.as_str().to_string(),
691 };
692 res_str.push_str(s.as_str());
693 }
694 Ok(res_str)
695 }
696
697 fn eval_string_literal(&mut self, token: Pair<'a>) -> ParserResult<Val> {
698 check_rule!(token, Rule::string_literal);
699 let mut pair = token.into_inner();
700 let token = pair.next().unwrap();
701 let cloned_token = token.clone();
702
703 let mut is_expandable = false;
704 let res = match token.as_rule() {
705 Rule::doublequoted_string_literal | Rule::doublequoted_multiline_string_literal => {
706 is_expandable = true;
707 self.parse_dq(token)?
708 }
709 Rule::singlequoted_string_literal => {
710 let token_string = token.as_str().to_string();
711 let stripped_prefix = token_string
712 .strip_prefix("'")
713 .unwrap_or(token_string.as_str());
714 let stripped_suffix = stripped_prefix.strip_suffix("'").unwrap_or(stripped_prefix);
715 stripped_suffix.to_string()
716 }
717 Rule::singlequoted_multiline_string_literal => {
718 let mut res_str = String::new();
719 let pairs = token.into_inner();
720 for token in pairs {
721 res_str.push_str(token.as_str());
722 }
723 res_str
724 }
725 _ => unexpected_token!(token),
726 };
727 let ps_token = if is_expandable {
728 Token::string_expandable(cloned_token.as_str().to_string(), res.clone())
729 } else {
730 Token::String(cloned_token.as_str().to_string())
731 };
732 self.tokens.push(ps_token);
733
734 Ok(Val::String(res.into()))
735 }
736
737 fn get_variable(&mut self, token: Pair<'a>) -> ParserResult<Val> {
738 check_rule!(token, Rule::variable);
739 let var_name = Self::parse_variable(token)?;
740 let Some(var) = self.variables.get(&var_name) else {
741 return Err(ParserError::VariableError(VariableError::NotDefined(
742 var_name.name,
743 )));
744 };
745 Ok(var)
746 }
747
748 fn parse_scoped_variable(token: Pair<'a>) -> ParserResult<VarName> {
749 let mut pairs = token.into_inner();
751 let mut token = pairs.next().unwrap();
752
753 let scope = if token.as_rule() == Rule::scope_keyword {
754 let scope = token.as_str().to_ascii_lowercase();
755 token = pairs.next().unwrap();
756 check_rule!(token, Rule::var_name);
757 Some(Scope::from(scope.as_str()))
758 } else {
759 None
760 };
761 Ok(VarName::new(scope, token.as_str().to_ascii_lowercase()))
762 }
763
764 fn skip_value_access(&mut self, token: Pair<'a>) -> ParserResult<()> {
765 check_rule!(token, Rule::value_access);
766 let mut pair = token.into_inner();
767 let token = pair.next().unwrap();
768 let mut val = self.eval_value(token)?;
769 let _ = self.eval_element_access_ref(pair.next().unwrap(), &mut val)?;
770 Err(ParserError::Skip)
771 }
772
773 fn parse_assignable_variable(
783 &mut self,
784 token: Pair<'a>,
785 ) -> ParserResult<(VarName, Option<Pairs<'a>>)> {
786 check_rule!(token, Rule::assignable_variable);
787 let mut pair = token.into_inner();
788 let token = pair.next().unwrap();
789 match token.as_rule() {
790 Rule::variable => {
791 let var_name = Self::parse_variable(token)?;
792
793 Ok((var_name, None))
794 }
795 Rule::variable_access => {
796 let mut pairs = token.into_inner();
797 let var_token = pairs.next().unwrap();
798 let var_name = Self::parse_variable(var_token)?;
799 Ok((var_name, Some(pairs)))
804 }
805 Rule::value_access => self
806 .skip_value_access(token)
807 .map(|()| (Default::default(), None)),
808 _ => unexpected_token!(token),
809 }
810 }
811
812 fn parse_variable(token: Pair<'a>) -> ParserResult<VarName> {
813 check_rule!(token, Rule::variable);
814 let mut pair = token.into_inner();
815 let token = pair.next().unwrap();
816
817 Ok(match token.as_rule() {
818 Rule::special_variable => {
819 VarName::new_with_scope(Scope::Special, token.as_str().to_string())
820 }
821 Rule::parenthesized_variable => {
822 Self::parse_variable(token.into_inner().next().unwrap())?
823 }
824 Rule::braced_variable => {
825 let token = token.into_inner().next().unwrap();
826 let var = token.as_str().to_ascii_lowercase();
827 let splits: Vec<&str> = var.split(":").collect();
828 if splits.len() == 2 {
829 VarName::new_with_scope(Scope::from(splits[0]), splits[1].to_string())
830 } else {
831 VarName::new(None, var)
832 }
833 }
834 Rule::scoped_variable => Self::parse_scoped_variable(token)?,
835 _ => unexpected_token!(token),
836 })
837 }
838
839 fn eval_expression_with_unary_operator(&mut self, token: Pair<'a>) -> ParserResult<Val> {
840 check_rule!(token, Rule::expression_with_unary_operator);
841 let mut pair = token.into_inner();
842 let token = pair.next().unwrap();
843
844 let res = match token.as_rule() {
845 Rule::pre_inc_expression => {
846 let variable_token = token.into_inner().next().unwrap();
847 let var_name = Self::parse_variable(variable_token)?;
848 let mut var = self.variables.get(&var_name).unwrap_or_default();
849 var.inc()?;
850
851 self.variables.set(&var_name, var.clone())?;
852 var
853 }
854 Rule::pre_dec_expression => {
855 let variable_token = token.into_inner().next().unwrap();
856 let var_name = Self::parse_variable(variable_token)?;
857 let mut var = self.variables.get(&var_name).unwrap_or_default();
858 var.dec()?;
859
860 self.variables.set(&var_name, var.clone())?;
861 var
862 }
863 Rule::cast_expression => self.eval_cast_expression(token)?,
864 Rule::negate_op => {
865 let unary_token = pair.next().unwrap();
866 let unary = self.eval_unary_exp(unary_token)?;
867 Val::Bool(!unary.cast_to_bool())
868 }
869 Rule::bitwise_negate_op => {
870 let unary_token = pair.next().unwrap();
871 let unary = self.eval_unary_exp(unary_token)?;
872 Val::Int(!unary.cast_to_int()?)
873 }
874 _ => unexpected_token!(token),
875 };
876
877 Ok(res)
878 }
879
880 fn eval_argument_list(&mut self, token: Pair<'a>) -> ParserResult<Vec<Val>> {
881 check_rule!(token, Rule::argument_list);
882 let mut pairs = token.into_inner();
883 let token = pairs.next().unwrap();
884
885 self.skip_error += 1;
886
887 let arg = self.eval_expression(token.clone())?;
888 self.skip_error -= 1;
889
890 if let Val::Array(vec) = arg {
891 Ok(vec)
892 } else {
893 Ok(vec![arg])
894 }
895 }
896
897 fn eval_member_access(&mut self, token: Pair<'a>) -> ParserResult<String> {
898 let member_name_token = token.into_inner().next().unwrap();
900 let member_name = member_name_token.as_str().to_ascii_lowercase();
901
902 Ok(member_name)
903 }
904
905 fn method_is_static(&mut self, token: Pair<'a>) -> bool {
906 check_rule!(token, Rule::method_invocation);
907 let mut pairs = token.into_inner();
908
909 let access = pairs.next().unwrap();
910 match access.as_rule() {
911 Rule::member_access => false,
912 Rule::static_access => true,
913 _ => unexpected_token!(access),
914 }
915 }
916
917 fn eval_method_invocation(
918 &mut self,
919 token: Pair<'a>,
920 object: &Val,
921 ) -> ParserResult<(String, Vec<Val>)> {
922 check_rule!(token, Rule::method_invocation);
923 let token_string = token.as_str().to_string();
924
925 let mut pairs = token.into_inner();
926
927 let access = pairs.next().unwrap();
928 let method_name = self.eval_member_access(access)?;
929
930 let args = if let Some(token) = pairs.next() {
931 check_rule!(token, Rule::argument_list);
932 match self.eval_argument_list(token) {
933 Ok(args) => args,
934 Err(e) => {
935 log::debug!("eval_argument_list error: {:?}", e);
936
937 self.tokens.push(Token::method(
939 token_string.clone(),
940 object.clone().into(),
941 method_name.clone(),
942 Vec::new(),
943 ));
944 Err(e)?
945 }
946 }
947 } else {
948 Vec::new()
949 };
950
951 self.tokens.push(Token::method(
952 token_string,
953 object.clone().into(),
954 method_name.clone(),
955 args.clone().iter().map(|arg| arg.clone().into()).collect(),
956 ));
957 Ok((method_name, args))
958 }
959
960 fn eval_element_access_ref<'b>(
961 &mut self,
962 token: Pair<'a>,
963 object: &'b mut Val,
964 ) -> ParserResult<&'b mut Val> {
965 let mut pairs = token.into_inner();
966 let index_token = pairs.next().unwrap();
967 check_rule!(index_token, Rule::expression);
968 let index = self.eval_expression(index_token)?;
969 Ok(object.get_index_ref(index)?)
970 }
971
972 fn eval_element_access(&mut self, token: Pair<'a>, object: &Val) -> ParserResult<Val> {
973 let mut pairs = token.into_inner();
974 let index_token = pairs.next().unwrap();
975 check_rule!(index_token, Rule::expression);
976 let index = self.eval_expression(index_token)?;
977 Ok(object.get_index(index)?)
978 }
979
980 fn variable_access<'b>(
981 &mut self,
982 token: Pair<'a>,
983 object: &'b mut Val,
984 ) -> ParserResult<&'b mut Val> {
985 fn get_member_name(token: Pair<'_>) -> &'_ str {
986 token.into_inner().next().unwrap().as_str()
987 }
988 match token.as_rule() {
989 Rule::static_access => {
990 Err(ParserError::NotImplemented(
992 "modificable static_member".into(),
993 ))
994 }
995 Rule::member_access => Ok(object.member(get_member_name(token))?),
996 Rule::element_access => Ok(self.eval_element_access_ref(token, object)?),
997 _ => unexpected_token!(token),
998 }
999 }
1000
1001 fn value_access(&mut self, token: Pair<'a>, object: &mut Val) -> ParserResult<Val> {
1002 fn get_member_name(token: Pair<'_>) -> &'_ str {
1003 token.into_inner().next().unwrap().as_str()
1004 }
1005 Ok(match token.as_rule() {
1006 Rule::static_access => {
1007 let Val::RuntimeType(rt) = object else {
1008 return Err(RuntimeError::MethodNotFound(
1009 "Readonly static members can only be accessed on types".to_string(),
1010 )
1011 .into());
1012 };
1013 rt.readonly_static_member(get_member_name(token))?
1014 }
1015 Rule::member_access => object.readonly_member(get_member_name(token))?.clone(),
1016 Rule::method_invocation => {
1017 let static_method = self.method_is_static(token.clone());
1018 let (function_name, args) = self.eval_method_invocation(token, object)?;
1019 let mangled_name = MethodName::from_args(function_name.as_str(), &args);
1020
1021 if static_method {
1022 let Val::RuntimeType(rt) = object else {
1023 return Err(RuntimeError::MethodNotFound(
1024 "Static method can be called only on type".to_string(),
1025 )
1026 .into());
1027 };
1028
1029 let mut call = rt.static_method(mangled_name)?;
1030 call(args)?
1031 } else {
1032 let mut call = object.method(mangled_name)?;
1033 call(object, args)?
1034 }
1035 }
1036 Rule::element_access => self.eval_element_access(token, object)?,
1037 _ => unexpected_token!(token),
1038 })
1039 }
1040
1041 fn eval_value_access(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1042 check_rule!(token, Rule::value_access);
1043 let mut pairs = token.into_inner();
1044 let token = pairs.next().unwrap();
1045
1046 let mut object = self.eval_value(token)?;
1047 for token in pairs {
1048 object = self.value_access(token, &mut object)?;
1049 }
1050 log::debug!("Success eval_access: {:?}", object);
1051 Ok(object)
1052 }
1053
1054 fn parse_access(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1055 check_rule!(token, Rule::value_access);
1056 let mut pairs = token.into_inner();
1057 let token = pairs.next().unwrap();
1058
1059 let mut object = self
1060 .eval_value(token.clone())
1061 .map(|v| v.cast_to_script())
1062 .unwrap_or(token.as_str().to_string());
1063
1064 for token in pairs {
1065 match token.as_rule() {
1066 Rule::static_access => {
1067 object.push_str(token.as_str());
1068 }
1069 Rule::member_access => {
1070 object.push_str(token.as_str());
1071 }
1072 Rule::method_invocation => {
1073 let static_method = self.method_is_static(token.clone());
1074 let (method_name, args) = self
1075 .eval_method_invocation(token.clone(), &Val::ScriptText(object.clone()))?;
1076 log::trace!("Method: {:?} {:?}", &method_name, &args);
1077
1078 let separator = if static_method { "::" } else { "." };
1079 object = format!(
1080 "{}{separator}{}({})",
1081 object,
1082 method_name.to_ascii_lowercase(),
1083 args.iter()
1084 .map(|arg| arg.cast_to_script())
1085 .collect::<Vec<String>>()
1086 .join(", ")
1087 )
1088 }
1089 Rule::element_access => {
1090 let mut pairs = token.into_inner();
1091 let index_token = pairs.next().unwrap();
1092 check_rule!(index_token, Rule::expression);
1093 let index = self.eval_expression(index_token)?;
1094 object = format!("{}[{}]", object, index);
1095 }
1096 _ => unexpected_token!(token),
1097 }
1098 }
1099 Ok(Val::String(object.into()))
1100 }
1101
1102 fn eval_primary_expression(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1103 check_rule!(token, Rule::primary_expression);
1104 let mut pair = token.into_inner();
1105 let token = pair.next().unwrap();
1106 let res = match token.as_rule() {
1107 Rule::value_access => match self.eval_value_access(token.clone()) {
1108 Ok(res) => res,
1109 Err(err) => {
1110 log::debug!("eval_access error: {:?}", err);
1111 self.errors.push(err);
1112 self.parse_access(token)?
1113 }
1114 },
1115 Rule::value => self.eval_value(token)?,
1116 Rule::post_inc_expression => {
1117 let variable_token = token.into_inner().next().unwrap();
1118 let var_name = Self::parse_variable(variable_token)?;
1119 let mut var = self.variables.get(&var_name).unwrap_or_default();
1120 let var_to_return = var.clone();
1121
1122 var.inc()?;
1123 self.variables.set(&var_name, var.clone())?;
1124
1125 var_to_return
1127 }
1128 Rule::post_dec_expression => {
1129 let variable_token = token.into_inner().next().unwrap();
1130 let var_name = Self::parse_variable(variable_token)?;
1131 let mut var = self.variables.get(&var_name).unwrap_or_default();
1132 let var_to_return = var.clone();
1133
1134 var.dec()?;
1135 self.variables.set(&var_name, var.clone())?;
1136
1137 var_to_return
1138 }
1139 _ => unexpected_token!(token),
1140 };
1141
1142 Ok(res)
1143 }
1144
1145 fn get_valtype_from_type_literal(&mut self, token: Pair<'a>) -> ParserResult<ValType> {
1146 check_rule!(token, Rule::type_literal);
1147
1148 let token = token.into_inner().next().unwrap();
1149 check_rule!(token, Rule::type_spec);
1150 Ok(ValType::cast(token.as_str())?)
1151 }
1152
1153 fn eval_type_literal(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1154 check_rule!(token, Rule::type_literal);
1155
1156 let token = token.into_inner().next().unwrap();
1157 check_rule!(token, Rule::type_spec);
1158 Ok(ValType::runtime_type_from_str(token.as_str())?)
1159 }
1160
1161 fn parse_script_block(&mut self, token: Pair<'a>) -> ParserResult<ScriptBlock> {
1162 check_rule!(token, Rule::script_block);
1163
1164 let raw_text = token.as_str().to_string();
1165
1166 let mut pairs = token.into_inner();
1167 let Some(token) = pairs.next() else {
1168 return Ok(ScriptBlock::new(vec![], String::new(), raw_text));
1169 };
1170
1171 let params = self.parse_script_param_block(token.clone())?;
1172 let script_body = if let Some(token) = pairs.next() {
1175 check_rule!(token, Rule::script_block_body);
1176 token.as_str().to_string()
1177 } else {
1178 String::new()
1179 };
1180
1181 Ok(ScriptBlock::new(params, script_body, raw_text))
1182
1183 }
1191
1192 fn parse_script_block_expression(&mut self, token: Pair<'a>) -> ParserResult<ScriptBlock> {
1193 check_rule!(token, Rule::script_block_expression);
1194 let mut pairs = token.into_inner();
1195 self.parse_script_block(pairs.next().unwrap())
1196 }
1197
1198 fn eval_hash_key(&mut self, token: Pair<'a>) -> ParserResult<String> {
1199 check_rule!(token, Rule::key_expression);
1200 let mut pairs = token.into_inner();
1201 let key_token = pairs.next().unwrap();
1202
1203 Ok(match key_token.as_rule() {
1204 Rule::simple_name => key_token.as_str().to_ascii_lowercase(),
1205 Rule::unary_exp => self
1206 .eval_unary_exp(key_token)?
1207 .cast_to_string()
1208 .to_ascii_lowercase(),
1209 _ => unexpected_token!(key_token),
1210 })
1211 }
1212
1213 fn eval_hash_entry(&mut self, token: Pair<'a>) -> ParserResult<(String, Val)> {
1214 check_rule!(token, Rule::hash_entry);
1215
1216 let mut pairs = token.into_inner();
1217 let token_key = pairs.next().unwrap();
1218 let token_value = pairs.next().unwrap();
1219 let value = match token_value.as_rule() {
1220 Rule::type_literal => self.eval_type_literal(token_value)?,
1222 _ => self.eval_statement(token_value)?,
1223 };
1224
1225 Ok((self.eval_hash_key(token_key)?, value))
1226 }
1227
1228 fn eval_hash_literal(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1229 check_rule!(token, Rule::hash_literal_expression);
1230 let pairs = token.into_inner();
1231 let mut hash = HashMap::new();
1232 for token in pairs {
1233 let (key, value) = self.eval_hash_entry(token)?;
1234 hash.insert(key, value);
1235 }
1236 Ok(Val::HashTable(hash))
1237 }
1238
1239 fn eval_value(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1240 check_rule!(token, Rule::value);
1241 let mut pair = token.into_inner();
1242 let token = pair.next().unwrap();
1243
1244 let res = match token.as_rule() {
1245 Rule::parenthesized_expression => {
1246 let token = token.into_inner().next().unwrap();
1247 self.safe_eval_pipeline(token)?
1248 }
1249 Rule::sub_expression | Rule::array_expression => {
1250 let statements = self.eval_statements(token)?;
1251 if statements.len() == 1 {
1252 if let Val::Array(_) = statements[0] {
1253 statements[0].clone()
1254 } else {
1255 Val::Array(statements)
1256 }
1257 } else {
1258 Val::Array(statements)
1259 }
1260 }
1261 Rule::script_block_expression => {
1262 Val::ScriptBlock(self.parse_script_block_expression(token)?)
1263 }
1264 Rule::hash_literal_expression => self.eval_hash_literal(token)?,
1265 Rule::string_literal => self.eval_string_literal(token)?,
1266 Rule::number_literal => self.eval_number_literal(token)?,
1267 Rule::type_literal => self.eval_type_literal(token)?,
1268 Rule::variable => self.get_variable(token)?,
1269 _ => unexpected_token!(token),
1270 };
1271 log::debug!("eval_value - res: {:?}", res);
1272 Ok(res)
1273 }
1274
1275 fn eval_number_literal(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1276 check_rule!(token, Rule::number_literal);
1277 let mut negate = false;
1278 let mut pairs = token.into_inner();
1279 let mut token = pairs.next().unwrap();
1280
1281 if token.as_rule() == Rule::minus {
1283 negate = true;
1284 token = pairs.next().unwrap();
1285 } else if token.as_rule() == Rule::plus {
1286 token = pairs.next().unwrap();
1287 }
1288
1289 let mut val = self.eval_number(token)?;
1290
1291 if negate {
1292 val.neg()?;
1293 }
1294
1295 if let Some(unit) = pairs.next() {
1296 let unit = unit.as_str().to_ascii_lowercase();
1297 let unit_int = match unit.as_str() {
1298 "k" => 1024,
1299 "m" => 1024 * 1024,
1300 "g" => 1024 * 1024 * 1024,
1301 "t" => 1024 * 1024 * 1024 * 1024,
1302 "p" => 1024 * 1024 * 1024 * 1024 * 1024,
1303 _ => 1,
1304 };
1305 val.mul(Val::Int(unit_int))?;
1306 }
1307 Ok(val)
1308 }
1309
1310 fn eval_number(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1311 check_rule!(token, Rule::number);
1312 let mut pairs = token.into_inner();
1313 let token = pairs.next().unwrap();
1314 let v = match token.as_rule() {
1315 Rule::decimal_integer => {
1316 let int_val = token.into_inner().next().unwrap();
1317 Val::Int(int_val.as_str().parse::<i64>().unwrap())
1318 }
1319 Rule::hex_integer => {
1320 let int_val = token.into_inner().next().unwrap();
1321 Val::Int(i64::from_str_radix(int_val.as_str(), 16).unwrap())
1322 }
1323 Rule::float => {
1324 let float_str = token.as_str().trim();
1325 Val::Float(float_str.parse::<f64>()?)
1326 }
1328 _ => unexpected_token!(token),
1329 };
1330 Ok(v)
1331 }
1332
1333 fn eval_unary_exp(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1334 check_rule!(token, Rule::unary_exp);
1335 let token = token.into_inner().next().unwrap();
1336 match token.as_rule() {
1337 Rule::expression_with_unary_operator => self.eval_expression_with_unary_operator(token),
1338 Rule::primary_expression => self.eval_primary_expression(token),
1339 _ => unexpected_token!(token),
1340 }
1341 }
1342
1343 fn eval_array_literal_exp_special_case(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1344 check_rule!(token, Rule::array_literal_exp_special_case);
1345 let mut pairs = token.into_inner();
1346 let token = pairs.next().unwrap();
1347
1348 let val = self.eval_array_literal_exp(token)?;
1349 Ok(Val::Array(vec![val]))
1350 }
1351
1352 fn safe_parse_arg(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1353 Ok(if self.skip_error > 0 {
1354 match self.eval_unary_exp(token.clone()) {
1355 Ok(val) => val,
1356 Err(err) => {
1357 self.errors.push(err);
1358 Val::ScriptText(token.as_str().to_string())
1359 }
1360 }
1361 } else {
1362 self.eval_unary_exp(token.clone())?
1363 })
1364 }
1365
1366 fn eval_array_literal_exp(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1367 check_rule!(token, Rule::array_literal_exp);
1368 let mut arr = Vec::new();
1369 let mut pairs = token.into_inner();
1370 let token = pairs.next().unwrap();
1371
1372 if let Rule::array_literal_exp_special_case = token.as_rule() {
1374 return self.eval_array_literal_exp_special_case(token);
1375 }
1376
1377 arr.push(self.safe_parse_arg(token)?);
1378 for token in pairs {
1379 arr.push(self.safe_parse_arg(token)?);
1380 }
1381
1382 Ok(if arr.len() == 1 {
1383 arr[0].clone()
1384 } else {
1385 Val::Array(arr)
1386 })
1387 }
1388
1389 fn eval_range_exp(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1390 fn range(mut left: i64, right: i64) -> Vec<Val> {
1391 let mut v = Vec::new();
1392 if left <= right {
1393 loop {
1394 v.push(left);
1395 if left == right {
1396 break;
1397 }
1398 left += 1;
1399 }
1400 } else {
1401 loop {
1402 v.push(left);
1403 if left == right {
1404 break;
1405 }
1406 left -= 1;
1407 }
1408 }
1409 v.into_iter().map(Val::Int).collect()
1410 }
1411 check_rule!(token, Rule::range_exp);
1412 let mut pairs = token.into_inner();
1413 let token = pairs.next().unwrap();
1414 let res = match token.as_rule() {
1415 Rule::decimal_integer => {
1416 let int_val = token.into_inner().next().unwrap();
1417 let left = int_val.as_str().parse::<i64>().unwrap();
1418 let token = pairs.next().unwrap();
1419 let right = self.eval_array_literal_exp(token)?.cast_to_int()?;
1420 Val::Array(range(left, right))
1421 }
1422 Rule::array_literal_exp => {
1423 let res = self.eval_array_literal_exp(token)?;
1424 if let Some(token) = pairs.next() {
1425 let left = res.cast_to_int()?;
1426 let right = self.eval_array_literal_exp(token)?.cast_to_int()?;
1427 Val::Array(range(left, right))
1428 } else {
1429 res
1430 }
1431 }
1432 _ => unexpected_token!(token),
1433 };
1434
1435 Ok(res)
1436 }
1437
1438 fn eval_format_impl(&mut self, format: Val, mut pairs: Pairs<'a>) -> ParserResult<Val> {
1439 fn format_with_vec(fmt: &str, args: Vec<Val>) -> ParserResult<String> {
1440 fn strange_special_case(fmt: &str, n: i64) -> String {
1441 fn split_digits(n: i64) -> Vec<u8> {
1442 n.abs() .to_string()
1444 .chars()
1445 .filter_map(|c| c.to_digit(10).map(|opt| opt as u8))
1446 .collect()
1447 }
1448
1449 let mut digits = split_digits(n);
1451 digits.reverse();
1452 let mut fmt_vec = fmt.as_bytes().to_vec();
1453 fmt_vec.reverse();
1454
1455 let mut i = 0;
1456 for digit in digits {
1457 while i < fmt_vec.len() {
1458 if fmt_vec[i] != b'0' {
1459 i += 1
1460 } else {
1461 fmt_vec[i] = digit + b'0';
1462 break;
1463 }
1464 }
1465 }
1466 fmt_vec.reverse();
1467 String::from_utf8(fmt_vec).unwrap_or_default()
1468 }
1469
1470 let mut output = String::new();
1471 let mut i = 0;
1472
1473 while i < fmt.len() {
1474 if fmt[i..].starts_with('{') {
1475 if let Some(end) = fmt[i..].find('}') {
1476 let token = &fmt[i + 1..i + end];
1477 let formatted = if token.contains(':') {
1478 let mut parts = token.split(':');
1479 let index: usize = if let Some(p) = parts.next() {
1480 p.parse().unwrap_or(0)
1481 } else {
1482 0
1483 };
1484
1485 let spec = parts.next();
1486 match args.get(index) {
1487 Some(val) => match spec {
1488 Some(s) if s.starts_with('N') => {
1489 let precision = s[1..].parse::<usize>().unwrap_or(2);
1490 if let Ok(f) = val.cast_to_float() {
1491 format!("{:.1$}", f, precision)
1492 } else {
1493 val.cast_to_string().to_string()
1494 }
1495 }
1496 Some(s) => strange_special_case(s, val.cast_to_int()?),
1497 None => val.cast_to_string().to_string(),
1498 },
1499 None => format!("{{{}}}", token), }
1502 } else if token.contains(',') {
1503 let mut parts = token.split(',');
1504 let index: usize = parts.next().unwrap().parse().unwrap_or(0);
1505 let spec = parts.next();
1506 match args.get(index) {
1507 Some(val) => match spec {
1508 Some(s) => {
1509 let spaces = s.parse::<usize>().unwrap_or(0);
1510 let spaces_str = " ".repeat(spaces);
1511 format!("{spaces_str}{}", val.cast_to_string())
1512 }
1513 _ => val.cast_to_string().to_string(),
1514 },
1515 None => format!("{{{}}}", token), }
1518 } else {
1519 let index: usize =
1520 Val::String(token.to_string().into()).cast_to_int()? as usize;
1521 match args.get(index) {
1522 Some(val) => val.cast_to_string().to_string(),
1523 None => format!("{{{}}}", token), }
1526 };
1527
1528 output.push_str(&formatted);
1529 i += end + 1;
1530 } else {
1531 output.push('{');
1532 i += 1;
1533 }
1534 } else {
1535 output.push(fmt[i..].chars().next().unwrap());
1536 i += 1;
1537 }
1538 }
1539
1540 Ok(output)
1541 }
1542
1543 Ok(if let Some(token) = pairs.next() {
1544 let first_fmt = format.cast_to_string();
1545
1546 let second_fmt = self.eval_range_exp(token)?;
1547 let res = self.eval_format_impl(second_fmt, pairs)?;
1548 Val::String(format_with_vec(first_fmt.as_str(), res.cast_to_array())?.into())
1549 } else {
1550 format
1551 })
1552 }
1553
1554 fn eval_format_exp(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1555 check_rule!(token, Rule::format_exp);
1556 let mut pairs = token.into_inner();
1557 let format = self.eval_range_exp(pairs.next().unwrap())?;
1558 self.eval_format_impl(format, pairs)
1559 }
1560
1561 fn eval_mult(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1562 check_rule!(token, Rule::multiplicative_exp);
1563 let mut pairs = token.into_inner();
1564 let mut res = self.eval_format_exp(pairs.next().unwrap())?;
1565 while let Some(op) = pairs.next() {
1566 let Some(fun) = ArithmeticPred::get(op.as_str()) else {
1567 log::error!("No arithmetic function for operator: {}", op.as_str());
1568 return Err(ParserError::NotImplemented(format!(
1569 "No arithmetic function for operator: {}",
1570 op.as_str()
1571 )));
1572 };
1573
1574 let postfix = pairs.next().unwrap();
1575 let right_op = self.eval_format_exp(postfix)?;
1576 res = fun(res, right_op)?;
1577 }
1578
1579 Ok(res)
1580 }
1581
1582 fn eval_additive(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1583 check_rule!(token, Rule::additive_exp);
1584
1585 let mut pairs = token.into_inner();
1586 let mut res = self.eval_mult(pairs.next().unwrap())?;
1587 while let Some(op) = pairs.next() {
1588 let Some(fun) = ArithmeticPred::get(op.as_str()) else {
1590 log::error!("No arithmetic function for operator: {}", op.as_str());
1591 return Err(ParserError::NotImplemented(format!(
1592 "No arithmetic function for operator: {}",
1593 op.as_str()
1594 )));
1595 };
1596
1597 let mult = pairs.next().unwrap();
1598 let right_op = self.eval_mult(mult)?;
1599 res = fun(res, right_op)?;
1600 }
1601
1602 Ok(res)
1603 }
1604
1605 fn eval_split_special_case(
1606 &mut self,
1607 script_block: ScriptBlock,
1608 input: Val,
1609 ) -> ParserResult<Vec<String>> {
1610 let mut res_vec = vec![];
1611 let mut parts = String::new();
1612 let input_str = input.cast_to_string();
1613 let characters = input_str.chars();
1614
1615 for ch in characters {
1617 let b = match script_block.run(vec![], self, Some(Val::String(ch.to_string().into()))) {
1618 Err(er) => {
1619 self.errors.push(er);
1620 false
1621 }
1622 Ok(res) => res.val.cast_to_bool(),
1623 };
1624
1625 if b {
1626 res_vec.push(parts);
1627 parts = String::new();
1628 } else {
1629 parts.push(ch);
1630 }
1631 }
1632 self.variables.reset_ps_item();
1633 Ok(res_vec)
1634 }
1635
1636 fn eval_comparison_exp(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1637 check_rule!(token, Rule::comparison_exp);
1638 let mut pairs = token.into_inner();
1639 let token = pairs.next().unwrap();
1640
1641 let mut res = if token.as_rule() == Rule::additive_exp {
1644 self.eval_additive(token)?
1645 } else {
1646 Val::Null
1647 };
1648
1649 while let Some(op) = pairs.next() {
1650 let Some(fun) = StringPred::get(op.as_str()) else {
1651 log::error!("No string predicate for operator: {}", op.as_str());
1652 return Err(ParserError::NotImplemented(format!(
1653 "No string predicate for operator: {}",
1654 op.as_str()
1655 )));
1656 };
1657
1658 let token = pairs.next().unwrap();
1659 let right_op = match token.as_rule() {
1660 Rule::script_block_expression => {
1661 let script_block = self.parse_script_block_expression(token)?;
1662
1663 return Ok(Val::Array(
1664 self.eval_split_special_case(script_block, res)?
1665 .into_iter()
1666 .map(|s| Val::String(s.into()))
1667 .collect::<Vec<_>>(),
1668 ));
1669 }
1670 Rule::additive_exp => self.eval_additive(token)?,
1671 _ => unexpected_token!(token),
1673 };
1674 log::trace!("res: {:?}, right_op: {:?}", &res, &right_op);
1675 res = fun(res, right_op)?;
1676 log::trace!("res: {:?}", &res);
1677 }
1678
1679 Ok(res)
1680 }
1681
1682 fn parse_script_param_block(&mut self, token: Pair<'a>) -> ParserResult<Vec<Param>> {
1683 check_rule!(token, Rule::script_param_block);
1684 let mut pairs = token.into_inner();
1685 let Some(param_block_token) = pairs.next() else {
1686 return Ok(vec![]);
1687 };
1688 self.parse_param_block(param_block_token)
1689 }
1690
1691 fn parse_param_block(&mut self, token: Pair<'a>) -> ParserResult<Vec<Param>> {
1692 check_rule!(token, Rule::param_block);
1693 let mut pairs = token.into_inner();
1694
1695 let Some(token) = pairs.next() else {
1696 return Ok(vec![]);
1697 };
1698
1699 let option_param_token = match token.as_rule() {
1700 Rule::attribute_list => {
1701 pairs.next()
1703 }
1704 Rule::parameter_list => Some(token),
1705 _ => unexpected_token!(token),
1706 };
1707
1708 let Some(param_token) = option_param_token else {
1709 return Ok(vec![]);
1710 };
1711 self.parse_parameter_list(param_token)
1712 }
1713
1714 fn parse_parameter_list(&mut self, token: Pair<'a>) -> ParserResult<Vec<Param>> {
1715 check_rule!(token, Rule::parameter_list);
1716 let mut params = vec![];
1717 let param_list_pairs = token.into_inner();
1718 for script_parameter_token in param_list_pairs {
1719 check_rule!(script_parameter_token, Rule::script_parameter);
1720 params.push(self.parse_script_parameter(script_parameter_token)?);
1721 }
1722 Ok(params)
1723 }
1724
1725 fn parse_attribute_list(&mut self, token: Pair<'a>) -> ParserResult<Option<ValType>> {
1726 check_rule!(token, Rule::attribute_list);
1727 let attribute_list_pairs = token.into_inner();
1728 for attribute_token in attribute_list_pairs {
1729 check_rule!(attribute_token, Rule::attribute);
1730 let attribute_type_token = attribute_token.into_inner().next().unwrap();
1731 match attribute_type_token.as_rule() {
1732 Rule::attribute_info => {
1733 continue;
1735 }
1736 Rule::type_literal => {
1737 return Ok(Some(
1738 self.get_valtype_from_type_literal(attribute_type_token)?,
1739 ));
1740 }
1741 _ => unexpected_token!(attribute_type_token),
1742 }
1743 }
1744 Ok(None)
1745 }
1746 fn parse_script_parameter(&mut self, token: Pair<'a>) -> ParserResult<Param> {
1747 check_rule!(token, Rule::script_parameter);
1748 let mut pairs = token.into_inner();
1749 let mut token = pairs.next().unwrap();
1750
1751 let type_literal = if token.as_rule() == Rule::attribute_list {
1752 let type_literal = self.parse_attribute_list(token)?;
1753 token = pairs.next().unwrap();
1754 type_literal
1755 } else {
1756 None
1757 };
1758
1759 check_rule!(token, Rule::variable);
1760 let var_name = Self::parse_variable(token)?;
1761
1762 let default_value = if let Some(default_value_token) = pairs.next() {
1763 check_rule!(default_value_token, Rule::script_parameter_default);
1764 let default_value_expr = default_value_token.into_inner().next().unwrap();
1765 let default_value = self.eval_primary_expression(default_value_expr)?;
1766 Some(default_value)
1767 } else {
1768 None
1769 };
1770 Ok(Param::new(type_literal, var_name.name, default_value))
1771 }
1772
1773 fn eval_bitwise_exp(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1774 check_rule!(token, Rule::bitwise_exp);
1775
1776 let mut pairs = token.into_inner();
1777 let mut res = self.eval_as_exp(pairs.next().unwrap())?;
1778 while let Some(op) = pairs.next() {
1779 check_rule!(op, Rule::bitwise_operator);
1780 let Some(fun) = BitwisePred::get(op.as_str()) else {
1781 log::error!("No bitwise predicate for operator: {}", op.as_str());
1782 return Err(ParserError::NotImplemented(format!(
1783 "No bitwise predicate for operator: {}",
1784 op.as_str()
1785 )));
1786 };
1787
1788 let mult = pairs.next().unwrap();
1789 let right_op = self.eval_as_exp(mult)?;
1790 res = fun(res, right_op)?;
1791 }
1792
1793 Ok(res)
1794 }
1795
1796 fn eval_as_exp(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1797 check_rule!(token, Rule::as_expression);
1798
1799 let mut pairs = token.into_inner();
1800 let mut res = self.eval_comparison_exp(pairs.next().unwrap())?;
1801 for token in pairs {
1802 let runtime_object = match token.as_rule() {
1803 Rule::type_literal => self.eval_type_literal(token)?,
1804 Rule::comparison_exp => self.eval_comparison_exp(token)?,
1805 _ => unexpected_token!(token),
1806 };
1807
1808 res = res.cast(&runtime_object).unwrap_or_default();
1809 }
1810
1811 Ok(res)
1812 }
1813
1814 fn parse_cmdlet_command_name(&mut self, token: Pair<'a>) -> ParserResult<Command> {
1815 check_rule!(token, Rule::cmdlet_command);
1816
1817 let mut pairs = token.into_inner();
1818 let token = pairs.next().unwrap();
1819 let command_name = match token.as_rule() {
1820 Rule::command_name => token.as_str(),
1821 Rule::where_command_name => "where-object",
1822 Rule::foreach_command_name => "foreach-object",
1823 Rule::powershell_command_name => "powershell",
1824 _ => unexpected_token!(token),
1825 };
1826
1827 let mut command = Command::cmdlet(command_name);
1828 if Rule::command_name == token.as_rule() {
1829 command.set_session_scope(SessionScope::New);
1830 }
1831 Ok(command)
1832 }
1833
1834 fn parse_command_args(&mut self, pairs: Pairs<'a>) -> ParserResult<Vec<CommandElem>> {
1835 let mut args = vec![];
1836 for command_element_token in pairs {
1837 let token_string = command_element_token.as_str().to_string();
1838 match command_element_token.as_rule() {
1839 Rule::command_argument => {
1840 let arg_token = command_element_token.into_inner().next().unwrap();
1841 let arg = match arg_token.as_rule() {
1842 Rule::array_literal_exp => self.eval_array_literal_exp(arg_token)?,
1843 Rule::script_block_expression => {
1844 Val::ScriptBlock(self.parse_script_block_expression(arg_token)?)
1845 }
1846 Rule::parenthesized_expression => {
1847 let token = arg_token.into_inner().next().unwrap();
1848 self.eval_pipeline(token)?
1849 }
1850 _ => Val::ScriptText(arg_token.as_str().to_string()),
1851 };
1852 args.push(CommandElem::Argument(arg));
1853 }
1854 Rule::command_parameter => {
1855 args.push(CommandElem::Parameter(token_string.to_ascii_lowercase()))
1856 }
1857 Rule::argument_list => args.push(CommandElem::ArgList(token_string)),
1858 Rule::splatten_arg => {
1859 let var_name = Self::parse_scoped_variable(command_element_token)?;
1860 let var = self.variables.get(&var_name).unwrap_or_default();
1861 if let Val::HashTable(h) = var {
1862 for (k, v) in h {
1863 args.push(CommandElem::Parameter(format!("-{}", k)));
1864 args.push(CommandElem::Argument(v));
1865 }
1866 }
1867 }
1868 Rule::redirection => { }
1870 Rule::stop_parsing => { }
1872 _ => unexpected_token!(command_element_token),
1873 }
1874 }
1875 Ok(args)
1876 }
1877
1878 fn eval_command(&mut self, token: Pair<'a>, piped_arg: Option<Val>) -> ParserResult<Val> {
1879 check_rule!(token, Rule::command);
1880 let command_str = token.as_str().to_string();
1881
1882 let mut pairs = token.into_inner();
1883 let command_token = pairs.next().unwrap();
1884 let mut command = match command_token.as_rule() {
1885 Rule::cmdlet_command => self.parse_cmdlet_command_name(command_token)?,
1886 Rule::invocation_command => self.parse_invocation_command(command_token)?,
1887 _ => unexpected_token!(command_token),
1888 };
1889
1890 let mut args = self.parse_command_args(pairs)?;
1891 if let Some(arg) = piped_arg {
1892 args.insert(0, CommandElem::Argument(arg));
1893 }
1894
1895 command.with_args(args);
1896 self.tokens
1897 .push(Token::command(command_str, command.name(), command.args()));
1898
1899 match command.execute(self) {
1900 Ok(CommandOutput {
1901 val,
1902 deobfuscated: _deobfuscated,
1903 }) => Ok(val),
1904 Err(e) => {
1905 self.errors.push(e);
1906 Ok(Val::ScriptText(command.to_string()))
1907 }
1908 }
1909
1910 }
1914
1915 fn add_deobfuscated_statement(&mut self, msg: String) {
1916 if let Some(last) = self.results.last_mut() {
1917 last.deobfuscated.push(msg);
1918 }
1919 }
1920
1921 fn add_output_statement(&mut self, msg: StreamMessage) {
1922 if let Some(last) = self.results.last_mut() {
1923 last.output.push(msg);
1924 }
1925 }
1926
1927 fn parse_invocation_command(&mut self, token: Pair<'a>) -> ParserResult<Command> {
1928 check_rule!(token, Rule::invocation_command);
1929
1930 let invocation_command_token = token.into_inner().next().unwrap();
1931
1932 let mut session_scope = match invocation_command_token.as_rule() {
1933 Rule::current_scope_invocation_command => SessionScope::Current,
1934 Rule::new_scope_invocation_command => SessionScope::New,
1935 _ => unexpected_token!(invocation_command_token),
1936 };
1937
1938 let token_inner = invocation_command_token.into_inner().next().unwrap();
1939
1940 let mut command = match token_inner.as_rule() {
1941 Rule::cmdlet_command => {
1942 session_scope = SessionScope::New;
1943 self.parse_cmdlet_command_name(token_inner)?
1944 }
1945 Rule::primary_expression => {
1946 let primary = self.eval_primary_expression(token_inner)?;
1947 if let Val::ScriptBlock(script_block) = primary {
1948 Command::script_block(script_block)
1949 } else {
1950 Command::cmdlet(&primary.cast_to_script())
1951 }
1952 }
1953 Rule::path_command_name => Command::path(token_inner.as_str()),
1954 _ => unexpected_token!(token_inner),
1955 };
1956
1957 command.set_session_scope(session_scope);
1958 Ok(command)
1959 }
1960
1961 fn eval_redirected_expression(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1962 check_rule!(token, Rule::redirected_expression);
1963
1964 let expression_token = token.into_inner().next().unwrap();
1965 self.eval_expression(expression_token)
1968 }
1969
1970 fn eval_expression(&mut self, token: Pair<'a>) -> ParserResult<Val> {
1971 check_rule!(token, Rule::expression);
1972 let token_string = token.as_str().trim().to_string();
1973
1974 let mut pairs = token.into_inner();
1975 let mut res = self.eval_bitwise_exp(pairs.next().unwrap())?;
1976 while let Some(op) = pairs.next() {
1977 check_rule!(op, Rule::logical_operator);
1978 let Some(fun) = LogicalPred::get(op.as_str()) else {
1979 log::error!("No logical predicate for operator: {}", op.as_str());
1980 return Err(ParserError::NotImplemented(format!(
1981 "No logical predicate for operator: {}",
1982 op.as_str()
1983 )));
1984 };
1985
1986 let mult = pairs.next().unwrap();
1987 let right_op = self.eval_bitwise_exp(mult)?;
1988 res = Val::Bool(fun(res, right_op));
1989 }
1990 self.tokens
1991 .push(Token::expression(token_string, res.clone().into()));
1992
1993 if let Val::String(value::PsString(s)) = &res {
1994 self.tokens.push(Token::String(s.clone()));
1995 }
1996
1997 Ok(res)
1998 }
1999
2000 fn eval_pipeline_tail(&mut self, token: Pair<'a>, mut piped_arg: Val) -> ParserResult<Val> {
2001 check_rule!(token, Rule::pipeline_tail);
2002 let pairs = token.into_inner();
2003
2004 for token in pairs {
2005 piped_arg = self.eval_command(token, Some(piped_arg))?;
2007 }
2008
2009 Ok(piped_arg)
2010 }
2011
2012 fn eval_pipeline_with_tail(&mut self, token: Pair<'a>) -> ParserResult<Val> {
2013 check_rule!(token, Rule::pipeline_with_tail);
2014 let mut pairs = token.into_inner();
2015 let token = pairs.next().unwrap();
2016
2017 let result: Val = match token.as_rule() {
2018 Rule::redirected_expression => self.eval_redirected_expression(token)?,
2019 Rule::command => self.eval_command(token, None)?,
2020 _ => unexpected_token!(token),
2021 };
2022
2023 if let Some(token) = pairs.next() {
2024 match token.as_rule() {
2025 Rule::pipeline_tail => Ok(self.eval_pipeline_tail(token, result)?),
2026 _ => unexpected_token!(token),
2027 }
2028 } else {
2029 Ok(result)
2030 }
2031 }
2032
2033 fn eval_pipeline(&mut self, token: Pair<'a>) -> ParserResult<Val> {
2034 check_rule!(token, Rule::pipeline);
2035 let mut pairs = token.into_inner();
2036 let token = pairs.next().unwrap();
2037
2038 match token.as_rule() {
2039 Rule::assignment_exp => self.eval_assigment_exp(token),
2040 Rule::pipeline_with_tail => self.eval_pipeline_with_tail(token),
2041 _ => unexpected_token!(token),
2042 }
2043 }
2044
2045 fn safe_eval_pipeline(&mut self, token: Pair<'a>) -> ParserResult<Val> {
2046 let res = self.eval_pipeline(token.clone());
2047
2048 let v = match res {
2049 Ok(val) => val,
2050 Err(err) => {
2051 self.errors.push(err);
2052 Val::ScriptText(token.as_str().to_string())
2053 }
2054 };
2055
2056 Ok(v)
2057 }
2058
2059 fn eval_cast_expression(&mut self, token: Pair<'a>) -> ParserResult<Val> {
2060 check_rule!(token, Rule::cast_expression);
2061
2062 let mut pairs = token.into_inner();
2063 let type_token = pairs.next().unwrap();
2064 check_rule!(type_token, Rule::type_literal);
2065 let val_type = self.eval_type_literal(type_token)?;
2066 let token = pairs.next().unwrap();
2067 let res = match token.as_rule() {
2068 Rule::parenthesized_expression => {
2069 let token = token.into_inner().next().unwrap();
2070 self.safe_eval_pipeline(token)?
2071 }
2072 Rule::unary_exp => self.eval_unary_exp(token)?,
2073 _ => unexpected_token!(token),
2074 };
2075 Ok(res.cast(&val_type)?)
2076 }
2077
2078 fn eval_assigment_exp(&mut self, token: Pair<'a>) -> ParserResult<Val> {
2079 check_rule!(token, Rule::assignment_exp);
2080
2081 let mut specified_type = None;
2082
2083 let mut pairs = token.into_inner();
2084 let mut token = pairs.next().unwrap();
2085 if token.as_rule() == Rule::type_literal {
2086 specified_type = Some(self.eval_type_literal(token)?);
2087 token = pairs.next().unwrap();
2088 }
2089 let (var_name, access) = self.parse_assignable_variable(token)?;
2090 let mut variable = self.variables.get(&var_name).unwrap_or_default();
2091 let mut accessed_elem = &mut variable;
2092
2093 if let Some(access) = access {
2096 for token in access {
2097 accessed_elem = self.variable_access(token, accessed_elem)?;
2098 }
2099 }
2100 let assignement_op = pairs.next().unwrap();
2101
2102 let op = assignement_op.into_inner().next().unwrap();
2104 let pred = ArithmeticPred::get(op.as_str());
2105
2106 let right_token = pairs.next().unwrap();
2107 let right_op = self.eval_statement(right_token.clone())?;
2108
2109 let Some(pred) = pred else {
2110 log::error!("No arithmetic function for operator: {}", op.as_str());
2111 return Err(ParserError::NotImplemented(format!(
2112 "No arithmetic function for operator: {}",
2113 op.as_str()
2114 )));
2115 };
2116
2117 *accessed_elem = pred(accessed_elem.clone(), right_op)?;
2118 if let Some(runtime_type) = specified_type {
2119 *accessed_elem = accessed_elem.cast(&runtime_type)?;
2120 }
2121 self.variables.set(&var_name, variable.clone())?;
2122 self.add_deobfuscated_statement(format!("{} = {}", var_name, variable.cast_to_script()));
2124
2125 Ok(Val::NonDisplayed(Box::new(variable)))
2126 }
2127
2128 fn push_scope_session(&mut self) {
2129 self.variables.push_scope_session();
2130 }
2131
2132 fn pop_scope_session(&mut self) {
2133 self.variables.pop_scope_session();
2134 }
2135}
2136
2137#[cfg(test)]
2138mod tests {
2139 use pest::Parser;
2140
2141 use super::*;
2142
2143 #[test]
2144 fn comment_and_semicolon() {
2145 let input = r#"
2146# This is a single line comment
2147$a = 1; $b = 2; Write-Output $a
2148
2149Write-Output "Hello" # Another comment
2150
2151<#
2152 This is a
2153 multi-line block comment
2154#>
2155"#;
2156
2157 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2158 }
2159
2160 #[test]
2161 fn while_loop() {
2162 let input = r#"
2163while ($true) {
2164 if ($someCondition) {
2165 break
2166 }
2167 # other code
2168}
2169"#;
2170
2171 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2172 }
2173
2174 #[test]
2175 fn foreach_loop() {
2176 let input = r#"
2177foreach ($n in $numbers) {
2178 Write-Output $n
2179}
2180"#;
2181
2182 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2183 }
2184
2185 #[test]
2186 fn for_loop() {
2187 let input = r#"
2188# Comma separated assignment expressions enclosed in parentheses.
2189for (($i = 0), ($j = 0); $i -lt 10; $i++)
2190{
2191 "`$i:$i"
2192 "`$j:$j"
2193}
2194"#;
2195
2196 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2197 }
2198
2199 #[test]
2200 fn switch() {
2201 let input = r#"
2202switch ($var) {
2203 "a" { Write-Output "A" }
2204 1 { Write-Output "One" }
2205 default { Write-Output "Other" }
2206}
2207"#;
2208
2209 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2210 }
2211
2212 #[test]
2213 fn functions() {
2214 let input = r#"
2215function Get-Square {
2216 param($x)
2217 return $x * $x
2218}
2219
2220function Say-Hello {
2221 Write-Output "Hello"
2222}
2223"#;
2224
2225 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2226 }
2227
2228 #[test]
2229 fn if_expression() {
2230 let input = r#"
2231$x="hello"
2232 Write-Host $x
2233 $y = 42
2234 Start-Process "notepad.exe"
2235
2236 $x = 42
2237if ($x -eq 1) {
2238 Write-Output "One"
2239} elseif ($x -eq 2) {
2240 Write-Output "Two"
2241} else {
2242 Write-Output "Other"
2243}
2244"#;
2245
2246 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2247 }
2248
2249 #[test]
2250 fn command() {
2251 let input = r#"
2252Get-Process | Where-Object { $_.CPU -gt 100 }
2253"#;
2254
2255 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2256 }
2257
2258 #[test]
2259 fn range() {
2260 let input = r#"
2261$numbers = 1..5
2262"#;
2263
2264 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2265 }
2266
2267 #[test]
2268 fn literals() {
2269 let input = r#"
2270$hex = 0xFF
2271
2272$name = "Alice"
2273$msg = "Hello, $name. Today is $day."
2274$escaped = "She said: `"Hi`""
2275$literal = 'Hello, $name'
2276"#;
2277
2278 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2279 }
2280
2281 #[test]
2282 fn floats() {
2283 let input = r#"
2284 $pi = 3.1415
2285$half = .5
2286"#;
2287
2288 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2289 }
2290
2291 #[test]
2292 fn arrays() {
2293 let input = r#"
2294$a = 1, 2, 3
2295$b = @("one", "two", "three")
2296$c = @(1, 2, @(3, 4))
2297"#;
2298
2299 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2300 }
2301
2302 #[test]
2303 fn static_method_call() {
2304 let input = r#"
2305[Threading.Thread]::Sleep(399)
2306"#;
2307
2308 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2309 }
2310
2311 #[test]
2312 fn neg_pipeline() {
2313 let input = r#"
2314-not $input | Where-Object { $_ -gt 5 }
2315"#;
2316
2317 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2318 }
2319
2320 #[test]
2321 fn amsi_fail() {
2322 let input = r#"
2323#Matt Graebers second Reflection method
2324$VMRviwsbtehQfPtxbt=$null;
2325$ilryNQSTt="System.$([cHAR]([ByTE]0x4d)+[ChAR]([byte]0x61)+[chAr](110)+[cHar]([byTE]0x61)+[cHaR](103)+[cHar](101*64/64)+[chaR]([byTE]0x6d)+[cHAr](101)+[CHAr]([byTE]0x6e)+[Char](116*103/103)).$([Char]([ByTe]0x41)+[Char](117+70-70)+[CHAr]([ByTE]0x74)+[CHar]([bYte]0x6f)+[CHar]([bytE]0x6d)+[ChaR]([ByTe]0x61)+[CHar]([bYte]0x74)+[CHAR]([byte]0x69)+[Char](111*26/26)+[chAr]([BYTe]0x6e)).$(('Âmsí'+'Ùtìl'+'s').NORmalizE([ChAR](44+26)+[chAR](111*9/9)+[cHar](82+32)+[ChaR](109*34/34)+[cHaR](68+24-24)) -replace [ChAr](92)+[CHaR]([BYTe]0x70)+[Char]([BytE]0x7b)+[CHaR]([BYTe]0x4d)+[chAR](110)+[ChAr](15+110))"
2326
2327"#;
2328
2329 let _ = PowerShellSession::parse(Rule::program, input).unwrap();
2330 }
2331}