Types of Values 18
This commit is contained in:
parent
41404633da
commit
10c44eab2e
7 changed files with 230 additions and 28 deletions
|
|
@ -3,30 +3,32 @@ module clox.parserules;
|
|||
import clox.compiler;
|
||||
import clox.chunk;
|
||||
import clox.scanner;
|
||||
import clox.value;
|
||||
|
||||
alias ParseFn = void function(Compiler* compiler);
|
||||
|
||||
void number(Compiler* compiler){
|
||||
private void number(Compiler* compiler){
|
||||
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);
|
||||
compiler.emitter.emitConstant(Value.num(value));
|
||||
}
|
||||
void grouping(Compiler* compiler){
|
||||
private void grouping(Compiler* compiler){
|
||||
compiler.parser.expression();
|
||||
compiler.parser.consume(Token.Type.RightParen, "Expect ')' after expression.");
|
||||
}
|
||||
void unary(Compiler* compiler){
|
||||
private void unary(Compiler* compiler){
|
||||
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;
|
||||
default: assert(0);
|
||||
}
|
||||
}
|
||||
void binary(Compiler* compiler){
|
||||
private void binary(Compiler* compiler){
|
||||
Token operator = compiler.parser.previous;
|
||||
immutable(ParseRule)* rule = ParseRule.get(operator.type);
|
||||
compiler.parser.parsePrecedence(cast(Precedence)(rule.precedence + 1));
|
||||
|
|
@ -36,6 +38,24 @@ void binary(Compiler* compiler){
|
|||
case Token.Type.Minus: compiler.emitter.emit(OpCode.Subtract); break;
|
||||
case Token.Type.Star: compiler.emitter.emit(OpCode.Multiply); break;
|
||||
case Token.Type.Slash: compiler.emitter.emit(OpCode.Divide); break;
|
||||
|
||||
case Token.Type.BangEqual: compiler.emitter.emit(OpCode.NotEqual); break;
|
||||
case Token.Type.EqualEqual: compiler.emitter.emit(OpCode.Equal); break;
|
||||
|
||||
case Token.Type.Greater: compiler.emitter.emit(OpCode.Greater); break;
|
||||
case Token.Type.GreaterEqual: compiler.emitter.emit(OpCode.GreaterEqual); break;
|
||||
|
||||
case Token.Type.Less: compiler.emitter.emit(OpCode.Less); break;
|
||||
case Token.Type.LessEqual: compiler.emitter.emit(OpCode.LessEqual); break;
|
||||
|
||||
default: assert(0);
|
||||
}
|
||||
}
|
||||
private void literal(Compiler* compiler){
|
||||
switch(compiler.parser.previous.type){
|
||||
case Token.Type.True: compiler.emitter.emit(OpCode.True); break;
|
||||
case Token.Type.False: compiler.emitter.emit(OpCode.False); break;
|
||||
case Token.Type.Nil: compiler.emitter.emit(OpCode.Nil); break;
|
||||
default: assert(0);
|
||||
}
|
||||
}
|
||||
|
|
@ -75,31 +95,31 @@ immutable ParseRule[Token.Type.max+1] rules = [
|
|||
Token.Type.Semicolon : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Slash : ParseRule(null, &binary, Precedence.Factor),
|
||||
Token.Type.Star : ParseRule(null, &binary, Precedence.Factor),
|
||||
Token.Type.Bang : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.BangEqual : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Bang : ParseRule(&unary, null, Precedence.None),
|
||||
Token.Type.BangEqual : ParseRule(null, &binary, Precedence.Equality),
|
||||
Token.Type.Equal : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.EqualEqual : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Greater : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.GreaterEqual : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Less : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.LessEqual : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.EqualEqual : ParseRule(null, &binary, Precedence.Equality),
|
||||
Token.Type.Greater : ParseRule(null, &binary, Precedence.Comparison),
|
||||
Token.Type.GreaterEqual : ParseRule(null, &binary, Precedence.Comparison),
|
||||
Token.Type.Less : ParseRule(null, &binary, Precedence.Comparison),
|
||||
Token.Type.LessEqual : ParseRule(null, &binary, Precedence.Comparison),
|
||||
Token.Type.Identifier : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.String : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Number : ParseRule(&number, null, Precedence.None),
|
||||
Token.Type.And : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Class : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Else : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.False : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.False : ParseRule(&literal, null, Precedence.None),
|
||||
Token.Type.For : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Fun : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.If : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Nil : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Nil : ParseRule(&literal, null, Precedence.None),
|
||||
Token.Type.Or : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Print : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Return : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Super : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.This : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.True : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.True : ParseRule(&literal, null, Precedence.None),
|
||||
Token.Type.Var : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.While : ParseRule(null, null, Precedence.None),
|
||||
Token.Type.Error : ParseRule(null, null, Precedence.None),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue