Added LoxPrintMultiple version

This commit is contained in:
nazrin 2025-06-02 02:24:09 +00:00
parent a21c16d7e5
commit b0d934707b
4 changed files with 23 additions and 7 deletions

View file

@ -8,7 +8,7 @@ dependency "taggedalgebraic" version="~>0.11.23"
targetType "executable" targetType "executable"
buildRequirements "requireBoundsCheck" "requireContracts" buildRequirements "requireBoundsCheck" "requireContracts"
versions "LoxConcatNonStrings" "LoxExtraNativeFuncs" versions "LoxConcatNonStrings" "LoxExtraNativeFuncs" "LoxPrintMultiple"
configuration "jlox" { configuration "jlox" {
sourcePaths "src/jlox" "src/common" sourcePaths "src/jlox" "src/common"

View file

@ -116,8 +116,12 @@ class Interpreter : Stmt.Visitor!void, Expr.Visitor!TValue {
execute(stmt.elseBranch); execute(stmt.elseBranch);
} }
void visit(Stmt.Print stmt){ void visit(Stmt.Print stmt){
TValue value = evaluate(stmt.expression); version(LoxPrintMultiple){
writeln(tvalueToString(value)); writeln(stmt.expressions.map!(x => evaluate(x)).map!tvalueToString.join("\t"));
} else {
TValue value = evaluate(stmt.expression);
writeln(tvalueToString(value));
}
} }
void visit(Stmt.Return stmt){ void visit(Stmt.Return stmt){
TValue value = stmt.value !is null ? evaluate(stmt.value) : TValue.nil(tvalueNil); TValue value = stmt.value !is null ? evaluate(stmt.value) : TValue.nil(tvalueNil);

View file

@ -81,9 +81,18 @@ class Parser{
} }
private Stmt printStatement(){ private Stmt printStatement(){
Expr value = expression(); version(LoxPrintMultiple){
consume(TokenType.SEMICOLON, "Expect ';' after value."); Expr[] values;
return new Stmt.Print(value); do {
values ~= expression();
} while(match(TokenType.COMMA));
consume(TokenType.SEMICOLON, "Expect ';' after values.");
return new Stmt.Print(values);
} else {
Expr value = expression();
consume(TokenType.SEMICOLON, "Expect ';' after value.");
return new Stmt.Print(value);
}
} }
private Stmt returnStatement(){ private Stmt returnStatement(){
Token keyword = previous(); Token keyword = previous();

View file

@ -50,7 +50,10 @@ abstract class Stmt{
mixin defCtorAndAccept; mixin defCtorAndAccept;
} }
static class Print : typeof(this){ static class Print : typeof(this){
Expr expression; version(LoxPrintMultiple)
Expr[] expressions;
else
Expr expression;
mixin defCtorAndAccept; mixin defCtorAndAccept;
} }
static class Return : typeof(this){ static class Return : typeof(this){