feat(tazjin/rlox): Add support for print statement

Change-Id: Ic3e7e722325c8784b848c0bcd573c2e51e123c40
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2583
Reviewed-by: tazjin <mail@tazj.in>
Tested-by: BuildkiteCI
This commit is contained in:
Vincent Ambo 2021-03-02 22:15:08 +02:00 committed by tazjin
parent 432e7a7ddd
commit 2cd77ea26d
3 changed files with 61 additions and 5 deletions

View file

@ -156,11 +156,10 @@ fn rule_for<T: Iterator<Item = Token>>(token: &TokenKind) -> ParseRule<T> {
impl<T: Iterator<Item = Token>> Compiler<T> {
fn compile(&mut self) -> LoxResult<()> {
self.advance();
self.expression()?;
self.consume(
&TokenKind::Eof,
ErrorKind::ExpectedToken("Expected end of expression"),
);
while !self.match_token(&TokenKind::Eof) {
self.declaration()?;
}
self.end_compiler()
}
@ -174,6 +173,28 @@ impl<T: Iterator<Item = Token>> Compiler<T> {
self.parse_precedence(Precedence::Assignment)
}
fn declaration(&mut self) -> LoxResult<()> {
self.statement()
}
fn statement(&mut self) -> LoxResult<()> {
if self.match_token(&TokenKind::Print) {
return self.print_statement();
}
Ok(())
}
fn print_statement(&mut self) -> LoxResult<()> {
self.expression()?;
self.consume(
&TokenKind::Semicolon,
ErrorKind::ExpectedToken("Expected ';' after value"),
);
self.emit_op(OpCode::OpPrint);
Ok(())
}
fn number(&mut self) -> LoxResult<()> {
if let TokenKind::Number(num) = self.previous().kind {
self.emit_constant(Value::Number(num));
@ -352,6 +373,19 @@ impl<T: Iterator<Item = Token>> Compiler<T> {
self.panic = true;
self.errors.push(Error { kind, line })
}
fn match_token(&mut self, token: &TokenKind) -> bool {
if !self.check(token) {
return false;
}
self.advance();
true
}
fn check(&self, token: &TokenKind) -> bool {
return self.current().kind == *token;
}
}
pub fn compile(code: &str) -> Result<(Interner, Chunk), Vec<Error>> {