Implemented functions and aliases
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
use std::fmt::Display;
|
||||
use std::fmt::{Debug, Display};
|
||||
|
||||
use crate::prelude::*;
|
||||
|
||||
@@ -74,7 +74,7 @@ impl Lexer {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug,Clone)]
|
||||
#[derive(Clone)]
|
||||
pub struct Token {
|
||||
rule: TkRule,
|
||||
span: Span
|
||||
@@ -98,6 +98,13 @@ impl Token {
|
||||
}
|
||||
}
|
||||
|
||||
impl Debug for Token {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
let info = (self.rule(),self.to_string(),self.span.start,self.span.end);
|
||||
write!(f,"{:?}",info)
|
||||
}
|
||||
}
|
||||
|
||||
impl Display for Token {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
let slice = self.span.get_slice();
|
||||
@@ -462,7 +469,7 @@ tkrule_def!(DQuote, |input: &str| {
|
||||
// Double quoted strings
|
||||
let mut chars = input.chars();
|
||||
let mut len = 0;
|
||||
let mut quoted = false;
|
||||
let mut quote_count = 0;
|
||||
|
||||
while let Some(ch) = chars.next() {
|
||||
match ch {
|
||||
@@ -470,21 +477,38 @@ tkrule_def!(DQuote, |input: &str| {
|
||||
chars.next();
|
||||
len += 2;
|
||||
}
|
||||
'"' if !quoted => {
|
||||
'"' => {
|
||||
len += 1;
|
||||
quoted = true;
|
||||
quote_count += 1;
|
||||
}
|
||||
'"' if quoted => {
|
||||
len += 1;
|
||||
return Some(len)
|
||||
}
|
||||
_ if !quoted => {
|
||||
return None
|
||||
' ' | '\t' | ';' | '\n' if quote_count % 2 == 0 => {
|
||||
if quote_count > 0 {
|
||||
if quote_count % 2 == 0 {
|
||||
return Some(len)
|
||||
} else {
|
||||
return None
|
||||
}
|
||||
} else {
|
||||
return None
|
||||
}
|
||||
}
|
||||
_ => len += 1
|
||||
}
|
||||
}
|
||||
None
|
||||
match len {
|
||||
0 => None,
|
||||
_ => {
|
||||
if quote_count > 0 {
|
||||
if quote_count % 2 == 0 {
|
||||
return Some(len)
|
||||
} else {
|
||||
return None
|
||||
}
|
||||
} else {
|
||||
return None
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
tkrule_def!(ProcSub, |input: &str| {
|
||||
|
||||
@@ -83,6 +83,7 @@ pub enum NdRule {
|
||||
Main { cmd_lists: Vec<Node> },
|
||||
Command { argv: Vec<Token>, redirs: Vec<Redir> },
|
||||
Assignment { assignments: Vec<Token>, cmd: Option<Box<Node>> },
|
||||
FuncDef { name: Token, body: Token },
|
||||
Subshell { body: Token, argv: Vec<Token>, redirs: Vec<Redir> },
|
||||
CmdList { cmds: Vec<(Option<CmdGuard>,Node)> },
|
||||
Pipeline { cmds: Vec<Node> }
|
||||
@@ -255,6 +256,7 @@ ndrule_def!(CmdList, |tokens: &[Token]| {
|
||||
|
||||
ndrule_def!(Expr, |tokens: &[Token]| {
|
||||
try_rules!(tokens,
|
||||
ShellCmd,
|
||||
Pipeline,
|
||||
Subshell,
|
||||
Assignment,
|
||||
@@ -264,12 +266,57 @@ ndrule_def!(Expr, |tokens: &[Token]| {
|
||||
// Used in pipelines to avoid recursion
|
||||
ndrule_def!(ExprNoPipeline, |tokens: &[Token]| {
|
||||
try_rules!(tokens,
|
||||
ShellCmd,
|
||||
Subshell,
|
||||
Assignment,
|
||||
Command
|
||||
);
|
||||
});
|
||||
|
||||
ndrule_def!(ShellCmd, |tokens: &[Token]| {
|
||||
try_rules!(tokens,
|
||||
FuncDef
|
||||
);
|
||||
});
|
||||
|
||||
ndrule_def!(FuncDef, |tokens: &[Token]| {
|
||||
let mut tokens_iter = tokens.iter();
|
||||
let mut node_toks = vec![];
|
||||
let name: Token;
|
||||
let body: Token;
|
||||
|
||||
if let Some(token) = tokens_iter.next() {
|
||||
if let TkRule::FuncName = token.rule() {
|
||||
node_toks.push(token.clone());
|
||||
name = token.clone();
|
||||
} else {
|
||||
return Ok(None)
|
||||
}
|
||||
} else {
|
||||
return Ok(None)
|
||||
}
|
||||
|
||||
if let Some(token) = tokens_iter.next() {
|
||||
if let TkRule::BraceGrp = token.rule() {
|
||||
node_toks.push(token.clone());
|
||||
body = token.clone();
|
||||
} else {
|
||||
return Ok(None)
|
||||
}
|
||||
} else {
|
||||
return Ok(None)
|
||||
}
|
||||
|
||||
let span = get_span(&node_toks)?;
|
||||
let node = Node {
|
||||
node_rule: NdRule::FuncDef { name, body },
|
||||
tokens: node_toks,
|
||||
span,
|
||||
flags: NdFlag::empty()
|
||||
};
|
||||
Ok(Some(node))
|
||||
});
|
||||
|
||||
ndrule_def!(Subshell, |tokens: &[Token]| {
|
||||
let mut tokens_iter = tokens.iter();
|
||||
let mut node_toks = vec![];
|
||||
|
||||
Reference in New Issue
Block a user