Hash Tables 20
This commit is contained in:
parent
3b234814fa
commit
a7b7348f61
20 changed files with 868 additions and 837 deletions
|
|
@ -1,20 +1,15 @@
|
|||
module clox.parserules;
|
||||
|
||||
import clox.compiler;
|
||||
import clox.chunk;
|
||||
import clox.compiler;
|
||||
import clox.parser;
|
||||
import clox.scanner;
|
||||
import clox.emitter;
|
||||
import clox.value;
|
||||
import clox.object;
|
||||
|
||||
alias ParseFn = void function(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.num(value));
|
||||
}
|
||||
private void grouping(Compiler* compiler){
|
||||
compiler.parser.expression();
|
||||
compiler.parser.consume(Token.Type.RightParen, "Expect ')' after expression.");
|
||||
|
|
@ -25,7 +20,7 @@ private void unary(Compiler* compiler){
|
|||
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;
|
||||
case Token.Type.Bang: compiler.emitter.emit(OpCode.Not); break;
|
||||
default: assert(0);
|
||||
}
|
||||
}
|
||||
|
|
@ -52,6 +47,14 @@ private void binary(Compiler* compiler){
|
|||
default: assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
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.from(value));
|
||||
}
|
||||
private void literal(Compiler* compiler){
|
||||
Token token = compiler.parser.previous;
|
||||
compiler.emitter.setLine(token.line);
|
||||
|
|
@ -62,19 +65,20 @@ private void literal(Compiler* compiler){
|
|||
default: assert(0);
|
||||
}
|
||||
}
|
||||
private void strlit(Compiler* compiler) @nogc{
|
||||
private void strlit(Compiler* compiler){
|
||||
Token token = compiler.parser.previous;
|
||||
string str = token.lexeme[1 .. $-1];
|
||||
const char[] str = token.lexeme[1 .. $-1];
|
||||
Obj.String* strObj = Obj.String.copy(str);
|
||||
compiler.emitter.setLine(token.line);
|
||||
compiler.emitter.emitConstant(Value.str(strObj));
|
||||
compiler.emitter.emitConstant(Value.from(strObj));
|
||||
}
|
||||
|
||||
|
||||
struct ParseRule{
|
||||
ParseFn prefix;
|
||||
ParseFn infix;
|
||||
Precedence precedence;
|
||||
static immutable(ParseRule)* get(Token.Type type) @nogc nothrow{
|
||||
static immutable(ParseRule)* get(Token.Type type){
|
||||
return &rules[type];
|
||||
}
|
||||
}
|
||||
|
|
@ -136,3 +140,5 @@ immutable ParseRule[Token.Type.max+1] rules = [
|
|||
Token.Type.EOF : ParseRule(null, null, Precedence.None),
|
||||
];
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue