Implemented arithmetic substitution

This commit is contained in:
2025-03-07 04:30:17 -05:00
parent 11576e9e08
commit fb0a3af428
11 changed files with 201 additions and 55 deletions

View File

@@ -343,7 +343,6 @@ ndrule_def!(ShellCmd, shenv, |tokens: &[Token], shenv: &mut ShEnv| {
});
ndrule_def!(Case, shenv, |mut tokens: &[Token], shenv: &mut ShEnv| {
log!(DEBUG, tokens);
let err = |msg: &str, span: Rc<RefCell<Span>>, shenv: &mut ShEnv | {
ShErr::full(ShErrKind::ParseErr, msg, shenv.get_input(), span)
};
@@ -411,7 +410,6 @@ ndrule_def!(Case, shenv, |mut tokens: &[Token], shenv: &mut ShEnv| {
}
}
}
log!(DEBUG,tokens);
tokens_iter = tokens.iter().peekable();
if tokens_iter.peek().is_none() {
@@ -431,14 +429,10 @@ ndrule_def!(Case, shenv, |mut tokens: &[Token], shenv: &mut ShEnv| {
let block_pat = token.clone();
let (used,lists) = get_lists(tokens, shenv);
let mut lists_iter = lists.iter().peekable();
log!(DEBUG, used);
log!(DEBUG, lists);
while let Some(list) = lists_iter.next() {
node_toks.extend(list.tokens.clone());
if lists_iter.peek().is_none() {
log!(DEBUG, list);
for token in list.tokens() {
log!(DEBUG, "{}", token.as_raw(shenv));
}
}
if let Some(token) = list.tokens().last() {
@@ -482,7 +476,6 @@ ndrule_def!(Case, shenv, |mut tokens: &[Token], shenv: &mut ShEnv| {
redirs.push(redir);
}
_ => {
log!(DEBUG, token);
return Err(err("Expected `esac` or a case block here", node_toks.last().unwrap().span(), shenv))
}
}
@@ -523,7 +516,6 @@ ndrule_def!(ForLoop, shenv, |mut tokens: &[Token], shenv: &mut ShEnv| {
} else { return Ok(None) }
while let Some(token) = tokens_iter.next() {
log!(DEBUG, token);
node_toks.push(token.clone());
tokens = &tokens[1..];
match token.rule() {
@@ -656,7 +648,6 @@ ndrule_def!(ForLoop, shenv, |mut tokens: &[Token], shenv: &mut ShEnv| {
});
ndrule_def!(IfThen, shenv, |mut tokens: &[Token], shenv: &mut ShEnv| {
log!(DEBUG,tokens);
let err = |msg: &str, span: Rc<RefCell<Span>>, shenv: &mut ShEnv | {
ShErr::full(ShErrKind::ParseErr, msg, shenv.get_input(), span)
};
@@ -666,7 +657,6 @@ ndrule_def!(IfThen, shenv, |mut tokens: &[Token], shenv: &mut ShEnv| {
let mut redirs = vec![];
let mut else_block: Option<Vec<Node>> = None;
log!(DEBUG,tokens);
if let Some(token) = tokens_iter.next() {
if let TkRule::If = token.rule() {
node_toks.push(token.clone());
@@ -1151,6 +1141,7 @@ ndrule_def!(Command, shenv, |tokens: &[Token], shenv: &mut ShEnv| {
TkRule::DQuote |
TkRule::Assign |
TkRule::TildeSub |
TkRule::ArithSub |
TkRule::VarSub => {
argv.push(token.clone());
}
@@ -1228,13 +1219,11 @@ ndrule_def!(Assignment, shenv, |tokens: &[Token], shenv: &mut ShEnv| {
};
return Ok(Some(node))
} else {
log!(DEBUG, tokens);
if let Some(token) = tokens.next() {
if token.rule() == TkRule::Sep {
node_toks.push(token.clone());
}
}
log!(DEBUG, node_toks);
let span = get_span(&node_toks,shenv)?;
let node = Node {