Swap over parser
This commit is contained in:
parent
205ab7179d
commit
4b0aced11f
@ -14,8 +14,8 @@ fn getline(arg) { }
|
|||||||
|
|
||||||
fn map(input: Option<T>, func: Func): Option<T> {
|
fn map(input: Option<T>, func: Func): Option<T> {
|
||||||
if input {
|
if input {
|
||||||
is Option::Some(x) then Option::Some(func(x)),
|
is Option::Some(x) then Option::Some(func(x))
|
||||||
is Option::None then Option::None,
|
is Option::None then Option::None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ pub struct Schala<'a> {
|
|||||||
/// Contains information for type-checking
|
/// Contains information for type-checking
|
||||||
type_context: type_inference::TypeContext,
|
type_context: type_inference::TypeContext,
|
||||||
/// Schala Parser
|
/// Schala Parser
|
||||||
active_parser: parsing::Parser,
|
active_parser: parsing::new::Parser,
|
||||||
|
|
||||||
/// Execution state for AST-walking interpreter
|
/// Execution state for AST-walking interpreter
|
||||||
eval_state: tree_walk_eval::State<'a>,
|
eval_state: tree_walk_eval::State<'a>,
|
||||||
@ -47,7 +47,7 @@ impl<'a> Schala<'a> {
|
|||||||
source_reference: SourceReference::new(),
|
source_reference: SourceReference::new(),
|
||||||
symbol_table: symbol_table::SymbolTable::new(),
|
symbol_table: symbol_table::SymbolTable::new(),
|
||||||
type_context: type_inference::TypeContext::new(),
|
type_context: type_inference::TypeContext::new(),
|
||||||
active_parser: parsing::Parser::new(),
|
active_parser: parsing::new::Parser::new(),
|
||||||
eval_state: tree_walk_eval::State::new(),
|
eval_state: tree_walk_eval::State::new(),
|
||||||
timings: Vec::new(),
|
timings: Vec::new(),
|
||||||
}
|
}
|
||||||
@ -74,18 +74,10 @@ impl<'a> Schala<'a> {
|
|||||||
self.timings = vec![];
|
self.timings = vec![];
|
||||||
let sw = Stopwatch::start_new();
|
let sw = Stopwatch::start_new();
|
||||||
|
|
||||||
// 1st stage - tokenization
|
self.source_reference.load_new_source(source);
|
||||||
// TODO tokenize should return its own error type
|
|
||||||
let tokens = tokenizing::tokenize(source);
|
|
||||||
if let Some(err) = SchalaError::from_tokens(&tokens) {
|
|
||||||
return Err(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
//2nd stage - parsing
|
|
||||||
self.active_parser.add_new_tokens(tokens);
|
|
||||||
let ast = self
|
let ast = self
|
||||||
.active_parser
|
.active_parser
|
||||||
.parse()
|
.parse(source)
|
||||||
.map_err(|err| SchalaError::from_parse_error(err, &self.source_reference))?;
|
.map_err(|err| SchalaError::from_parse_error(err, &self.source_reference))?;
|
||||||
self.timings.push(("parsing", sw.elapsed()));
|
self.timings.push(("parsing", sw.elapsed()));
|
||||||
|
|
||||||
@ -133,6 +125,7 @@ impl SourceReference {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn load_new_source(&mut self, source: &str) {
|
pub(crate) fn load_new_source(&mut self, source: &str) {
|
||||||
|
self.newline_offsets = vec![];
|
||||||
for (offset, ch) in source.as_bytes().iter().enumerate() {
|
for (offset, ch) in source.as_bytes().iter().enumerate() {
|
||||||
if *ch == ('\n' as u8) {
|
if *ch == ('\n' as u8) {
|
||||||
self.newline_offsets.push(offset);
|
self.newline_offsets.push(offset);
|
||||||
@ -143,6 +136,11 @@ impl SourceReference {
|
|||||||
|
|
||||||
// (line_start, line_num, the string itself)
|
// (line_start, line_num, the string itself)
|
||||||
pub fn get_line(&self, line: usize) -> (usize, usize, String) {
|
pub fn get_line(&self, line: usize) -> (usize, usize, String) {
|
||||||
|
|
||||||
|
if self.newline_offsets.is_empty() {
|
||||||
|
return (0, 0, self.last_source.as_ref().cloned().unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
//TODO make sure this is utf8-safe
|
//TODO make sure this is utf8-safe
|
||||||
let start_idx = match self.newline_offsets.binary_search(&line) {
|
let start_idx = match self.newline_offsets.binary_search(&line) {
|
||||||
Ok(index) | Err(index) => index,
|
Ok(index) | Err(index) => index,
|
||||||
@ -192,7 +190,6 @@ impl<'a> ProgrammingLanguageInterface for Schala<'a> {
|
|||||||
|
|
||||||
fn run_computation(&mut self, request: ComputationRequest<Self::Config>) -> ComputationResponse {
|
fn run_computation(&mut self, request: ComputationRequest<Self::Config>) -> ComputationResponse {
|
||||||
let ComputationRequest { source, debug_requests: _, config: _ } = request;
|
let ComputationRequest { source, debug_requests: _, config: _ } = request;
|
||||||
self.source_reference.load_new_source(source);
|
|
||||||
let sw = Stopwatch::start_new();
|
let sw = Stopwatch::start_new();
|
||||||
|
|
||||||
let main_output =
|
let main_output =
|
||||||
|
Loading…
Reference in New Issue
Block a user