mod components;
mod definitions;
mod equations;
mod expressions;
pub mod generated;
mod helpers;
mod references;
mod sections;
use crate::ir;
use generated::modelica_grammar_trait;
use parol_runtime::{Result, Token};
use std::fmt::{Display, Error, Formatter};
pub use components::{ComponentList, TokenList};
pub use definitions::{Composition, ElementList};
pub use expressions::{ArraySubscripts, ExpressionList, ModificationArg};
pub use sections::{AlgorithmSection, EquationSection};
#[derive(Debug, Clone, Default)]
pub struct ParsedComment {
pub text: String,
pub line: u32,
pub column: u32,
pub is_line_comment: bool,
}
#[derive(Debug, Default)]
pub struct ModelicaGrammar<'t> {
pub modelica: Option<ir::ast::StoredDefinition>,
pub comments: Vec<ParsedComment>,
_phantom: std::marker::PhantomData<&'t str>,
}
impl ModelicaGrammar<'_> {
pub fn new() -> Self {
ModelicaGrammar::default()
}
}
impl Display for modelica_grammar_trait::StoredDefinition {
fn fmt(&self, f: &mut Formatter<'_>) -> std::result::Result<(), Error> {
write!(f, "{:?}", self)
}
}
impl Display for ModelicaGrammar<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::result::Result<(), Error> {
match &self.modelica {
Some(modelica) => writeln!(f, "{:#?}", modelica),
None => write!(f, "No parse result"),
}
}
}
impl<'t> modelica_grammar_trait::ModelicaGrammarTrait for ModelicaGrammar<'t> {
fn stored_definition(&mut self, arg: &modelica_grammar_trait::StoredDefinition) -> Result<()> {
self.modelica = Some(arg.try_into()?);
Ok(())
}
fn on_comment(&mut self, token: Token<'_>) {
let text = token.text().to_string();
let is_line_comment = text.starts_with("//");
self.comments.push(ParsedComment {
text,
line: token.location.start_line,
column: token.location.start_column,
is_line_comment,
});
}
}