v0.3.0 #1
@ -3,7 +3,7 @@
|
|||||||
use error::{AResult, ErrorKind::*};
|
use error::{AResult, ErrorKind::*};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::{assembler::canonical::Canonicalize, lexer::token, parser::ast::*, util::Span};
|
use crate::{assembler::canonical::Canonicalize, lexer::token, parser::ast::*, span::Span};
|
||||||
|
|
||||||
use self::error::{Error, ErrorKind};
|
use self::error::{Error, ErrorKind};
|
||||||
|
|
||||||
@ -366,7 +366,7 @@ impl<'t> Assembler<'t> {
|
|||||||
pub mod error {
|
pub mod error {
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
|
|
||||||
use crate::util::Span;
|
use crate::span::Span;
|
||||||
|
|
||||||
pub type AResult<T> = Result<T, Error>;
|
pub type AResult<T> = Result<T, Error>;
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
pub mod token;
|
pub mod token;
|
||||||
|
|
||||||
use self::token::{Special, TokenKind, *};
|
use self::token::{Special, TokenKind, *};
|
||||||
use crate::util::Span;
|
use crate::span::Span;
|
||||||
use std::{
|
use std::{
|
||||||
iter::Peekable,
|
iter::Peekable,
|
||||||
str::{CharIndices, FromStr},
|
str::{CharIndices, FromStr},
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
//! A [Token] is a [semantically-tagged](TokenKind) [sequence of characters](str) and a [Span]
|
//! A [Token] is a [semantically-tagged](TokenKind) [sequence of characters](str) and a [Span]
|
||||||
//!
|
//!
|
||||||
//! [Tokens](Token) are a borrowed, and cannot outlive their source slice (lifetime `'t`)
|
//! [Tokens](Token) are a borrowed, and cannot outlive their source slice (lifetime `'t`)
|
||||||
use crate::util::Span;
|
use crate::span::Span;
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
pub struct Token<'t> {
|
pub struct Token<'t> {
|
||||||
pub lexeme: &'t str,
|
pub lexeme: &'t str,
|
||||||
|
45
src/lib.rs
45
src/lib.rs
@ -54,50 +54,7 @@
|
|||||||
//! └─ EndOfFile
|
//! └─ EndOfFile
|
||||||
//! ```
|
//! ```
|
||||||
|
|
||||||
pub mod util {
|
pub mod span;
|
||||||
use std::{
|
|
||||||
fmt::{Debug, Display},
|
|
||||||
ops::{Index, Range},
|
|
||||||
};
|
|
||||||
/// A <code> [Clone] + [Copy] + [!Iterator](Iterator) <\code> version of a [Range]
|
|
||||||
#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
|
||||||
pub struct Span<Idx> {
|
|
||||||
pub start: Idx,
|
|
||||||
pub end: Idx,
|
|
||||||
}
|
|
||||||
impl<Idx> From<Span<Idx>> for Range<Idx> {
|
|
||||||
fn from(value: Span<Idx>) -> Self {
|
|
||||||
value.start..value.end
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<Idx> From<Range<Idx>> for Span<Idx> {
|
|
||||||
fn from(value: Range<Idx>) -> Self {
|
|
||||||
Self { start: value.start, end: value.end }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<T> Index<Span<usize>> for [T] {
|
|
||||||
type Output = [T];
|
|
||||||
fn index(&self, index: Span<usize>) -> &Self::Output {
|
|
||||||
self.index(Range::from(index))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl Index<Span<usize>> for str {
|
|
||||||
type Output = str;
|
|
||||||
fn index(&self, index: Span<usize>) -> &Self::Output {
|
|
||||||
self.index(Range::from(index))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<Idx: Debug> Debug for Span<Idx> {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(f, "{:?}..{:?}", self.start, self.end)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl<Idx: Display> Display for Span<Idx> {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(f, "{}..{}", self.start, self.end)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub mod lexer;
|
pub mod lexer;
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ use crate::{
|
|||||||
Lexer,
|
Lexer,
|
||||||
},
|
},
|
||||||
preprocessor::Preprocessor,
|
preprocessor::Preprocessor,
|
||||||
util::Span,
|
span::Span,
|
||||||
};
|
};
|
||||||
use ast::*;
|
use ast::*;
|
||||||
|
|
||||||
@ -497,7 +497,7 @@ impl<'t> Parser<'t> {
|
|||||||
|
|
||||||
pub mod error {
|
pub mod error {
|
||||||
use super::Kind;
|
use super::Kind;
|
||||||
use crate::util::Span;
|
use crate::span::Span;
|
||||||
use std::{fmt::Display, num::TryFromIntError};
|
use std::{fmt::Display, num::TryFromIntError};
|
||||||
|
|
||||||
pub type PResult<T> = Result<T, Error>;
|
pub type PResult<T> = Result<T, Error>;
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
/// Represents MSP430 instructions,
|
/// Represents MSP430 instructions,
|
||||||
use crate::{
|
use crate::{
|
||||||
lexer::token::{self, Reg, Token},
|
lexer::token::{self, Reg, Token},
|
||||||
util::Span,
|
span::Span,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
@ -5,7 +5,7 @@ use crate::{
|
|||||||
token::{Token, TokenKind as Kind},
|
token::{Token, TokenKind as Kind},
|
||||||
Lexer,
|
Lexer,
|
||||||
},
|
},
|
||||||
util::Span,
|
span::Span,
|
||||||
};
|
};
|
||||||
use std::collections::{HashMap, VecDeque};
|
use std::collections::{HashMap, VecDeque};
|
||||||
|
|
||||||
|
43
src/span.rs
Normal file
43
src/span.rs
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
//! A [Span] is a [Range] that does not implement [Iterator]. It is a [Copy] type.
|
||||||
|
use std::{
|
||||||
|
fmt::{Debug, Display},
|
||||||
|
ops::{Index, Range},
|
||||||
|
};
|
||||||
|
/// A <code> [Clone] + [Copy] + [!Iterator](Iterator) </code> version of a [Range]
|
||||||
|
#[derive(Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
|
pub struct Span<Idx> {
|
||||||
|
pub start: Idx,
|
||||||
|
pub end: Idx,
|
||||||
|
}
|
||||||
|
impl<Idx> From<Span<Idx>> for Range<Idx> {
|
||||||
|
fn from(value: Span<Idx>) -> Self {
|
||||||
|
value.start..value.end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<Idx> From<Range<Idx>> for Span<Idx> {
|
||||||
|
fn from(value: Range<Idx>) -> Self {
|
||||||
|
Self { start: value.start, end: value.end }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T> Index<Span<usize>> for [T] {
|
||||||
|
type Output = [T];
|
||||||
|
fn index(&self, index: Span<usize>) -> &Self::Output {
|
||||||
|
self.index(Range::from(index))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Index<Span<usize>> for str {
|
||||||
|
type Output = str;
|
||||||
|
fn index(&self, index: Span<usize>) -> &Self::Output {
|
||||||
|
self.index(Range::from(index))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<Idx: Debug> Debug for Span<Idx> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "{:?}..{:?}", self.start, self.end)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<Idx: Display> Display for Span<Idx> {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "{}..{}", self.start, self.end)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user