From 4a457f57a732a4e1f23b61a52c3dc60aefa088aa Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Tue, 10 Dec 2024 19:54:27 -0600 Subject: [PATCH] Make Reader not rely on KissState specifically --- src/kiss/Kiss.hx | 6 +----- src/kiss/Macros.hx | 2 +- src/kiss/Reader.hx | 36 +++++++++++++++++++++--------------- 3 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/kiss/Kiss.hx b/src/kiss/Kiss.hx index 4894f02..06c6af9 100644 --- a/src/kiss/Kiss.hx +++ b/src/kiss/Kiss.hx @@ -41,13 +41,10 @@ typedef FormDoc = { }; typedef KissState = { + > HasReadTables, className:String, pack:Array, file:String, - readTable:ReadTable, - startOfLineReadTable:ReadTable, - startOfFileReadTable:ReadTable, - endOfFileReadTable:ReadTable, fieldForms:Map, specialForms:Map, specialFormMacroExpanders:Map, @@ -57,7 +54,6 @@ typedef KissState = { wrapListExps:Bool, loadedFiles:Map>, callAliases:Map, - identAliases:Map, typeAliases:Map, fieldList:Array, // TODO This map was originally created to track whether the programmer wrote their own main function, but could also diff --git a/src/kiss/Macros.hx b/src/kiss/Macros.hx index edbfa9f..825952f 100644 --- a/src/kiss/Macros.hx +++ b/src/kiss/Macros.hx @@ -610,7 +610,7 @@ class Macros { if (streamArgName == null) throw messageForBadArgs; for (s in strings) { - table[s] = (stream, k) -> { + table[s] = (stream, k:Dynamic) -> { if (strings.length > 1) { stream.putBackString(s); } diff --git a/src/kiss/Reader.hx b/src/kiss/Reader.hx index a1291a1..ef42b2b 100644 --- a/src/kiss/Reader.hx +++ b/src/kiss/Reader.hx @@ -2,12 +2,11 @@ package kiss; import haxe.ds.Option; import kiss.Stream; -import kiss.Kiss; import kiss.ReaderExp; using kiss.Reader; +using kiss.ExpBuilder; using kiss.Stream; -using kiss.Helpers; using StringTools; class UnmatchedBracketSignal { @@ -22,8 +21,15 @@ class UnmatchedBracketSignal { } } -typedef ReadFunction = (Stream, KissState) -> Null; +typedef ReadFunction = (Stream, HasReadTables) -> Null; typedef ReadTable = Map; +typedef HasReadTables = { + readTable:ReadTable, + startOfLineReadTable:ReadTable, + startOfFileReadTable:ReadTable, + endOfFileReadTable:ReadTable, + identAliases:Map +}; @:allow(kiss.Helpers) class Reader { @@ -163,7 +169,7 @@ class Reader { // -+>countVar {body} // -+>countVar (body) // or any of those with the first expression after -> or -+> prefixed by :Void - function arrowSyntax(countingLambda:Bool, stream:Stream, k:KissState) { + function arrowSyntax(countingLambda:Bool, stream:Stream, k:HasReadTables) { var countVar = if (countingLambda) { _assertRead(stream, k); } else { @@ -209,7 +215,7 @@ class Reader { readTable["-+>"] = arrowSyntax.bind(true); // Because macro keys are sorted by length and peekChars(0) returns "", this will be used as the default reader macro: - readTable[""] = (stream:Stream, k:KissState) -> { + readTable[""] = (stream:Stream, k:HasReadTables) -> { var position = stream.position(); var token = nextToken(stream, "a symbol name"); // Process dot-access on alias identifiers @@ -263,11 +269,11 @@ class Reader { } } - public static function assertRead(stream:Stream, k:KissState):ReaderExp { + public static function assertRead(stream:Stream, k:HasReadTables):ReaderExp { return _assertRead(stream, k); } - static function _assertRead(stream:Stream, k:KissState):ReaderExp { + static function _assertRead(stream:Stream, k:HasReadTables):ReaderExp { var position = stream.position(); return switch (_read(stream, k)) { case Some(exp): @@ -294,12 +300,12 @@ class Reader { return null; } - public static function read(stream:Stream, k:KissState):Option { + public static function read(stream:Stream, k:HasReadTables):Option { assertNoPriorState(stream); return _read(stream, k); } - static function _read(stream:Stream, k:KissState):Option { + static function _read(stream:Stream, k:HasReadTables):Option { var readTable = k.readTable; stream.dropWhitespace(); @@ -327,7 +333,7 @@ class Reader { } } - static function _readOr(stream:Stream, k:KissState, defaultExp:ReaderExp):ReaderExp { + static function _readOr(stream:Stream, k:HasReadTables, defaultExp:ReaderExp):ReaderExp { return switch (_read(stream, k)) { case Some(exp): exp; @@ -356,12 +362,12 @@ class Reader { } } - public static function readExpArray(stream:Stream, end:String, k:KissState, allowEof=false, startingPos=null):Array { + public static function readExpArray(stream:Stream, end:String, k:HasReadTables, allowEof=false, startingPos=null):Array { assertNoPriorState(stream); return _readExpArray(stream, end, k, allowEof, startingPos); } - static function _readExpArray(stream:Stream, end:String, k:KissState, allowEof=false, startingPos=null):Array { + static function _readExpArray(stream:Stream, end:String, k:HasReadTables, allowEof=false, startingPos=null):Array { var array = []; if (startingPos == null) startingPos = stream.position(); @@ -405,7 +411,7 @@ class Reader { Read all the expressions in the given stream, processing them one by one while reading. They can't be read all at once because some expressions change the Readtable state **/ - public static function readAndProcess(stream:Stream, k:KissState, process:(ReaderExp) -> Void, nested = false) { + public static function readAndProcess(stream:Stream, k:HasReadTables, process:(ReaderExp) -> Void, nested = false) { if (nested) { nestedReadExpArrayStartPositions.push(readExpArrayStartPositions); readExpArrayStartPositions = []; @@ -469,7 +475,7 @@ class Reader { } // Read a string literal OR a shell section which supports interpolation - static function readString(stream:Stream, k:KissState, shell = false) { + static function readString(stream:Stream, k:HasReadTables, shell = false) { var pos = stream.position(); var stringParts:Array = []; var currentStringPart = ""; @@ -554,7 +560,7 @@ class Reader { } // Read a raw string literal - static function readRawString(stream:Stream, k:KissState) { + static function readRawString(stream:Stream, k:HasReadTables) { var terminator = '"#'; do { var next = stream.expect('# or "', () -> stream.takeChars(1));