diff --git a/src/compile.rs b/src/compile.rs index c457ae8..b6f6021 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -6,6 +6,7 @@ //! https://github.com/micropython/micropython/blob/master/py/compile.c use crate::error::{CompileError, CompileErrorType}; +pub use crate::mode::Mode; use crate::output_stream::{CodeObjectStream, OutputStream}; use crate::peephole::PeepholeOptimizer; use crate::symboltable::{ @@ -105,36 +106,6 @@ pub fn compile_program_single( }) } -#[derive(Clone, Copy)] -pub enum Mode { - Exec, - Eval, - Single, -} - -impl std::str::FromStr for Mode { - type Err = ModeParseError; - fn from_str(s: &str) -> Result { - match s { - "exec" => Ok(Mode::Exec), - "eval" => Ok(Mode::Eval), - "single" => Ok(Mode::Single), - _ => Err(ModeParseError { _priv: () }), - } - } -} - -#[derive(Debug)] -pub struct ModeParseError { - _priv: (), -} - -impl std::fmt::Display for ModeParseError { - fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, r#"mode should be "exec", "eval", or "single""#) - } -} - impl Default for Compiler where O: OutputStream, diff --git a/src/lib.rs b/src/lib.rs index 9e18f1c..4d46935 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,6 +8,7 @@ extern crate log; pub mod compile; pub mod error; +pub mod mode; pub(crate) mod output_stream; pub mod peephole; pub mod symboltable; diff --git a/src/mode.rs b/src/mode.rs new file mode 100644 index 0000000..0813775 --- /dev/null +++ b/src/mode.rs @@ -0,0 +1,40 @@ +use rustpython_parser::parser; + +#[derive(Clone, Copy)] +pub enum Mode { + Exec, + Eval, + Single, +} + +impl std::str::FromStr for Mode { + type Err = ModeParseError; + fn from_str(s: &str) -> Result { + match s { + "exec" => Ok(Mode::Exec), + "eval" => Ok(Mode::Eval), + "single" => Ok(Mode::Single), + _ => Err(ModeParseError { _priv: () }), + } + } +} + +impl Mode { + pub fn to_parser_mode(self) -> parser::Mode { + match self { + Self::Exec | Self::Single => parser::Mode::Program, + Self::Eval => parser::Mode::Statement, + } + } +} + +#[derive(Debug)] +pub struct ModeParseError { + _priv: (), +} + +impl std::fmt::Display for ModeParseError { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, r#"mode should be "exec", "eval", or "single""#) + } +}