diff options
Diffstat (limited to 'parser/src')
| -rw-r--r-- | parser/src/main/java/lv/enes/orang/parser/Parser.java | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/parser/src/main/java/lv/enes/orang/parser/Parser.java b/parser/src/main/java/lv/enes/orang/parser/Parser.java index 06183a3..3d1d42b 100644 --- a/parser/src/main/java/lv/enes/orang/parser/Parser.java +++ b/parser/src/main/java/lv/enes/orang/parser/Parser.java | |||
| @@ -205,9 +205,9 @@ public class Parser { | |||
| 205 | } | 205 | } |
| 206 | 206 | ||
| 207 | private Expression parseCallExpression() throws ParserException { | 207 | private Expression parseCallExpression() throws ParserException { |
| 208 | var callee = parseSimpleExpression(); | 208 | var callee = parseMemberAccessExpression(); |
| 209 | while (couldStartSimpleExpression(input.peek().type())) { | 209 | while (couldStartSimpleExpression(input.peek().type())) { |
| 210 | var arg = parseSimpleExpression(); | 210 | var arg = parseMemberAccessExpression(); |
| 211 | callee = new CallExpression(callee, arg); | 211 | callee = new CallExpression(callee, arg); |
| 212 | } | 212 | } |
| 213 | return callee; | 213 | return callee; |
| @@ -298,6 +298,16 @@ public class Parser { | |||
| 298 | return new LetInExpression(Collections.unmodifiableList(bindings), body); | 298 | return new LetInExpression(Collections.unmodifiableList(bindings), body); |
| 299 | } | 299 | } |
| 300 | 300 | ||
| 301 | private Expression parseMemberAccessExpression() throws ParserException { | ||
| 302 | var expr = parseSimpleExpression(); | ||
| 303 | while (maybeConsumeToken(Token.Type.PERIOD_BRACKET_LEFT)) { | ||
| 304 | var idx = parseExpression(); | ||
| 305 | consumeToken(Token.Type.BRACKET_RIGHT); | ||
| 306 | expr = new ArrayAccessExpression(expr, idx); | ||
| 307 | } | ||
| 308 | return expr; | ||
| 309 | } | ||
| 310 | |||
| 301 | private Statement parseReplLine() throws ParserException { | 311 | private Statement parseReplLine() throws ParserException { |
| 302 | if (input.peek().type() == Token.Type.DEF) { | 312 | if (input.peek().type() == Token.Type.DEF) { |
| 303 | return parseStatement(); | 313 | return parseStatement(); |