Skip to content

Commit 6c21442

Browse files
committed
Add ArraySubscript.
Signed-off-by: James Goppert <james.goppert@gmail.com>
1 parent e263c35 commit 6c21442

18 files changed

+62
-35
lines changed

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "rumoca_parser"
33
authors = ["James Goppert", "Benjamin Perseghetti"]
44
description = "A Modelica parser leveraging LALRPOP"
5-
version = "0.10.3"
5+
version = "0.10.4"
66
edition = "2021"
77
license = "Apache-2.0"
88

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ pub mod s2_analysis;
66
extern crate macro_rules_attribute;
77

88
pub use s1_parser::ast;
9-
pub use s2_analysis::parser_helper::parse_file;
9+
pub use s2_analysis::parser_helper::{parse, parse_file};
1010
pub use s2_analysis::print_visitor::PrintVisitor;
1111
pub use s2_analysis::{Node, NodeMutRef, NodeRef, Visitable, VisitableMut, Visitor, VisitorMut};

src/s0_lexer/lexer.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ mod tests {
3434

3535
#[test]
3636
fn test_lexer() {
37-
let filename = String::from("test/models/integrator.mo");
37+
let filename = String::from("tests/models/integrator.mo");
3838
let source_code = std::fs::read_to_string(filename).unwrap();
3939
let mut lexer = Lexer::new(&source_code);
4040
for result in &mut lexer {

src/s1_parser/ast.rs

+8-3
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ pub struct ClassPrefixes {
109109
pub struct ComponentClause {
110110
pub type_prefix: TypePrefix,
111111
pub type_specifier: TypeSpecifier,
112-
pub array_subscripts: Vec<Subscript>,
112+
pub array_subscripts: ArraySubscripts,
113113
pub components: Vec<ComponentDeclaration>,
114114
}
115115

@@ -123,7 +123,7 @@ pub struct ComponentClause1 {
123123
#[derive(CommonTraits!, Default)]
124124
pub struct Declaration {
125125
pub name: String,
126-
pub array_subscripts: Vec<Subscript>,
126+
pub array_subscripts: ArraySubscripts,
127127
pub modification: Option<Modification>,
128128
}
129129

@@ -252,7 +252,12 @@ pub struct ComponentReference {
252252
#[derive(CommonTraits!, Default)]
253253
pub struct RefPart {
254254
pub name: String,
255-
pub array_subscripts: Vec<Subscript>,
255+
pub array_subscripts: ArraySubscripts,
256+
}
257+
258+
#[derive(CommonTraits!, Default)]
259+
pub struct ArraySubscripts {
260+
pub subscripts: Vec<Subscript>,
256261
}
257262

258263
#[derive(CommonTraits!, Default)]

src/s1_parser/modelica.lalrpop

+8-6
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ pub ComponentClause: ast::ComponentClause = {
463463
ast::ComponentClause {
464464
type_prefix,
465465
type_specifier,
466-
array_subscripts: array_subscripts.unwrap_or(Vec::new()),
466+
array_subscripts: array_subscripts.unwrap_or(ast::ArraySubscripts::default()),
467467
components,
468468
}
469469
}
@@ -531,7 +531,7 @@ pub Declaration: ast::Declaration = {
531531
<modification:Modification?> => {
532532
ast::Declaration {
533533
name,
534-
array_subscripts: array_subscripts.unwrap_or(Vec::new()),
534+
array_subscripts: array_subscripts.unwrap_or(ast::ArraySubscripts::default()),
535535
modification,
536536
}
537537
}
@@ -1138,7 +1138,7 @@ SimpleExpression: ast::Expression = {
11381138
local: false,
11391139
parts: vec![ast::RefPart{
11401140
name: func,
1141-
array_subscripts: Vec::new()
1141+
array_subscripts: ast::ArraySubscripts::default(),
11421142
}]
11431143
},
11441144
args,
@@ -1185,7 +1185,7 @@ pub RefPart: ast::RefPart = {
11851185
<name:IDENT> <array_subscripts:ArraySubscripts?> => {
11861186
ast::RefPart {
11871187
name,
1188-
array_subscripts: array_subscripts.unwrap_or(Vec::new()),
1188+
array_subscripts: array_subscripts.unwrap_or(ast::ArraySubscripts::default()),
11891189
}
11901190
}
11911191
}
@@ -1233,8 +1233,10 @@ pub FunctionCallArguments: Vec<ast::Expression> = {
12331233

12341234
//✅ array-subscripts :
12351235
//✅ "[" subscript { "," subscript } "]"
1236-
pub ArraySubscripts: Vec<ast::Subscript> = {
1237-
"[" <sub: SeparatedList<Subscript, ",">> "]" => sub,
1236+
pub ArraySubscripts: ast::ArraySubscripts = {
1237+
"[" <subscripts: SeparatedList<Subscript, ",">> "]" => {
1238+
ast::ArraySubscripts{ subscripts }
1239+
}
12381240
}
12391241
//✅ subscript :
12401242
//✅ ":" | expression

src/s2_analysis/ast_node.rs

+2
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ from_node!(
129129
IfExpressionBlock,
130130
ComponentReference,
131131
RefPart,
132+
ArraySubscripts,
132133
Subscript,
133134
Argument,
134135
Modification,
@@ -170,6 +171,7 @@ define_node_enums!(
170171
IfExpressionBlock,
171172
ComponentReference,
172173
RefPart,
174+
ArraySubscripts,
173175
Subscript,
174176
Argument,
175177
Modification,

src/s2_analysis/parser_helper.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ use md5;
1212
use std::process;
1313

1414
pub fn parse_file(filename: &str) -> ast::StoredDefinition {
15+
let file_txt = std::fs::read_to_string(filename).expect("failed to read file");
16+
parse(filename, &file_txt)
17+
}
18+
19+
pub fn parse(filename: &str, file_txt: &str) -> ast::StoredDefinition {
1520
let mut files = SimpleFiles::new();
16-
let file_id = files.add(
17-
filename,
18-
std::fs::read_to_string(filename).expect("failed to read file"),
19-
);
21+
let file_id = files.add(filename, file_txt);
2022
let file = files.get(file_id).expect("failed to get file id");
2123
let file_txt = file.source();
2224
let lexer = Lexer::new(file_txt);

src/s2_analysis/visitable.rs

+16-9
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ impl<'a> Visitable<'a> for NodeRef<'a> {
4444
IfExpressionBlock,
4545
ComponentReference,
4646
RefPart,
47+
ArraySubscripts,
4748
Subscript,
4849
Argument,
4950
Modification,
@@ -284,9 +285,7 @@ impl<'a> Visitable<'a> for ast::ComponentClause {
284285
visitor.enter_component_clause(self);
285286
self.type_prefix.accept(visitor);
286287
self.type_specifier.accept(visitor);
287-
for sub in self.array_subscripts.iter() {
288-
sub.accept(visitor);
289-
}
288+
self.array_subscripts.accept(visitor);
290289
for comp in self.components.iter() {
291290
comp.accept(visitor);
292291
}
@@ -311,9 +310,7 @@ impl<'a> Visitable<'a> for ast::Declaration {
311310
fn accept<V: Visitor<'a> + ?Sized>(&'a self, visitor: &mut V) {
312311
visitor.enter_any(NodeRef::Declaration(self));
313312
visitor.enter_declaration(self);
314-
for sub in self.array_subscripts.iter() {
315-
sub.accept(visitor);
316-
}
313+
self.array_subscripts.accept(visitor);
317314
if let Some(modif) = self.modification.as_ref() {
318315
modif.accept(visitor);
319316
}
@@ -545,14 +542,24 @@ impl<'a> Visitable<'a> for ast::RefPart {
545542
fn accept<V: Visitor<'a> + ?Sized>(&'a self, visitor: &mut V) {
546543
visitor.enter_any(NodeRef::RefPart(self));
547544
visitor.enter_ref_part(self);
548-
for sub in self.array_subscripts.iter() {
549-
sub.accept(visitor);
550-
}
545+
self.array_subscripts.accept(visitor);
551546
visitor.exit_ref_part(self);
552547
visitor.exit_any(NodeRef::RefPart(self));
553548
}
554549
}
555550

551+
impl<'a> Visitable<'a> for ast::ArraySubscripts {
552+
fn accept<V: Visitor<'a> + ?Sized>(&'a self, visitor: &mut V) {
553+
visitor.enter_any(NodeRef::ArraySubscripts(self));
554+
visitor.enter_array_subscripts(self);
555+
for sub in self.subscripts.iter() {
556+
sub.accept(visitor);
557+
}
558+
visitor.exit_array_subscripts(self);
559+
visitor.exit_any(NodeRef::ArraySubscripts(self));
560+
}
561+
}
562+
556563
impl<'a> Visitable<'a> for ast::Subscript {
557564
fn accept<V: Visitor<'a> + ?Sized>(&'a self, visitor: &mut V) {
558565
visitor.enter_any(NodeRef::Subscript(self));

src/s2_analysis/visitable_mut.rs

+16-9
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ impl VisitableMut for Node {
100100
IfExpressionBlock,
101101
ComponentReference,
102102
RefPart,
103+
ArraySubscripts,
103104
Subscript,
104105
Argument,
105106
Modification,
@@ -283,9 +284,7 @@ impl VisitableMut for ast::ComponentClause {
283284
visitor.enter_component_clause_mut(self);
284285
self.type_prefix.accept_mut(visitor);
285286
self.type_specifier.accept_mut(visitor);
286-
for sub in self.array_subscripts.iter_mut() {
287-
sub.accept_mut(visitor);
288-
}
287+
self.array_subscripts.accept_mut(visitor);
289288
for comp in self.components.iter_mut() {
290289
comp.accept_mut(visitor);
291290
}
@@ -310,9 +309,7 @@ impl VisitableMut for ast::Declaration {
310309
fn accept_mut<V: VisitorMut + ?Sized>(&mut self, visitor: &mut V) {
311310
visitor.enter_any(NodeRef::Declaration(self));
312311
visitor.enter_declaration_mut(self);
313-
for sub in self.array_subscripts.iter_mut() {
314-
sub.accept_mut(visitor);
315-
}
312+
self.array_subscripts.accept_mut(visitor);
316313
if let Some(modif) = self.modification.as_mut() {
317314
modif.accept_mut(visitor);
318315
}
@@ -544,14 +541,24 @@ impl VisitableMut for ast::RefPart {
544541
fn accept_mut<V: VisitorMut + ?Sized>(&mut self, visitor: &mut V) {
545542
visitor.enter_any(NodeRef::RefPart(self));
546543
visitor.enter_ref_part_mut(self);
547-
for sub in self.array_subscripts.iter_mut() {
548-
sub.accept_mut(visitor);
549-
}
544+
self.array_subscripts.accept_mut(visitor);
550545
visitor.exit_ref_part_mut(self);
551546
visitor.exit_any(NodeRef::RefPart(self));
552547
}
553548
}
554549

550+
impl VisitableMut for ast::ArraySubscripts {
551+
fn accept_mut<V: VisitorMut + ?Sized>(&mut self, visitor: &mut V) {
552+
visitor.enter_any(NodeRef::ArraySubscripts(self));
553+
visitor.enter_array_subscripts_mut(self);
554+
for sub in self.subscripts.iter_mut() {
555+
sub.accept_mut(visitor);
556+
}
557+
visitor.exit_array_subscripts_mut(self);
558+
visitor.exit_any(NodeRef::ArraySubscripts(self));
559+
}
560+
}
561+
555562
impl VisitableMut for ast::Subscript {
556563
fn accept_mut<V: VisitorMut + ?Sized>(&mut self, visitor: &mut V) {
557564
visitor.enter_any(NodeRef::Subscript(self));

src/s2_analysis/visitor.rs

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub trait Visitor<'a> {
4141
ComponentReference,
4242
RefPart,
4343
Subscript,
44+
ArraySubscripts,
4445
Argument,
4546
Modification,
4647
ModExpr,

src/s2_analysis/visitor_mut.rs

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub trait VisitorMut {
4040
ComponentReference,
4141
RefPart,
4242
Subscript,
43+
ArraySubscripts,
4344
Argument,
4445
Modification,
4546
ModExpr,
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)