Hash Tables 20

This commit is contained in:
nazrin 2025-06-07 04:09:48 +00:00
parent 3b234814fa
commit a7b7348f61
20 changed files with 868 additions and 837 deletions

View file

@ -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),
];