Skip to content

Commit 96eca08

Browse files
authored
Merge pull request #708 from wado-lang/claude/refactor-gale-patterns-9dchV
Support return statements in match expression arms
2 parents 765ea5a + 54c3b92 commit 96eca08

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2496
-280
lines changed

example/simd-stats.wado

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,9 @@ fn normalize(data: &Array<f64>) -> Array<f64> {
9797
i = i + 2;
9898
}
9999

100-
if i < len { result.append(((*data)[i] - s.mean) / sd) }
100+
if i < len {
101+
result.append(((*data)[i] - s.mean) / sd);
102+
}
101103

102104
return result;
103105
}
@@ -116,7 +118,9 @@ fn dot_product(a: &Array<f64>, b: &Array<f64>) -> f64 {
116118
}
117119

118120
let mut sum = sum_vec.extract_lane(0) + sum_vec.extract_lane(1);
119-
if i < len { sum = sum + (*a)[i] * (*b)[i] }
121+
if i < len {
122+
sum = sum + (*a)[i] * (*b)[i];
123+
}
120124

121125
return sum;
122126
}

package-gale/src/g4/lexer.wado

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,16 +143,12 @@ impl G4Lexer {
143143
break;
144144
}
145145
}
146-
let kind = if text == "grammar" {
147-
G4Token::Grammar
148-
} else if text == "fragment" {
149-
G4Token::Fragment
150-
} else if text == "skip" {
151-
G4Token::Skip
152-
} else if text == "channel" {
153-
G4Token::Channel
154-
} else {
155-
G4Token::Identifier
146+
let kind = match text {
147+
"grammar" => G4Token::Grammar,
148+
"fragment" => G4Token::Fragment,
149+
"skip" => G4Token::Skip,
150+
"channel" => G4Token::Channel,
151+
_ => G4Token::Identifier,
156152
};
157153
return make_token(kind, text, start, self.pos);
158154
}

package-gale/src/gen_util.wado

Lines changed: 43 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,21 @@ pub fn escape_string(s: &String) -> String {
5757
let mut result = String::with_capacity(s.len() + 2);
5858
result.append_char('"');
5959
for let c of s.chars() {
60-
if c == '"' { result.append("\\\""); }
61-
else if c == '\\' { result.append("\\\\"); }
62-
else if c == '\n' { result.append("\\n"); }
63-
else if c == '\r' { result.append("\\r"); }
64-
else if c == '\t' { result.append("\\t"); }
65-
else {
66-
let code = c as i32;
67-
if code >= 32 && code < 127 {
68-
result.append_char(c);
69-
} else {
70-
result.append(`\\u\{{code:x}\}`);
71-
}
72-
}
60+
match c {
61+
'"' => result.append("\\\""),
62+
'\\' => result.append("\\\\"),
63+
'\n' => result.append("\\n"),
64+
'\r' => result.append("\\r"),
65+
'\t' => result.append("\\t"),
66+
_ => {
67+
let code = c as i32;
68+
if code >= 32 && code < 127 {
69+
result.append_char(c);
70+
} else {
71+
result.append(`\\u\{{code:x}\}`);
72+
}
73+
},
74+
};
7375
}
7476
result.append_char('"');
7577
return result;
@@ -152,33 +154,35 @@ pub fn literal_const_name(text: &String) -> String {
152154
for let c of text.chars() {
153155
if c.is_ascii_lowercase() {
154156
result.append_char(c.to_ascii_uppercase());
155-
} else if c.is_ascii_uppercase() {
156-
result.append_char(c);
157-
} else if c >= '0' && c <= '9' {
157+
} else if c.is_ascii_uppercase() || c >= '0' && c <= '9' {
158158
result.append_char(c);
159-
} else if c == '{' { result.append("LBRACE"); }
160-
else if c == '}' { result.append("RBRACE"); }
161-
else if c == '[' { result.append("LBRACKET"); }
162-
else if c == ']' { result.append("RBRACKET"); }
163-
else if c == '(' { result.append("LPAREN"); }
164-
else if c == ')' { result.append("RPAREN"); }
165-
else if c == ':' { result.append("COLON"); }
166-
else if c == ',' { result.append("COMMA"); }
167-
else if c == '.' { result.append("DOT"); }
168-
else if c == ';' { result.append("SEMI"); }
169-
else if c == '+' { result.append("PLUS"); }
170-
else if c == '-' { result.append("MINUS"); }
171-
else if c == '*' { result.append("STAR"); }
172-
else if c == '/' { result.append("SLASH"); }
173-
else if c == '=' { result.append("EQ"); }
174-
else if c == '<' { result.append("LT"); }
175-
else if c == '>' { result.append("GT"); }
176-
else if c == '!' { result.append("BANG"); }
177-
else if c == '&' { result.append("AMP"); }
178-
else if c == '|' { result.append("PIPE"); }
179-
else if c == '^' { result.append("CARET"); }
180-
else if c == '~' { result.append("TILDE"); }
181-
else { result.append_char('_'); }
159+
} else {
160+
match c {
161+
'{' => result.append("LBRACE"),
162+
'}' => result.append("RBRACE"),
163+
'[' => result.append("LBRACKET"),
164+
']' => result.append("RBRACKET"),
165+
'(' => result.append("LPAREN"),
166+
')' => result.append("RPAREN"),
167+
':' => result.append("COLON"),
168+
',' => result.append("COMMA"),
169+
'.' => result.append("DOT"),
170+
';' => result.append("SEMI"),
171+
'+' => result.append("PLUS"),
172+
'-' => result.append("MINUS"),
173+
'*' => result.append("STAR"),
174+
'/' => result.append("SLASH"),
175+
'=' => result.append("EQ"),
176+
'<' => result.append("LT"),
177+
'>' => result.append("GT"),
178+
'!' => result.append("BANG"),
179+
'&' => result.append("AMP"),
180+
'|' => result.append("PIPE"),
181+
'^' => result.append("CARET"),
182+
'~' => result.append("TILDE"),
183+
_ => result.append_char('_'),
184+
};
185+
}
182186
}
183187
return result;
184188
}

