Global Variables 21
This commit is contained in:
parent
a7b7348f61
commit
4f2211eb72
9 changed files with 178 additions and 36 deletions
|
|
@ -8,13 +8,13 @@ import clox.emitter;
|
|||
import clox.value;
|
||||
import clox.object;
|
||||
|
||||
alias ParseFn = void function(Compiler* compiler);
|
||||
alias ParseFn = void function(Compiler* compiler, bool canAssign = false);
|
||||
|
||||
private void grouping(Compiler* compiler){
|
||||
private void grouping(Compiler* compiler, bool _){
|
||||
compiler.parser.expression();
|
||||
compiler.parser.consume(Token.Type.RightParen, "Expect ')' after expression.");
|
||||
}
|
||||
private void unary(Compiler* compiler){
|
||||
private void unary(Compiler* compiler, bool _){
|
||||
Token operator = compiler.parser.previous;
|
||||
compiler.parser.parsePrecedence(Precedence.Unary);
|
||||
compiler.emitter.setLine(operator.line);
|
||||
|
|
@ -24,7 +24,7 @@ private void unary(Compiler* compiler){
|
|||
default: assert(0);
|
||||
}
|
||||
}
|
||||
private void binary(Compiler* compiler){
|
||||
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));
|
||||
|
|
@ -48,14 +48,14 @@ private void binary(Compiler* compiler){
|
|||
}
|
||||
}
|
||||
|
||||
private void number(Compiler* compiler){
|
||||
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){
|
||||
private void literal(Compiler* compiler, bool _){
|
||||
Token token = compiler.parser.previous;
|
||||
compiler.emitter.setLine(token.line);
|
||||
switch(token.type){
|
||||
|
|
@ -65,13 +65,16 @@ private void literal(Compiler* compiler){
|
|||
default: assert(0);
|
||||
}
|
||||
}
|
||||
private void strlit(Compiler* compiler){
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
struct ParseRule{
|
||||
|
|
@ -117,7 +120,7 @@ immutable ParseRule[Token.Type.max+1] rules = [
|
|||
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.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),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue