Skip to content

Commit 84f92f4

Browse files
committed
start new parser
1 parent 9c459f2 commit 84f92f4

File tree

2 files changed

+94
-0
lines changed

2 files changed

+94
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package io.polypen.parse;
2+
3+
import java.io.ByteArrayInputStream;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.io.PushbackReader;
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
public final class Parser {
11+
12+
private static ListExpr parse(PushbackReader reader) throws IOException {
13+
consumeWhitespace(reader);
14+
List<Expr> result = new ArrayList<>();
15+
int c;
16+
loop:
17+
while ((c = reader.read()) != -1) {
18+
switch (c) {
19+
case '(' -> {
20+
ListExpr expr = parse(reader);
21+
result.add(expr);
22+
}
23+
case ')' -> {
24+
break loop;
25+
}
26+
default -> {
27+
reader.unread(c);
28+
Expr atom = readAtom(reader);
29+
result.add(atom);
30+
}
31+
}
32+
}
33+
return new ListExpr(result);
34+
}
35+
36+
private static Expr readAtom(PushbackReader reader) throws IOException {
37+
consumeWhitespace(reader);
38+
StringBuilder sb = new StringBuilder();
39+
int c;
40+
while ((c = reader.read()) != -1) {
41+
if (c != ' ' && c != '(' && c != ')') {
42+
sb.append((char) c);
43+
} else {
44+
reader.unread(c);
45+
break;
46+
}
47+
}
48+
return new Atom(sb.toString());
49+
}
50+
51+
private static void consumeWhitespace(PushbackReader reader) throws IOException {
52+
while (true) {
53+
int c = reader.read();
54+
if (c != ' ') {
55+
if (c != -1) {
56+
reader.unread(c);
57+
}
58+
break;
59+
}
60+
}
61+
}
62+
63+
public static ListExpr parse(String s) {
64+
try (PushbackReader reader = new PushbackReader(new InputStreamReader(new ByteArrayInputStream(s.getBytes())))) {
65+
return parse(reader);
66+
} catch (IOException e) {
67+
throw new RuntimeException(e);
68+
}
69+
}
70+
71+
public interface Expr {
72+
}
73+
74+
public record Atom(String value) implements Expr {
75+
}
76+
77+
public record ListExpr(List<Expr> values) implements Expr {
78+
}
79+
80+
private Parser() {
81+
}
82+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.polypen.parse;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
class ParserTest {
6+
7+
@Test
8+
void parse() {
9+
Parser.ListExpr result = Parser.parse("(a b) 2 3");
10+
System.out.println(result);
11+
}
12+
}

0 commit comments

Comments
 (0)