package-gale/src/generator.wado

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use {
88
} from "./gen_util.wado";
99
use { collect_literal_tokens, gen_token_constants, gen_lexer } from "./lexer_gen.wado";
1010
use { gen_parser } from "./parser_gen.wado";
11-
use { CodeWriter, StructSpec, VariantSpec } from "./wadopoet.wado";
11+
use { CodeWriter, StructSpec, VariantSpec, EnumSpec } from "./wadopoet.wado";
1212

1313
pub fn generate(grammar: &Grammar) -> String {
1414
let mut w = CodeWriter::new();
@@ -34,16 +34,16 @@ fn gen_runtime(w: &mut CodeWriter) {
3434
}
3535

3636
fn gen_token_kind(w: &mut CodeWriter, lexer_rules: &Array<LexerRule>) {
37-
let mut v = VariantSpec::new("TokenKind");
38-
v.set_pub();
37+
let mut e = EnumSpec::new("TokenKind");
38+
e.set_pub();
3939
for let rule of lexer_rules {
4040
if !rule.is_fragment {
41-
v.add_case(&rule.name);
41+
e.add_member(&rule.name);
4242
}
4343
}
44-
v.add_case("Eof");
45-
v.add_case("Error");
46-
v.emit(w);
44+
e.add_member("Eof");
45+
e.add_member("Error");
46+
e.emit(w);
4747
w.blank();
4848
}
4949

@@ -165,11 +165,7 @@ fn element_to_field(elem: &Element) -> Option<Field> {
165165
if let Repeat(rep) = *elem {
166166
if let Some(inner) = element_to_field(&rep.element) {
167167
let field = match rep.kind {
168-
Star => Field {
169-
name: `{inner.name}_list`,
170-
type_str: `Array<{inner.type_str}>`,
171-
},
172-
Plus => Field {
168+
Star | Plus => Field {
173169
name: `{inner.name}_list`,
174170
type_str: `Array<{inner.type_str}>`,
175171
},

package-gale/src/generator_test.wado

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ test "generate token kind" {
2929
],
3030
};
3131
let output = generate(&grammar);
32-
assert str_contains(&output, "pub variant TokenKind {");
32+
assert str_contains(&output, "pub enum TokenKind {");
3333
assert str_contains(&output, " NUMBER,");
3434
assert str_contains(&output, " WS,");
3535
assert str_contains(&output, " Eof,");

package-gale/src/lexer_gen.wado

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,7 @@ fn gen_char_class(
283283
w.write(` || chars[pos] >= {escape_char(range.start)} && chars[pos] <= {escape_char(range.end)}`);
284284
}
285285
}
286-
let fa = *fail_action;
287-
w.write(` \{ {fa}; \}\n`);
286+
w.write(` \{ {*fail_action}; \}\n`);
288287
} else {
289288
w.write("if !(false");
290289
for let range of cc.ranges {
@@ -294,8 +293,7 @@ fn gen_char_class(
294293
w.write(` || chars[pos] >= {escape_char(range.start)} && chars[pos] <= {escape_char(range.end)}`);
295294
}
296295
}
297-
let fa = *fail_action;
298-
w.write(`) \{ {fa}; \}\n`);
296+
w.write(`) \{ {*fail_action}; \}\n`);
299297
}
300298
w.line("pos += 1;");
301299
}

package-gale/src/parser_gen.wado

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,7 @@ fn compute_deeper_first(
163163
let mut remaining = depth;
164164
while pos < elements.len() && remaining > 0 {
165165
let elem = &elements[pos];
166-
if let TokenRef(_) = *elem { remaining -= 1; pos += 1; continue; }
167-
if let Literal(_) = *elem { remaining -= 1; pos += 1; continue; }
166+
if let TokenRef(_) | Literal(_) = *elem { remaining -= 1; pos += 1; continue; }
168167
if is_nullable(elem) { pos += 1; continue; }
169168
return [];
170169
}
@@ -1047,14 +1046,12 @@ fn optional_lookahead_depth(inner: &Element) -> i32 {
10471046
let mut depth = 0;
10481047
for let mut i = 0; i < alts[0].elements.len(); i += 1 {
10491048
let elem = &alts[0].elements[i];
1050-
if let TokenRef(_) = *elem { depth += 1; }
1051-
else if let Literal(_) = *elem { depth += 1; }
1049+
if let TokenRef(_) | Literal(_) = *elem { depth += 1; }
10521050
else { break; }
10531051
}
10541052
return depth;
10551053
}
1056-
if let TokenRef(_) = *inner { return 1; }
1057-
if let Literal(_) = *inner { return 1; }
1054+
if let TokenRef(_) | Literal(_) = *inner { return 1; }
10581055
return 0;
10591056
}
10601057

@@ -1194,9 +1191,7 @@ fn gen_element_failable(
11941191
}
11951192

11961193
fn has_field(elem: &Element) -> bool {
1197-
if let TokenRef(_) = *elem { return true; }
1198-
if let Literal(_) = *elem { return true; }
1199-
if let RuleRef(_) = *elem { return true; }
1194+
if let TokenRef(_) | Literal(_) | RuleRef(_) = *elem { return true; }
12001195
if let Label(lab) = *elem { return has_field(&lab.element); }
12011196
return false;
12021197
}
@@ -1247,11 +1242,7 @@ fn gen_field_assignment(
12471242
if let Repeat(rep) = *elem {
12481243
if has_field(&rep.element) {
12491244
let info = element_field_info(&rep.element);
1250-
if let Star = rep.kind {
1251-
let field_name = dedup_name(&`{info.0}_list`, name_counts);
1252-
w.line(`{field_name},`);
1253-
}
1254-
if let Plus = rep.kind {
1245+
if let Star | Plus = rep.kind {
12551246
let field_name = dedup_name(&`{info.0}_list`, name_counts);
12561247
w.line(`{field_name},`);
12571248
}
@@ -2075,17 +2066,15 @@ fn is_simple_token_group(alts: &Array<Alternative>) -> bool {
20752066
for let alt of alts {
20762067
if alt.elements.len() != 1 { return false; }
20772068
let elem = &alt.elements[0];
2078-
if let TokenRef(_) = *elem { continue; }
2079-
if let Literal(_) = *elem { continue; }
2069+
if let TokenRef(_) | Literal(_) = *elem { continue; }
20802070
return false;
20812071
}
20822072
return true;
20832073
}
20842074

20852075
fn is_nullable(elem: &Element) -> bool {
20862076
if let Repeat(rep) = *elem {
2087-
if let Star = rep.kind { return true; }
2088-
if let Optional = rep.kind { return true; }
2077+
if let Star | Optional = rep.kind { return true; }
20892078
}
20902079
return false;
20912080
}

package-gale/tests/golden/calculator.wado

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl ParseError {
6060
}
6161
}
6262

63-
pub variant TokenKind {
63+
pub enum TokenKind {
6464
COS,
6565
SIN,
6666
TAN,

package-gale/tests/golden/json.wado

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl ParseError {
6060
}
6161
}
6262

63-
pub variant TokenKind {
63+
pub enum TokenKind {
6464
STRING,
6565
NUMBER,
6666
WS,

package-gale/tests/golden/sexpression.wado

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ impl ParseError {
6060
}
6161
}
6262

63-
pub variant TokenKind {
63+
pub enum TokenKind {
6464
STRING,
6565
WHITESPACE,
6666
NUMBER,

0 commit comments

Comments
 (0)