Pass some docs tests

This commit is contained in:
Jeff 2024-08-23 16:47:57 -04:00
parent ab53df56bc
commit e45ac042b9
3 changed files with 34 additions and 41 deletions

View File

@ -55,11 +55,11 @@ pub fn lex<'chars, 'src: 'chars>(
/// ``` /// ```
/// # use dust_lang::*; /// # use dust_lang::*;
/// let input = "x = 1 + 2"; /// let input = "x = 1 + 2";
/// let mut lexer = Lexer::new(); /// let mut lexer = Lexer::new(input);
/// let mut tokens = Vec::new(); /// let mut tokens = Vec::new();
/// ///
/// loop { /// loop {
/// let (token, span) = lexer.next_token(input).unwrap(); /// let (token, span) = lexer.next_token().unwrap();
/// let is_eof = matches!(token, Token::Eof); /// let is_eof = matches!(token, Token::Eof);
/// ///
/// tokens.push((token, span)); /// tokens.push((token, span));

View File

@ -32,7 +32,7 @@ pub mod value;
pub mod vm; pub mod vm;
pub use analyzer::{analyze, AnalysisError, Analyzer}; pub use analyzer::{analyze, AnalysisError, Analyzer};
pub use ast::{AbstractSyntaxTree, Expression, Span, Statement}; pub use ast::{AbstractSyntaxTree, AstError, Expression, Node, Span, Statement};
pub use built_in_function::{BuiltInFunction, BuiltInFunctionError}; pub use built_in_function::{BuiltInFunction, BuiltInFunctionError};
pub use constructor::Constructor; pub use constructor::Constructor;
pub use context::{Context, ContextData, ContextError}; pub use context::{Context, ContextData, ContextError};

View File

@ -16,31 +16,21 @@ use crate::{ast::*, DustError, Identifier, LexError, Lexer, Token, TokenKind, To
/// # Examples /// # Examples
/// ``` /// ```
/// # use dust_lang::*; /// # use dust_lang::*;
/// let tree = parse("x + 42").unwrap(); /// let source = "42.to_string()";
/// ///
/// assert_eq!( /// assert_eq!(
/// tree, /// parse(source),
/// AbstractSyntaxTree { /// Ok(AbstractSyntaxTree::with_statements([
/// nodes: [ /// Statement::Expression(Expression::call(
/// Node::new( /// Expression::field_access(
/// Statement::BinaryOperation { /// Expression::literal(42, (0, 2)),
/// left: Box::new(Node::new( /// Node::new(Identifier::new("to_string"), (3, 12)),
/// Statement::Identifier(Identifier::new("x")), /// (0, 12)
/// (0, 1),
/// )),
/// operator: Node::new(
/// BinaryOperator::Add,
/// (2, 3)
/// ), /// ),
/// right: Box::new(Node::new( /// vec![],
/// Statement::Constant(Value::integer(42)), /// (0, 14)
/// (4, 6),
/// )) /// ))
/// }, /// ]))
/// (0, 6),
/// )
/// ].into(),
/// },
/// ); /// );
/// ``` /// ```
pub fn parse(source: &str) -> Result<AbstractSyntaxTree, DustError> { pub fn parse(source: &str) -> Result<AbstractSyntaxTree, DustError> {
@ -55,7 +45,8 @@ pub fn parse_into<'src>(
source: &'src str, source: &'src str,
tree: &mut AbstractSyntaxTree, tree: &mut AbstractSyntaxTree,
) -> Result<(), DustError<'src>> { ) -> Result<(), DustError<'src>> {
let mut parser = Parser::new(source); let lexer = Lexer::new(source);
let mut parser = Parser::new(lexer);
loop { loop {
let node = parser let node = parser
@ -82,21 +73,21 @@ pub fn parse_into<'src>(
/// # use std::collections::VecDeque; /// # use std::collections::VecDeque;
/// # use dust_lang::*; /// # use dust_lang::*;
/// let source = "x = 42"; /// let source = "x = 42";
/// let lexer = Lexer::new(); /// let lexer = Lexer::new(source);
/// let mut parser = Parser::new(input, lexer); /// let mut parser = Parser::new(lexer);
/// let mut nodes = VecDeque::new(); /// let mut statements = VecDeque::new();
/// ///
/// loop { /// loop {
/// let node = parser.parse().unwrap(); /// let statement = parser.parse_statement().unwrap();
/// ///
/// nodes.push_back(node); /// statements.push_back(statement);
/// ///
/// if let Token::Eof = parser.current().0 { /// if parser.is_eof() {
/// break; /// break;
/// } /// }
/// } /// }
/// ///
/// let tree = AbstractSyntaxTree { nodes }; /// let tree = AbstractSyntaxTree { statements };
/// ///
/// ``` /// ```
pub struct Parser<'src> { pub struct Parser<'src> {
@ -107,8 +98,7 @@ pub struct Parser<'src> {
} }
impl<'src> Parser<'src> { impl<'src> Parser<'src> {
pub fn new(source: &'src str) -> Self { pub fn new(mut lexer: Lexer<'src>) -> Self {
let mut lexer = Lexer::new(source);
let (current_token, current_position) = lexer.next_token().unwrap_or((Token::Eof, (0, 0))); let (current_token, current_position) = lexer.next_token().unwrap_or((Token::Eof, (0, 0)));
Parser { Parser {
@ -119,6 +109,10 @@ impl<'src> Parser<'src> {
} }
} }
pub fn is_eof(&self) -> bool {
matches!(self.current_token, Token::Eof)
}
pub fn parse_statement(&mut self) -> Result<Statement, ParseError> { pub fn parse_statement(&mut self) -> Result<Statement, ParseError> {
let start_position = self.current_position; let start_position = self.current_position;
@ -1295,16 +1289,15 @@ mod tests {
assert_eq!( assert_eq!(
parse(source), parse(source),
Ok(AbstractSyntaxTree { Ok(AbstractSyntaxTree::with_statements([Statement::Let(
statements: [Statement::Let(Node::new( Node::new(
LetStatement::Let { LetStatement::Let {
identifier: Node::new(Identifier::new("x"), (4, 5)), identifier: Node::new(Identifier::new("x"), (4, 5)),
value: Expression::literal(42, (8, 10)), value: Expression::literal(42, (8, 10)),
}, },
(0, 11), (0, 11),
))] )
.into() )]))
})
); );
} }