Add item type to list value; Clean up
This commit is contained in:
parent
9c612317dc
commit
30b2801a38
@ -57,6 +57,7 @@ pub enum Token<'src> {
|
|||||||
Minus,
|
Minus,
|
||||||
MinusEqual,
|
MinusEqual,
|
||||||
Percent,
|
Percent,
|
||||||
|
PercentEqual,
|
||||||
Plus,
|
Plus,
|
||||||
PlusEqual,
|
PlusEqual,
|
||||||
RightCurlyBrace,
|
RightCurlyBrace,
|
||||||
@ -116,6 +117,7 @@ impl<'src> Token<'src> {
|
|||||||
Token::Minus => 1,
|
Token::Minus => 1,
|
||||||
Token::MinusEqual => 2,
|
Token::MinusEqual => 2,
|
||||||
Token::Percent => 1,
|
Token::Percent => 1,
|
||||||
|
Token::PercentEqual => 2,
|
||||||
Token::Plus => 1,
|
Token::Plus => 1,
|
||||||
Token::PlusEqual => 2,
|
Token::PlusEqual => 2,
|
||||||
Token::Return => 6,
|
Token::Return => 6,
|
||||||
@ -171,6 +173,7 @@ impl<'src> Token<'src> {
|
|||||||
Token::MinusEqual => TokenOwned::MinusEqual,
|
Token::MinusEqual => TokenOwned::MinusEqual,
|
||||||
Token::Mut => TokenOwned::Mut,
|
Token::Mut => TokenOwned::Mut,
|
||||||
Token::Percent => TokenOwned::Percent,
|
Token::Percent => TokenOwned::Percent,
|
||||||
|
Token::PercentEqual => TokenOwned::PercentEqual,
|
||||||
Token::Plus => TokenOwned::Plus,
|
Token::Plus => TokenOwned::Plus,
|
||||||
Token::PlusEqual => TokenOwned::PlusEqual,
|
Token::PlusEqual => TokenOwned::PlusEqual,
|
||||||
Token::Return => TokenOwned::Return,
|
Token::Return => TokenOwned::Return,
|
||||||
@ -230,6 +233,7 @@ impl<'src> Token<'src> {
|
|||||||
Token::MinusEqual => TokenKind::MinusEqual,
|
Token::MinusEqual => TokenKind::MinusEqual,
|
||||||
Token::Mut => TokenKind::Mut,
|
Token::Mut => TokenKind::Mut,
|
||||||
Token::Percent => TokenKind::Percent,
|
Token::Percent => TokenKind::Percent,
|
||||||
|
Token::PercentEqual => TokenKind::PercentEqual,
|
||||||
Token::Plus => TokenKind::Plus,
|
Token::Plus => TokenKind::Plus,
|
||||||
Token::PlusEqual => TokenKind::PlusEqual,
|
Token::PlusEqual => TokenKind::PlusEqual,
|
||||||
Token::Return => TokenKind::Return,
|
Token::Return => TokenKind::Return,
|
||||||
@ -291,6 +295,7 @@ impl<'src> Display for Token<'src> {
|
|||||||
Token::MinusEqual => write!(f, "-="),
|
Token::MinusEqual => write!(f, "-="),
|
||||||
Token::Mut => write!(f, "mut"),
|
Token::Mut => write!(f, "mut"),
|
||||||
Token::Percent => write!(f, "%"),
|
Token::Percent => write!(f, "%"),
|
||||||
|
Token::PercentEqual => write!(f, "%="),
|
||||||
Token::Plus => write!(f, "+"),
|
Token::Plus => write!(f, "+"),
|
||||||
Token::PlusEqual => write!(f, "+="),
|
Token::PlusEqual => write!(f, "+="),
|
||||||
Token::Return => write!(f, "return"),
|
Token::Return => write!(f, "return"),
|
||||||
@ -365,6 +370,7 @@ pub enum TokenOwned {
|
|||||||
Minus,
|
Minus,
|
||||||
MinusEqual,
|
MinusEqual,
|
||||||
Percent,
|
Percent,
|
||||||
|
PercentEqual,
|
||||||
Plus,
|
Plus,
|
||||||
PlusEqual,
|
PlusEqual,
|
||||||
RightCurlyBrace,
|
RightCurlyBrace,
|
||||||
@ -420,6 +426,7 @@ impl Display for TokenOwned {
|
|||||||
TokenOwned::MinusEqual => Token::MinusEqual.fmt(f),
|
TokenOwned::MinusEqual => Token::MinusEqual.fmt(f),
|
||||||
TokenOwned::Mut => Token::Mut.fmt(f),
|
TokenOwned::Mut => Token::Mut.fmt(f),
|
||||||
TokenOwned::Percent => Token::Percent.fmt(f),
|
TokenOwned::Percent => Token::Percent.fmt(f),
|
||||||
|
TokenOwned::PercentEqual => Token::PercentEqual.fmt(f),
|
||||||
TokenOwned::Plus => Token::Plus.fmt(f),
|
TokenOwned::Plus => Token::Plus.fmt(f),
|
||||||
TokenOwned::PlusEqual => Token::PlusEqual.fmt(f),
|
TokenOwned::PlusEqual => Token::PlusEqual.fmt(f),
|
||||||
TokenOwned::Return => Token::Return.fmt(f),
|
TokenOwned::Return => Token::Return.fmt(f),
|
||||||
@ -492,6 +499,7 @@ pub enum TokenKind {
|
|||||||
MinusEqual,
|
MinusEqual,
|
||||||
Mut,
|
Mut,
|
||||||
Percent,
|
Percent,
|
||||||
|
PercentEqual,
|
||||||
Plus,
|
Plus,
|
||||||
PlusEqual,
|
PlusEqual,
|
||||||
RightCurlyBrace,
|
RightCurlyBrace,
|
||||||
@ -547,6 +555,7 @@ impl Display for TokenKind {
|
|||||||
TokenKind::MinusEqual => Token::MinusEqual.fmt(f),
|
TokenKind::MinusEqual => Token::MinusEqual.fmt(f),
|
||||||
TokenKind::Mut => Token::Mut.fmt(f),
|
TokenKind::Mut => Token::Mut.fmt(f),
|
||||||
TokenKind::Percent => Token::Percent.fmt(f),
|
TokenKind::Percent => Token::Percent.fmt(f),
|
||||||
|
TokenKind::PercentEqual => Token::PercentEqual.fmt(f),
|
||||||
TokenKind::Plus => Token::Plus.fmt(f),
|
TokenKind::Plus => Token::Plus.fmt(f),
|
||||||
TokenKind::PlusEqual => Token::PlusEqual.fmt(f),
|
TokenKind::PlusEqual => Token::PlusEqual.fmt(f),
|
||||||
TokenKind::Return => Token::Return.fmt(f),
|
TokenKind::Return => Token::Return.fmt(f),
|
||||||
|
@ -67,8 +67,12 @@ impl Value {
|
|||||||
Value::Primitive(Primitive::Integer(into_i64.into()))
|
Value::Primitive(Primitive::Integer(into_i64.into()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn list(start: u8, end: u8) -> Self {
|
pub fn list(start: u8, end: u8, item_type: Type) -> Self {
|
||||||
Value::Object(Object::List { start, end })
|
Value::Object(Object::List {
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
item_type,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn string<T: ToString>(to_string: T) -> Self {
|
pub fn string<T: ToString>(to_string: T) -> Self {
|
||||||
@ -78,7 +82,18 @@ impl Value {
|
|||||||
pub fn r#type(&self) -> Type {
|
pub fn r#type(&self) -> Type {
|
||||||
match self {
|
match self {
|
||||||
Value::Primitive(data) => data.r#type(),
|
Value::Primitive(data) => data.r#type(),
|
||||||
Value::Object(object) => todo!(),
|
Value::Object(Object::List {
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
item_type,
|
||||||
|
}) => {
|
||||||
|
let length = (end - start + 1) as usize;
|
||||||
|
|
||||||
|
Type::List {
|
||||||
|
length,
|
||||||
|
item_type: Box::new(item_type.clone()),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -843,13 +858,13 @@ impl Ord for RangeValue {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
|
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
|
||||||
pub enum Object {
|
pub enum Object {
|
||||||
List { start: u8, end: u8 },
|
List { start: u8, end: u8, item_type: Type },
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Object {
|
impl Object {
|
||||||
fn display(&self, vm: &Vm, position: Span) -> Result<String, ValueError> {
|
fn display(&self, vm: &Vm, position: Span) -> Result<String, ValueError> {
|
||||||
match self {
|
match self {
|
||||||
Object::List { start, end } => {
|
Object::List { start, end, .. } => {
|
||||||
let mut display = String::from("[");
|
let mut display = String::from("[");
|
||||||
let (start, end) = (*start, *end);
|
let (start, end) = (*start, *end);
|
||||||
|
|
||||||
|
@ -116,7 +116,8 @@ impl Vm {
|
|||||||
let to_register = instruction.a();
|
let to_register = instruction.a();
|
||||||
let first_register = instruction.b();
|
let first_register = instruction.b();
|
||||||
let last_register = instruction.c();
|
let last_register = instruction.c();
|
||||||
let value = Value::list(first_register, last_register);
|
let item_type = self.get(first_register, position)?.r#type();
|
||||||
|
let value = Value::list(first_register, last_register, item_type);
|
||||||
|
|
||||||
self.set(to_register, value, position)?;
|
self.set(to_register, value, position)?;
|
||||||
}
|
}
|
||||||
@ -137,7 +138,6 @@ impl Vm {
|
|||||||
identifier: local.identifier.clone(),
|
identifier: local.identifier.clone(),
|
||||||
position,
|
position,
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
let value = self.take(from_register, to_register, position)?;
|
let value = self.take(from_register, to_register, position)?;
|
||||||
|
|
||||||
self.set(to_register, value, position)?;
|
self.set(to_register, value, position)?;
|
||||||
|
@ -506,7 +506,7 @@ fn list() {
|
|||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(run(source), Ok(Some(Value::list(0, 2))));
|
assert_eq!(run(source), Ok(Some(Value::list(0, 2, Type::Integer))));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -546,7 +546,7 @@ fn list_with_complex_expression() {
|
|||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(run(source), Ok(Some(Value::list(0, 3))));
|
assert_eq!(run(source), Ok(Some(Value::list(0, 3, Type::Integer))));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -578,7 +578,7 @@ fn list_with_simple_expression() {
|
|||||||
)),
|
)),
|
||||||
);
|
);
|
||||||
|
|
||||||
assert_eq!(run(source), Ok(Some(Value::list(0, 2))));
|
assert_eq!(run(source), Ok(Some(Value::list(0, 2, Type::Integer))));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -45,22 +45,22 @@ fn main() {
|
|||||||
|
|
||||||
if let Some(command) = &args.command {
|
if let Some(command) = &args.command {
|
||||||
if args.parse {
|
if args.parse {
|
||||||
parse_and_display_errors(command, args.styled);
|
parse_and_display(command, args.styled);
|
||||||
} else {
|
} else {
|
||||||
run_and_display_errors(command);
|
run_and_display(command);
|
||||||
}
|
}
|
||||||
} else if let Some(path) = &args.path {
|
} else if let Some(path) = &args.path {
|
||||||
let source = read_to_string(path).expect("Failed to read file");
|
let source = read_to_string(path).expect("Failed to read file");
|
||||||
|
|
||||||
if args.parse {
|
if args.parse {
|
||||||
parse_and_display_errors(&source, args.styled);
|
parse_and_display(&source, args.styled);
|
||||||
} else {
|
} else {
|
||||||
run_and_display_errors(&source);
|
run_and_display(&source);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_and_display_errors(source: &str, pretty_print: bool) {
|
fn parse_and_display(source: &str, pretty_print: bool) {
|
||||||
match parse(source) {
|
match parse(source) {
|
||||||
Ok(chunk) => println!(
|
Ok(chunk) => println!(
|
||||||
"{}",
|
"{}",
|
||||||
@ -75,7 +75,7 @@ fn parse_and_display_errors(source: &str, pretty_print: bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_and_display_errors(source: &str) {
|
fn run_and_display(source: &str) {
|
||||||
match run(source) {
|
match run(source) {
|
||||||
Ok(Some(value)) => println!("{}", value),
|
Ok(Some(value)) => println!("{}", value),
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
|
Loading…
Reference in New Issue
Block a user