Jumping Back and Forth 23
This commit is contained in:
parent
98e7f950cf
commit
8717d37445
13 changed files with 299 additions and 30 deletions
|
|
@ -17,7 +17,6 @@ private void grouping(Compiler* compiler, bool _){
|
|||
private void unary(Compiler* compiler, bool _){
|
||||
Token operator = compiler.parser.previous;
|
||||
compiler.parser.parsePrecedence(Precedence.Unary);
|
||||
compiler.emitter.setLine(operator.line);
|
||||
switch(operator.type){
|
||||
case Token.Type.Minus: compiler.emitter.emit(OpCode.Negate); break;
|
||||
case Token.Type.Bang: compiler.emitter.emit(OpCode.Not); break;
|
||||
|
|
@ -28,7 +27,6 @@ private void binary(Compiler* compiler, bool _){
|
|||
Token operator = compiler.parser.previous;
|
||||
immutable(ParseRule)* rule = ParseRule.get(operator.type);
|
||||
compiler.parser.parsePrecedence(cast(Precedence)(rule.precedence + 1));
|
||||
compiler.emitter.setLine(operator.line);
|
||||
switch(operator.type){
|
||||
case Token.Type.Plus: compiler.emitter.emit(OpCode.Add); break;
|
||||
case Token.Type.Minus: compiler.emitter.emit(OpCode.Subtract); break;
|
||||
|
|
@ -52,12 +50,10 @@ private void number(Compiler* compiler, bool _){
|
|||
import core.stdc.stdlib : strtod;
|
||||
Token token = compiler.parser.previous;
|
||||
double value = strtod(token.lexeme.ptr, null);
|
||||
compiler.emitter.setLine(token.line);
|
||||
compiler.emitter.emitConstant(Value.from(value));
|
||||
}
|
||||
private void literal(Compiler* compiler, bool _){
|
||||
Token token = compiler.parser.previous;
|
||||
compiler.emitter.setLine(token.line);
|
||||
switch(token.type){
|
||||
case Token.Type.True: compiler.emitter.emit(OpCode.True); break;
|
||||
case Token.Type.False: compiler.emitter.emit(OpCode.False); break;
|
||||
|
|
@ -69,12 +65,29 @@ private void strlit(Compiler* compiler, bool _){
|
|||
Token token = compiler.parser.previous;
|
||||
const char[] str = token.lexeme[1 .. $-1];
|
||||
Obj.String* strObj = Obj.String.copy(str);
|
||||
compiler.emitter.setLine(token.line);
|
||||
compiler.emitter.emitConstant(Value.from(strObj));
|
||||
}
|
||||
private void variable(Compiler* compiler, bool canAssign){
|
||||
compiler.parser.namedVariable(compiler.parser.previous, canAssign);
|
||||
}
|
||||
private void and(Compiler* compiler, bool _){
|
||||
int endJump = compiler.parser.emitJump(OpCode.JumpIfFalse);
|
||||
|
||||
compiler.emitter.emit(OpCode.Pop);
|
||||
compiler.parser.parsePrecedence(Precedence.And);
|
||||
|
||||
compiler.parser.patchJump(endJump);
|
||||
}
|
||||
private void or(Compiler* compiler, bool _){
|
||||
int elseJump = compiler.parser.emitJump(OpCode.JumpIfFalse);
|
||||
int endJump = compiler.parser.emitJump(OpCode.Jump);
|
||||
|
||||
compiler.parser.patchJump(elseJump);
|
||||
compiler.emitter.emit(OpCode.Pop);
|
||||
|
||||
compiler.parser.parsePrecedence(Precedence.Or);
|
||||
compiler.parser.patchJump(endJump);
|
||||
}
|
||||
|
||||
|
||||
struct ParseRule{
|
||||
|
|
@ -123,7 +136,7 @@ immutable ParseRule[Token.Type.max+1] rules = [
|
|||
Token.Type.Identifier : ParseRule(&variable, null, Precedence.None),
|
||||
Token.Type.String : ParseRule(&strlit, null, Precedence.None),
|
||||
Token.Type.Number : ParseRule(&number, null, Precedence.None),
|
||||
Token.Type.And : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.And : ParseRule(null, &and, Precedence.And),
|
||||
Token.Type.Class : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Else : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.False : ParseRule(&literal, null, Precedence.None),
|
||||
|
|
@ -131,7 +144,7 @@ immutable ParseRule[Token.Type.max+1] rules = [
|
|||
Token.Type.Fun : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.If : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Nil : ParseRule(&literal, null, Precedence.None),
|
||||
Token.Type.Or : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Or : ParseRule(null, &or, Precedence.Or),
|
||||
Token.Type.Print : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Return : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Super : ParseRule(null, null, Precedence.None),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue