Skip to content
This repository was archived by the owner on Feb 18, 2025. It is now read-only.

Commit c5c3cb5

Browse files
committed
lang: implement very basic optional semicolon scheme
The intention is to establish a baseline against which more elaborate implementations can be compared.
1 parent 9bfa54e commit c5c3cb5

36 files changed

+1977
-2060
lines changed

bench/binarytrees/binarytrees-mt.dora

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl TreeThread {
6060
fun run(): Unit {
6161
while true {
6262
let depth = self.nextDepth.fetchAdd(2i32);
63-
if depth > self.maxDepth { return; }
63+
if depth > self.maxDepth { return }
6464
let result = loops(self.maxDepth, depth);
6565
self.results((depth - MIN_DEPTH).toInt64() / 2i64) = result;
6666
}

bench/gcbench/gcbench.dora

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ fun numIters(i: Int32): Int32 {
3434
fun populate(depth: Int32, thisNode: Node): Unit {
3535
var depth = depth;
3636
if depth <= 0i32 {
37-
return;
37+
return
3838
} else {
3939
depth = depth - 1i32;
4040
thisNode.left = Option[Node]::Some(Node::leaf());

bench/splay/splay.dora

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,6 @@ impl Benchmark {
131131
fun generateKey(): Int32 {
132132
return rnd.nextInt32();
133133
}
134-
135-
fun rms(): Unit {
136-
let pauses = self.splaySumOfSquaredPauses;
137-
let samples = self.splaySamples;
138-
139-
(pauses.toFloat64() / samples.toFloat64());
140-
}
141134
}
142135

143136
fun generatePayloadTree(depth: Int32, tag: String): PayloadNode =
@@ -176,15 +169,15 @@ impl SplayTree {
176169
fun insert(key: Int32, value: PayloadNode): Unit {
177170
if self.isEmpty() {
178171
self.root = Some(SplayNode::new(key, Some[PayloadNode](value)));
179-
return;
172+
return
180173
}
181174

182175
self.splay(key);
183176

184177
let root = self.root.getOrPanic();
185178

186179
if root.key == key {
187-
return;
180+
return
188181
}
189182

190183
let node = SplayNode::new(key, Some[PayloadNode](value));
@@ -287,7 +280,7 @@ impl SplayTree {
287280

288281
fun splay(key: Int32): Unit {
289282
if self.isEmpty() {
290-
return;
283+
return
291284
}
292285

293286
var dummy = SplayNode::new(0i32, Option[PayloadNode]::None);

dora-parser/src/ast.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1764,14 +1764,6 @@ impl Expr {
17641764
}
17651765
}
17661766

1767-
pub fn needs_semicolon(&self) -> bool {
1768-
match self {
1769-
&Expr::Block(_) => false,
1770-
&Expr::If(_) => false,
1771-
_ => true,
1772-
}
1773-
}
1774-
17751767
pub fn pos(&self) -> Position {
17761768
match *self {
17771769
Expr::Un(ref val) => val.pos,

dora-parser/src/lexer/token.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ pub enum FloatSuffix {
230230
Float64,
231231
}
232232

233-
#[derive(Debug)]
233+
#[derive(Clone, Debug)]
234234
pub struct Token {
235235
pub kind: TokenKind,
236236
pub position: Position,

dora-parser/src/parser.rs

Lines changed: 44 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ impl<'a> Parser<'a> {
181181
fn parse_use(&mut self) -> Result<Use, ParseErrorAndPos> {
182182
self.expect_token(TokenKind::Use)?;
183183
let use_declaration = self.parse_use_inner()?;
184-
self.expect_semicolon()?;
184+
self.skip_semicolon()?;
185185

186186
Ok(use_declaration)
187187
}
@@ -325,7 +325,7 @@ impl<'a> Parser<'a> {
325325
self.expect_token(TokenKind::RBrace)?;
326326
Some(elements)
327327
} else {
328-
self.expect_token(TokenKind::Semicolon)?;
328+
self.skip_semicolon()?;
329329
None
330330
};
331331

@@ -372,7 +372,7 @@ impl<'a> Parser<'a> {
372372
let ty = self.parse_type()?;
373373
self.expect_token(TokenKind::Eq)?;
374374
let expr = self.parse_expression()?;
375-
self.expect_semicolon()?;
375+
self.skip_semicolon()?;
376376
let span = self.span_from(start);
377377

378378
Ok(Const {
@@ -447,7 +447,7 @@ impl<'a> Parser<'a> {
447447
None
448448
};
449449

450-
self.expect_semicolon()?;
450+
self.skip_semicolon()?;
451451
let span = self.span_from(start);
452452

453453
let mut global = Global {
@@ -976,22 +976,22 @@ impl<'a> Parser<'a> {
976976
}
977977

978978
fn parse_function_block(&mut self) -> Result<Option<Box<ExprBlockType>>, ParseErrorAndPos> {
979-
if self.token.is(TokenKind::Semicolon) {
980-
self.advance_token()?;
981-
982-
Ok(None)
983-
} else if self.token.is(TokenKind::Eq) {
979+
if self.token.is(TokenKind::Eq) {
984980
let expr = self.parse_function_block_expression()?;
985981

986982
Ok(Some(expr))
987-
} else {
983+
} else if self.token.is(TokenKind::LBrace) {
988984
let block = self.parse_block()?;
989985

990986
if let Expr::Block(block_type) = *block {
991987
Ok(Some(Box::new(block_type)))
992988
} else {
993989
unreachable!()
994990
}
991+
} else {
992+
self.skip_semicolon()?;
993+
994+
Ok(None)
995995
}
996996
}
997997

@@ -1012,7 +1012,7 @@ impl<'a> Parser<'a> {
10121012

10131013
_ => {
10141014
let expr = self.parse_expression()?;
1015-
self.expect_token(TokenKind::Semicolon)?;
1015+
self.skip_semicolon()?;
10161016
Ok(Box::new(ExprBlockType {
10171017
id: self.generate_id(),
10181018
pos: expr.pos(),
@@ -1124,18 +1124,12 @@ impl<'a> Parser<'a> {
11241124

11251125
match stmt_or_expr {
11261126
StmtOrExpr::Stmt(stmt) => Ok(stmt),
1127-
StmtOrExpr::Expr(expr) => {
1128-
if expr.needs_semicolon() {
1129-
Err(self.expect_semicolon().unwrap_err())
1130-
} else {
1131-
Ok(Box::new(Stmt::create_expr(
1132-
self.generate_id(),
1133-
expr.pos(),
1134-
expr.span(),
1135-
expr,
1136-
)))
1137-
}
1138-
}
1127+
StmtOrExpr::Expr(expr) => Ok(Box::new(Stmt::create_expr(
1128+
self.generate_id(),
1129+
expr.pos(),
1130+
expr.span(),
1131+
expr,
1132+
))),
11391133
}
11401134
}
11411135

@@ -1154,7 +1148,7 @@ impl<'a> Parser<'a> {
11541148
let data_type = self.parse_var_type()?;
11551149
let expr = self.parse_var_assignment()?;
11561150

1157-
self.expect_semicolon()?;
1151+
self.skip_semicolon()?;
11581152
let span = self.span_from(start);
11591153

11601154
Ok(Box::new(Stmt::create_let(
@@ -1254,10 +1248,7 @@ impl<'a> Parser<'a> {
12541248
match stmt_or_expr {
12551249
StmtOrExpr::Stmt(stmt) => stmts.push(stmt),
12561250
StmtOrExpr::Expr(curr_expr) => {
1257-
if curr_expr.needs_semicolon() {
1258-
expr = Some(curr_expr);
1259-
break;
1260-
} else if !self.token.is(TokenKind::RBrace) {
1251+
if !self.token.is(TokenKind::RBrace) {
12611252
stmts.push(Box::new(Stmt::create_expr(
12621253
self.generate_id(),
12631254
curr_expr.pos(),
@@ -1295,20 +1286,8 @@ impl<'a> Parser<'a> {
12951286
TokenKind::For => Ok(StmtOrExpr::Stmt(self.parse_for()?)),
12961287
_ => {
12971288
let expr = self.parse_expression()?;
1298-
1299-
if self.token.is(TokenKind::Semicolon) {
1300-
self.expect_token(TokenKind::Semicolon)?;
1301-
let span = self.span_from(expr.span().start());
1302-
1303-
Ok(StmtOrExpr::Stmt(Box::new(Stmt::create_expr(
1304-
self.generate_id(),
1305-
expr.pos(),
1306-
span,
1307-
expr,
1308-
))))
1309-
} else {
1310-
Ok(StmtOrExpr::Expr(expr))
1311-
}
1289+
self.skip_semicolon()?;
1290+
Ok(StmtOrExpr::Expr(expr))
13121291
}
13131292
}
13141293
}
@@ -1522,14 +1501,12 @@ impl<'a> Parser<'a> {
15221501
fn parse_return(&mut self) -> StmtResult {
15231502
let start = self.token.span.start();
15241503
let pos = self.expect_token(TokenKind::Return)?.position;
1525-
let expr = if self.token.is(TokenKind::Semicolon) {
1526-
None
1527-
} else {
1528-
let expr = self.parse_expression()?;
1529-
Some(expr)
1504+
let expr = match self.token.kind {
1505+
TokenKind::Semicolon | TokenKind::RBrace => None,
1506+
_ => Some(self.parse_expression()?),
15301507
};
15311508

1532-
self.expect_semicolon()?;
1509+
self.skip_semicolon()?;
15331510
let span = self.span_from(start);
15341511

15351512
Ok(Box::new(Stmt::create_return(
@@ -2107,6 +2084,18 @@ impl<'a> Parser<'a> {
21072084
self.expect_token(TokenKind::Semicolon)
21082085
}
21092086

2087+
fn skip_semicolon(&mut self) -> Result<Token, ParseErrorAndPos> {
2088+
if self.token.is(TokenKind::Semicolon)
2089+
/* || self.token.is(TokenKind::NewLine)*/
2090+
{
2091+
//println!("FOUND semi or nl: {:?}, advancing", self.token);
2092+
self.advance_token()
2093+
} else {
2094+
//println!("NOT found semi or nl: {:?}", self.token);
2095+
Ok(self.token.clone())
2096+
}
2097+
}
2098+
21102099
fn expect_token(&mut self, kind: TokenKind) -> Result<Token, ParseErrorAndPos> {
21112100
if self.token.kind == kind {
21122101
let token = self.advance_token()?;
@@ -2853,12 +2842,10 @@ mod tests {
28532842

28542843
#[test]
28552844
fn parse_expr_stmt_without_semicolon() {
2856-
err_stmt(
2857-
"1",
2858-
ParseError::ExpectedToken(";".into(), "<<EOF>>".into()),
2859-
1,
2860-
2,
2861-
);
2845+
let stmt = parse_stmt("1");
2846+
let expr = stmt.to_expr().unwrap();
2847+
2848+
assert!(expr.expr.is_lit_int());
28622849
}
28632850

28642851
#[test]
@@ -2914,15 +2901,12 @@ mod tests {
29142901
let (expr, _) = parse_expr("{ 1; 2; }");
29152902
let block = expr.to_block().unwrap();
29162903

2917-
assert_eq!(2, block.stmts.len());
2904+
assert_eq!(1, block.stmts.len());
29182905

29192906
let expr = &block.stmts[0].to_expr().unwrap().expr;
29202907
assert_eq!(1, expr.to_lit_int().unwrap().value);
29212908

2922-
let expr = &block.stmts[1].to_expr().unwrap().expr;
2923-
assert_eq!(2, expr.to_lit_int().unwrap().value);
2924-
2925-
assert!(block.expr.is_none());
2909+
assert!(block.expr.as_ref().unwrap().is_lit_int());
29262910
}
29272911

29282912
#[test]
@@ -3685,7 +3669,7 @@ mod tests {
36853669
fn parse_use_declaration() {
36863670
parse_err(
36873671
"use foo.bar{a, b, c}",
3688-
ParseError::ExpectedToken(";".into(), "{".into()),
3672+
ParseError::ExpectedTopLevelElement("{".into()),
36893673
1,
36903674
12,
36913675
);

0 commit comments

Comments
 (0)