|
@@ -707,13 +707,25 @@ static void literal(__attribute__((unused)) bool canAssign) {
|
|
|
default: return;// Unreachable
|
|
default: return;// Unreachable
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+static void dot(bool canAssign) {
|
|
|
|
|
+ // eclair.filling = "pastry creme";
|
|
|
|
|
+ consume(TOKEN_IDENTIFIER, "Expect property name after '.'.");
|
|
|
|
|
+ uint8_t name = identifierConstant(&parser.previous);
|
|
|
|
|
+
|
|
|
|
|
+ if (canAssign && match(TOKEN_EQUAL)) {
|
|
|
|
|
+ expression();
|
|
|
|
|
+ emitBytes(OP_SET_PROPERTY, name);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ emitBytes(OP_GET_PROPERTY, name);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
ParseRule rules[] = {
|
|
ParseRule rules[] = {
|
|
|
[TOKEN_LEFT_PAREN] = {grouping, call, PREC_CALL},
|
|
[TOKEN_LEFT_PAREN] = {grouping, call, PREC_CALL},
|
|
|
[TOKEN_RIGHT_PAREN] = {NULL, NULL, PREC_NONE},
|
|
[TOKEN_RIGHT_PAREN] = {NULL, NULL, PREC_NONE},
|
|
|
[TOKEN_LEFT_BRACE] = {NULL, NULL, PREC_NONE},
|
|
[TOKEN_LEFT_BRACE] = {NULL, NULL, PREC_NONE},
|
|
|
[TOKEN_RIGHT_BRACE] = {NULL, NULL, PREC_NONE},
|
|
[TOKEN_RIGHT_BRACE] = {NULL, NULL, PREC_NONE},
|
|
|
[TOKEN_COMMA] = {NULL, NULL, PREC_NONE},
|
|
[TOKEN_COMMA] = {NULL, NULL, PREC_NONE},
|
|
|
- [TOKEN_DOT] = {NULL, NULL, PREC_NONE},
|
|
|
|
|
|
|
+ [TOKEN_DOT] = {NULL, dot, PREC_CALL},
|
|
|
[TOKEN_MINUS] = {unary, binary, PREC_TERM},
|
|
[TOKEN_MINUS] = {unary, binary, PREC_TERM},
|
|
|
[TOKEN_PLUS] = {NULL, binary, PREC_TERM},
|
|
[TOKEN_PLUS] = {NULL, binary, PREC_TERM},
|
|
|
[TOKEN_SEMICOLON] = {NULL, NULL, PREC_NONE},
|
|
[TOKEN_SEMICOLON] = {NULL, NULL, PREC_NONE},
|