Finish parser refactor, simplifying code and diagnostics handling.

This commit is contained in:
Jesse Brault 2026-08-21 16:38:30 -05:00
parent 4e3f1677be
commit 2dfd8e8a29
3 changed files with 366 additions and 862 deletions

View File

@ -105,14 +105,10 @@ fn compile_statement(
register_count: usize, register_count: usize,
constants_table: &mut ConstantsTable, constants_table: &mut ConstantsTable,
) -> Result<Function, Diagnostics> { ) -> Result<Function, Diagnostics> {
let maybe_statement = parse_statement(input); let parse_result = parse_statement(input);
if !maybe_statement.is_ok() { if !parse_result.is_ok() {
Err(maybe_statement.into_diagnostics()) Err(parse_result.1)
} else { } else {
session.compile_statement( session.compile_statement(&parse_result.0.unwrap(), register_count, constants_table)
&maybe_statement.into_inner(),
register_count,
constants_table,
)
} }
} }

View File

@ -1,3 +1,5 @@
#![feature(option_zip)]
use crate::ast::statement::Statement; use crate::ast::statement::Statement;
use crate::constants_table::ConstantsTable; use crate::constants_table::ConstantsTable;
use crate::diagnostic::Diagnostics; use crate::diagnostic::Diagnostics;
@ -5,7 +7,7 @@ use crate::ir::compile_dvm_function;
use crate::ir::ir_variable::{IrStackFrameVariables, IrVariable, IrVariableInfo}; use crate::ir::ir_variable::{IrStackFrameVariables, IrVariable, IrVariableInfo};
use crate::lowering::util::to_ir_type_info; use crate::lowering::util::to_ir_type_info;
use crate::lowering::{lower_to_ir_compilation_unit, lower_to_ir_synthetic_function}; use crate::lowering::{lower_to_ir_compilation_unit, lower_to_ir_synthetic_function};
use crate::parser::parse_compilation_unit; use crate::parser::{ParseResult, parse_compilation_unit};
use crate::semantic_analysis::symbol::SymbolId; use crate::semantic_analysis::symbol::SymbolId;
use crate::semantic_analysis::{analyze_compilation_unit, analyze_statement}; use crate::semantic_analysis::{analyze_compilation_unit, analyze_statement};
use dvm_lib::vm::function::Function; use dvm_lib::vm::function::Function;
@ -39,14 +41,14 @@ pub fn compile_compilation_unit(
register_count: usize, register_count: usize,
constants_table: &mut ConstantsTable, constants_table: &mut ConstantsTable,
) -> Result<CompileCompilationUnitResult, Diagnostics> { ) -> Result<CompileCompilationUnitResult, Diagnostics> {
let (compilation_unit, diagnostics) = parse_compilation_unit(input, None); let ParseResult(compilation_unit, mut parse_diagnostics) = parse_compilation_unit(input, None);
if !diagnostics.is_empty() { let mut analysis_diagnostics = analyze_compilation_unit(&compilation_unit, analysis_context);
return Err(diagnostics);
}
let diagnostics = analyze_compilation_unit(&compilation_unit, analysis_context); if !parse_diagnostics.is_empty() || !analysis_diagnostics.is_empty() {
if !diagnostics.is_empty() { let mut all_diagnostics = Vec::new();
return Err(diagnostics); all_diagnostics.append(&mut parse_diagnostics);
all_diagnostics.append(&mut analysis_diagnostics);
return Err(all_diagnostics);
} }
let lower_to_ir_result = lower_to_ir_compilation_unit(&compilation_unit, analysis_context); let lower_to_ir_result = lower_to_ir_compilation_unit(&compilation_unit, analysis_context);

File diff suppressed because it is too large Load Diff