Skip to content

Commit

Permalink
Merge pull request #621 from taichi-ishitani/support_break_statement
Browse files Browse the repository at this point in the history
Support 'break' jump statement
  • Loading branch information
dalance committed Apr 1, 2024
2 parents 19d5016 + 5e48bdb commit e16e99f
Show file tree
Hide file tree
Showing 13 changed files with 14,002 additions and 13,540 deletions.
22 changes: 22 additions & 0 deletions crates/analyzer/src/handlers/check_statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pub struct CheckStatement<'a> {
in_initial: bool,
in_final: bool,
statement_depth_in_always_ff: usize,
statement_depth_in_loop: usize,
}

impl<'a> CheckStatement<'a> {
Expand Down Expand Up @@ -92,6 +93,27 @@ impl<'a> VerylGrammarTrait for CheckStatement<'a> {
Ok(())
}

fn break_statement(&mut self, arg: &BreakStatement) -> Result<(), ParolError> {
if let HandlerPoint::Before = self.point {
if self.statement_depth_in_loop == 0 {
self.errors.push(AnalyzerError::invalid_statement(
"break",
self.text,
&arg.r#break.break_token.token,
));
}
}
Ok(())
}

fn for_statement(&mut self, _arg: &ForStatement) -> Result<(), ParolError> {
match self.point {
HandlerPoint::Before => self.statement_depth_in_loop += 1,
HandlerPoint::After => self.statement_depth_in_loop -= 1,
}
Ok(())
}

fn always_ff_declaration(&mut self, _arg: &AlwaysFfDeclaration) -> Result<(), ParolError> {
match self.point {
HandlerPoint::Before => {
Expand Down
27 changes: 27 additions & 0 deletions crates/analyzer/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -520,6 +520,33 @@ fn unused_return() {
assert!(matches!(errors[0], AnalyzerError::UnusedReturn { .. }));
}

#[test]
fn break_outside_loop() {
let code = r#"
module ModuleA {
always_comb {
break;
}
}
"#;

let errors = analyze(code);
assert!(matches!(errors[0], AnalyzerError::InvalidStatement { .. }));

let code = r#"
module ModuleA {
always_comb {
if 1 {
break;
}
}
}
"#;

let errors = analyze(code);
assert!(matches!(errors[0], AnalyzerError::InvalidStatement { .. }));
}

#[test]
fn unassign_variable() {
let code = r#"
Expand Down
6 changes: 6 additions & 0 deletions crates/emitter/src/emitter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1297,6 +1297,12 @@ impl VerylWalker for Emitter {
self.semicolon(&arg.semicolon);
}

/// Semantic action for non-terminal 'BreakStatement'
fn break_statement(&mut self, arg: &BreakStatement) {
self.r#break(&arg.r#break);
self.semicolon(&arg.semicolon);
}

/// Semantic action for non-terminal 'ForStatement'
fn for_statement(&mut self, arg: &ForStatement) {
self.r#for(&arg.r#for);
Expand Down
1 change: 1 addition & 0 deletions crates/languageserver/src/keyword.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ pub const KEYWORDS: &[&str] = &[
"ref",
"repeat",
"return",
"break",
"signed",
"step",
"string",
Expand Down
1,519 changes: 762 additions & 757 deletions crates/parser/src/generated/veryl-exp.par

Large diffs are not rendered by default.

Loading

0 comments on commit e16e99f

Please sign in to comment.