From cc15d58c5483169b4e23c94351fc9c4071f34fb0 Mon Sep 17 00:00:00 2001 From: Nenad Rakocevic Date: Tue, 5 May 2020 20:28:10 +0200 Subject: [PATCH] FEAT: removes percent-encoding from files, uses double-quotes when needed instead. --- docs/lexer/lexer-FSM.csv | 6 +- docs/lexer/lexer-FSM.xlsx | Bin 22315 -> 22195 bytes docs/lexer/lexer-states.txt | 37 ++--- runtime/datatypes/file.reds | 26 +++- runtime/lexer-transitions.reds | 162 ++++++++++---------- runtime/lexer.reds | 10 +- tests/source/units/lexer-test.red | 57 ++++--- tests/source/units/serialization-test.red | 4 +- utils/generate-lexer-table.red | 176 +++++++++++----------- 9 files changed, 236 insertions(+), 242 deletions(-) diff --git a/docs/lexer/lexer-FSM.csv b/docs/lexer/lexer-FSM.csv index fa4e765320..c134e28010 100644 --- a/docs/lexer/lexer-FSM.csv +++ b/docs/lexer/lexer-FSM.csv @@ -6,11 +6,9 @@ S_SKIP_STR;S_LINE_STR;S_LINE_STR;S_LINE_STR;S_LINE_STR;S_LINE_STR;S_LINE_STR;S_L S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;T_MSTR_OP;T_MSTR_CL;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_SKIP_MSTR;S_M_STRING;S_M_STRING;T_ERROR;T_ERROR S_SKIP_MSTR;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;S_M_STRING;T_ERROR;T_EOF S_FILE_1ST;T_WORD;T_WORD;S_FILE;S_FILE;T_WORD;T_WORD;T_WORD;T_WORD;S_HERDOC_ST;T_WORD;S_FILE_STR;S_FILE;S_FILE;S_PERCENT;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_HDPER_ST;S_FILE;T_WORD;T_WORD;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;T_ERROR;T_WORD -S_FILE;T_FILE;T_FILE;S_FILE;S_FILE;T_FILE;T_FILE;T_FILE;T_FILE;T_FILE;T_FILE;T_ERROR;S_FILE;S_FILE;T_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE_HEX1;S_FILE;T_FILE;T_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;T_ERROR;T_FILE -S_FILE_HEX1;T_ERROR;T_ERROR;S_FILE_HEX2;S_FILE_HEX2;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;S_FILE_HEX2;S_FILE_HEX2;S_FILE_HEX2;S_FILE_HEX2;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR -S_FILE_HEX2;T_ERROR;T_ERROR;S_FILE;S_FILE;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;S_FILE_HEX2;S_FILE_HEX2;S_FILE;S_FILE;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR +S_FILE;T_FILE;T_FILE;S_FILE;S_FILE;T_FILE;T_FILE;T_FILE;T_FILE;T_FILE;T_FILE;T_ERROR;S_FILE;S_FILE;T_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;T_FILE;T_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;S_FILE;T_ERROR;T_FILE S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;T_FILE;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;S_FILE_STR;T_ERROR;T_ERROR -S_HDPER_ST;T_WORD;T_WORD;S_FILE_HEX2;S_FILE_HEX2;T_WORD;T_WORD;T_WORD;T_WORD;S_HERDOC_ST;T_WORD;T_WORD;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;S_FILE_HEX2;S_FILE_HEX2;S_FILE_HEX2;S_FILE_HEX2;T_ERROR;T_WORD;T_ERROR;T_ERROR;T_ERROR;S_HDPER_ST;T_ERROR;T_WORD;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_WORD +S_HDPER_ST;T_WORD;T_WORD;T_ERROR;T_ERROR;T_WORD;T_WORD;T_WORD;T_WORD;S_HERDOC_ST;T_WORD;T_WORD;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_WORD;T_ERROR;T_ERROR;T_ERROR;S_HDPER_ST;T_ERROR;T_WORD;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_WORD S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HDPER_C0;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;T_ERROR;T_ERROR S_HDPER_C0;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HDPER_C0;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HDPER_CL;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;S_HERDOC_ST;T_ERROR;T_ERROR S_HDPER_CL;T_RAWSTRING;T_RAWSTRING;T_ERROR;T_ERROR;T_RAWSTRING;T_RAWSTRING;T_RAWSTRING;T_RAWSTRING;T_RAWSTRING;T_ERROR;T_RAWSTRING;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_RAWSTRING;T_ERROR;T_ERROR;S_HDPER_CL;T_ERROR;T_RAWSTRING;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_ERROR;T_RAWSTRING diff --git a/docs/lexer/lexer-FSM.xlsx b/docs/lexer/lexer-FSM.xlsx index 7c5ee052978414be9fbe86177b51735f7c26d772..121dc0dbe92d4c891dd878f9a0f5e08ab1db6f46 100644 GIT binary patch literal 22195 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 A0RR91 literal 22315 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"/"->S_SLASH->not(delimit1)->S_SLASH \->delimit1->T_REFINE S_START->"%"->S_FILE_1ST->not(delimit8)->S_FILE->not(delimit1)->S_FILE - \ \->"%"->S_FILE_HEX1->hexa->S_FILE_HEX2->hexa->S_FILE - \ \ \ \->not(hexa)->T_ERROR - \ \ \->not(hexa)->T_ERROR - \ \ - \ \->delimit1->T_FILE - \ - \->dbl-quote->S_FILE_STR->not(dbl-quote)->S_FILE_STR - \ \->dbl-quote->T_FILE - \ - \->"%"->S_HDPER_ST->"%"->S_HDPER_ST - \ \->"{"->S_HERDOC_ST - \ \->hexa->S_FILE_HEX2 - \ \->delimit7->T_WORD - \ \->else->T_ERROR - \ - \->"{"->S_HERDOC_ST->"}"->S_HDPER_C0->"%"->S_HDPER_CL->"%"->S_HDPER_CL - \ \ \ \->else->T_RAWSTRING - \ \ \->else->S_HERDOC_ST - \ \->else->S_HERDOC_ST - \->delimit8->T_WORD + \ \->delimit1->T_FILE + \ + \->dbl-quote->S_FILE_STR->not(dbl-quote)->S_FILE_STR + \ \->dbl-quote->T_FILE + \ + \->"%"->S_HDPER_ST->"%"->S_HDPER_ST + \ \->"{"->S_HERDOC_ST + \ \->delimit7->T_WORD + \ \->else->T_ERROR + \ + \->"{"->S_HERDOC_ST->"}"->S_HDPER_C0->"%"->S_HDPER_CL->"%"->S_HDPER_CL + \ \ \ \->else->T_RAWSTRING + \ \ \->else->S_HERDOC_ST + \ \->else->S_HERDOC_ST + \->delimit8->T_WORD S_START->"#"->S_SHARP->"{"->S_BINARY->hexa|ws->S_BINARY diff --git a/runtime/datatypes/file.reds b/runtime/datatypes/file.reds index 9d5c88ee3c..1da22fcf43 100644 --- a/runtime/datatypes/file.reds +++ b/runtime/datatypes/file.reds @@ -176,11 +176,13 @@ file: context [ s [series!] unit [integer!] cp [integer!] + idx [integer!] p [byte-ptr!] p4 [int-ptr!] head [byte-ptr!] tail [byte-ptr!] empty? [logic!] + esc? [logic!] ][ #if debug? = yes [if verbose > 0 [print-line "file/mold"]] @@ -206,15 +208,35 @@ file: context [ either empty? [ string/concatenate-literal buffer {""} ][ - while [p < tail][ + while [p < tail][ ;-- prescan for special characters cp: switch unit [ Latin1 [as-integer p/value] UCS-2 [(as-integer p/2) << 8 + p/1] UCS-4 [p4: as int-ptr! p p4/value] ] - string/append-escaped-char buffer cp string/ESC_URL all? + idx: cp + 1 + if all [ + cp < MAX_URL_CHARS + string/escape-url-chars/idx = (as byte! string/ESC_URL) + ][ + break + ] + p: p + unit + ] + esc?: p < tail + p: head + if esc? [string/append-char GET_BUFFER(buffer) as-integer #"^""] + + while [p < tail][ ;-- generate the molded version + cp: switch unit [ + Latin1 [as-integer p/value] + UCS-2 [(as-integer p/2) << 8 + p/1] + UCS-4 [p4: as int-ptr! p p4/value] + ] + string/append-char GET_BUFFER(buffer) cp p: p + unit ] + if esc? [string/append-char GET_BUFFER(buffer) as-integer #"^""] ] part - ((as-integer tail - head) >> (log-b unit)) - 1 ] diff --git a/runtime/lexer-transitions.reds b/runtime/lexer-transitions.reds index 1e15aa38d9..5c5f3d8aa5 100644 --- a/runtime/lexer-transitions.reds +++ b/runtime/lexer-transitions.reds @@ -10,8 +10,6 @@ Red/System [ S_SKIP_MSTR S_FILE_1ST S_FILE - S_FILE_HEX1 - S_FILE_HEX2 S_FILE_STR S_HDPER_ST S_HERDOC_ST @@ -103,90 +101,86 @@ Red/System [ skip-table: #{ 0100000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000000000000000000 -00 +00000000000000000000000000000000000000000000000000000000000000 } type-table: #{ -000007070707080808080807070707130F1429000A0A00140B0C0C0C0C0C272F -2B2B25253131310B0F0B2C2C2C2C0F0F0C0F0F100F092D32190B0F0F140F0000 -2200000000000700000000070F140B130A0829260C0C272F252B312C092D0B07 -32 +00000707070708080807070707130F1429000A0A00140B0C0C0C0C0C272F2B2B +25253131310B0F0B2C2C2C2C0F0F0C0F0F100F092D32190B0F0F140F00002200 +000000000700000000070F140B130A0829260C0C272F252B312C092D0B0732 } transitions: #{ -0000181841424344454002113131323232322732270F402A3232064001372F24 -2E2E403232403F014A0101010101010101010101010101010101010101010101 -010101010101010101010101403F020202020202020202024B02020202020202 -0202020202020202020202020202020203020240400202020202020202020202 -0202020202020202020202020202020202020202020202020202403F04040404 -0404040445460404040404040404040404040404040404040404040404040504 -0440400404040404040404040404040404040404040404040404040404040404 -0404040404040404403F4C4C07074C4C4C4C0C4C0A0707340707070707070707 -070707070B074C4C07070707070707404C515107075151515151514007075107 -0707070707070707070707080751510707070707070740514040090940404040 -4040404040404040400909090940404040404040404040404040404040404040 -4007074040404040404040404040404009090707404040404040404040404040 -4040404040400A0A0A0A0A0A0A0A0A0A510A0A0A0A0A0A0A0A0A0A0A0A0A0A0A -0A0A0A0A0A0A0A0A0A0A0A40404C4C09094C4C4C4C0C4C4C4040404040400909 -0909404C4040400B404C4040404040404040404C0C0C0C0C0C0C0C0C0C0D0C0C -0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C40400C0C0C0C0C -0C0C0C0C0D0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0E0C0C0C0C0C0C0C0C0C0C -40405F5F40405F5F5F5F5F405F4040404040404040404040405F40400E405F40 -40404040404040405F4F4F0F0F4F4F4F4F4F4F4F0F0F0F0F0F0F0F0F0F0F100F -0F0F0F0F0F4F4F0F0F0F0F0F0F0F404F4C4C32324C4C4C4C4C4C4C4032323232 -3232323232103232323240324C4C32403232323232404C4D4D17171640474012 -401417174017171717171717171740404017404D4D17171717171717404D1212 -1212404040404052404040401212121212121212404040124040134040401240 -4040124040131213131313131313131313131313131313131313131313131313 -13131313131313131313403F1414141414141414141450141414141414141414 -1414141414141414141414141414151414405014141414141414141414141414 -1414141414141414141414141414141414141414141414144040161616161649 -1616161616161616161616161616161616161616161616161616161616161640 -404D4D17174D4D4D4D4D4D4D17171717171717171717171717171717174D4D17 -171717171717404D4E4E18184E4E4E4E4E4E4E111820221F291B1C40271F404E -404053194E361940401F404040404E54541A1A545454545454541D1A40224040 -1B1B404054405440405340544040404040404040405454541A1A545454545454 -544040542240401B1B40405440544040534040361E404040404040405454541B -1B545454545454544040544040404040404054405440404040403640401B1B40 -4040405454541C1C545454545454544040544040294027402754405440405340 -40361E401B1B404040405455555455555555555555551D55551D1D1D1D1D1D1D -5555551D1D555555551D551D1D551D1D405556561E1E56565656565656404056 -404040404040405640564040404040401E404040404040405657571F1F575757 -575757571F1F1F1F1F1F1F1F1F1F1F1F571F1F401F57571F571F1F40401F4057 -4040212140404040404040404040404040404040404040404040404040404040 -4040404040404059592121595959595959594040214040404040404059405940 -4040405940214040404040404059404023234040404040404040404040404040 -4040404040404040404040364040232340404040405858232358585858585858 -4040584040402323404058405840404040583623404040404040405840402525 -4040404040404040404040404040404040404040404040404040404040404040 -4040405A5A25255A5A5A5A5A5A5A5A255A404040404040405A405A404040265A -4026404040404040405A5A5A26265A5A5A5A5A5A5A5A265A404040404040405A -405A404040405A4040404040404040405A4C4C27274C4C4C4C4C4C4C40323332 -322832273227484C32323240404C3632253232323232404C5E5E32325E5E5E5E -5E5E5E40323332323232323232485E32323240405E3632253232323232405E5E -5E40405E5E5E5E5E5E5E40404040404040404040485E5E404040405E36402540 -40404040405E4C4C2B2B4C4C4C4C4C4C4C2B2D4C2B2B2B2B2B2B2B2B2B2A3232 -2B2B4C4C2B2B2B322B2B2B404C2B2B2B2B2B2B2B2B2B2B2C2B2D2B2B2B2B2B2B -2B2B2B2B2B5B2B2B2B2B2B2B2B2B2B2B2B2B40402C2C2C2C2C2C2C2C2C2C2B2C -2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C2C40402D2D2D2D2D -2D2D2D2D2D2D2D2B2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D -40404C4C18184C4C4C4C4C4C4C40403232323232323232324C40323240324C32 -2F253232403232404C4C4C30304C4C4C4C4C4C4C40323332323230303232484C -32323240404C3632403030323232404C54543030545454545454544040542240 -4030304040544054404053404040404030304040404054404040404040404040 -4040404040323232323232320F40323232344040403240323240323240404C4C -32324C4C4C4C4C4C4C40323332323232323232484C4C323240404C3632243232 -323232404C4C4C35354C4C4C4C4C4C4C35353535353535353535354C40353535 -354C3535353535353535404C4C4C40404C4C4C4C4C4C40404040404040404040 -40404C40404034404C4040404040404040404C5C5C35355C5C5C5C5C5C5C3540 -3535353535353535355C5C4035355C5C3535403535403535405C5D5D36365D5D -5D5D5D5D5D404040363636363636365D5D5D404036405D403640363640363640 -5D60603737606060606060604040373737373737373737406040403740604037 -403737403737406040403939404043444040023C3A3A3B3B3B3B3B3B3B40402A -3B3B404040363B403D3D403B3B40404E4E39394E4E4E4E4E4E4E40184E224040 -1B1B40404E404E404053194E3619404040404040404E40404040404040404040 -404040403B3B3B3B3B3B3B40403B3B3B404040403B403B3B403B3B40404C4C3B -3B4C4C4C4C4C4C4C403B4C3B3B3B3B3B3B3B4C4C3B3B3B40404C363B403B3B3B -3B3B404C4D4D1717164040404040141717401717171717171717174040401740 -4D4D17171717171717404D4C4C39394C4C4C4C4C4C4C40403232323232323232 -324C40323240324C3232323232403232404C +000016163F404142433E020F2F2F303030302530250D3E283030063E01352D22 +2C2C3E30303E3D01480101010101010101010101010101010101010101010101 +0101010101010101010101013E3D020202020202020202024902020202020202 +020202020202020202020202020202020302023E3E0202020202020202020202 +02020202020202020202020202020202020202020202020202023E3D04040404 +0404040443440404040404040404040404040404040404040404040404040504 +043E3E0404040404040404040404040404040404040404040404040404040404 +04040404040404043E3D4A4A07074A4A4A4A0A4A080707320707070707070707 +0707070709074A4A070707070707073E4A4F4F07074F4F4F4F4F4F3E07074F07 +070707070707070707070707074F4F070707070707073E4F0808080808080808 +08084F08080808080808080808080808080808080808080808080808083E3E4A +4A3E3E4A4A4A4A0A4A4A3E3E3E3E3E3E3E3E3E3E3E4A3E3E3E093E4A3E3E3E3E +3E3E3E3E3E4A0A0A0A0A0A0A0A0A0A0B0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A +0A0A0A0A0A0A0A0A0A0A0A3E3E0A0A0A0A0A0A0A0A0A0B0A0A0A0A0A0A0A0A0A +0A0A0A0A0A0A0A0C0A0A0A0A0A0A0A0A0A0A3E3E5D5D3E3E5D5D5D5D5D3E5D3E +3E3E3E3E3E3E3E3E3E3E3E5D3E3E0C3E5D3E3E3E3E3E3E3E3E3E5D4D4D0D0D4D +4D4D4D4D4D4D0D0D0D0D0D0D0D0D0D0D0E0D0D0D0D0D0D4D4D0D0D0D0D0D0D0D +3E4D4A4A30304A4A4A4A4A4A4A3E3030303030303030300E303030303E304A4A +303E30303030303E4A4B4B1515143E453E103E1215153E151515151515151515 +3E3E3E153E4B4B151515151515153E4B101010103E3E3E3E3E503E3E3E3E1010 +1010101010103E3E3E103E3E113E3E3E103E3E3E103E3E111011111111111111 +111111111111111111111111111111111111111111111111111111113E3D1212 +12121212121212124E1212121212121212121212121212121212121212121212 +1312123E4E121212121212121212121212121212121212121212121212121212 +121212121212121212123E3E1414141414471414141414141414141414141414 +14141414141414141414141414141414143E3E4B4B15154B4B4B4B4B4B4B1515 +1515151515151515151515151515154B4B151515151515153E4B4C4C16164C4C +4C4C4C4C4C0F161E201D27191A3E251D3E4C3E3E51174C34173E3E1D3E3E3E3E +4C52521818525252525252521B183E203E3E19193E3E523E523E3E513E523E3E +3E3E3E3E3E3E3E5252521818525252525252523E3E52203E3E19193E3E523E52 +3E3E513E3E341C3E3E3E3E3E3E3E5252521919525252525252523E3E523E3E3E +3E3E3E3E523E523E3E3E3E3E343E3E19193E3E3E3E5252521A1A525252525252 +523E3E523E3E273E253E25523E523E3E513E3E341C3E19193E3E3E3E52535352 +53535353535353531B53531B1B1B1B1B1B1B5353531B1B535353531B531B1B53 +1B1B3E5354541C1C545454545454543E3E543E3E3E3E3E3E3E543E543E3E3E3E +3E3E1C3E3E3E3E3E3E3E5455551D1D555555555555551D1D1D1D1D1D1D1D1D1D +1D1D551D1D3E1D55551D551D1D3E3E1D3E553E3E1F1F3E3E3E3E3E3E3E3E3E3E +3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E57571F1F575757 +575757573E3E1F3E3E3E3E3E3E3E573E573E3E3E3E573E1F3E3E3E3E3E3E3E57 +3E3E21213E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E343E3E +21213E3E3E3E3E56562121565656565656563E3E563E3E3E21213E3E563E563E +3E3E3E5634213E3E3E3E3E3E3E563E3E23233E3E3E3E3E3E3E3E3E3E3E3E3E3E +3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E3E5858232358585858585858 +5823583E3E3E3E3E3E3E583E583E3E3E24583E243E3E3E3E3E3E3E5858582424 +585858585858585824583E3E3E3E3E3E3E583E583E3E3E3E583E3E3E3E3E3E3E +3E3E584A4A25254A4A4A4A4A4A4A3E303130302630253025464A3030303E3E4A +34302330303030303E4A5C5C30305C5C5C5C5C5C5C3E30313030303030303046 +5C3030303E3E5C34302330303030303E5C5C5C3E3E5C5C5C5C5C5C5C3E3E3E3E +3E3E3E3E3E3E465C5C3E3E3E3E5C343E233E3E3E3E3E3E5C4A4A29294A4A4A4A +4A4A4A292B4A29292929292929292928303029294A4A292929302929293E4A29 +2929292929292929292A292B2929292929292929292929592929292929292929 +292929293E3E2A2A2A2A2A2A2A2A2A2A292A2A2A2A2A2A2A2A2A2A2A2A2A2A2A +2A2A2A2A2A2A2A2A2A2A2A3E3E2B2B2B2B2B2B2B2B2B2B2B2B292B2B2B2B2B2B +2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B3E3E4A4A16164A4A4A4A4A4A4A3E +3E3030303030303030304A3E30303E304A302D2330303E30303E4A4A4A2E2E4A +4A4A4A4A4A4A3E30313030302E2E3030464A3030303E3E4A34303E2E2E303030 +3E4A52522E2E525252525252523E3E52203E3E2E2E3E3E523E523E3E513E3E3E +3E3E2E2E3E3E3E3E523E3E3E3E3E3E3E3E3E3E3E3E3E3E303030303030300D3E +303030323E3E3E303E30303E30303E3E4A4A30304A4A4A4A4A4A4A3E30313030 +3030303030464A4A30303E3E4A34302230303030303E4A4A4A33334A4A4A4A4A +4A4A33333333333333333333334A3E333333334A33333333333333333E4A4A4A +3E3E4A4A4A4A4A4A3E3E3E3E3E3E3E3E3E3E3E3E4A3E3E3E323E4A3E3E3E3E3E +3E3E3E3E4A5A5A33335A5A5A5A5A5A5A333E3333333333333333335A5A3E3333 +5A5A33333E33333E33333E5A5B5B34345B5B5B5B5B5B5B3E3E3E343434343434 +345B5B5B3E3E343E5B3E343E34343E34343E5B5E5E35355E5E5E5E5E5E5E3E3E +3535353535353535353E5E3E3E353E5E3E353E35353E35353E5E3E3E37373E3E +41423E3E023A3838393939393939393E3E2839393E3E3E34393E3B3B3E39393E +3E4C4C37374C4C4C4C4C4C4C3E164C203E3E19193E3E4C3E4C3E3E51174C3417 +3E3E3E3E3E3E3E4C3E3E3E3E3E3E3E3E3E3E3E3E3E3E393939393939393E3E39 +39393E3E3E3E393E39393E39393E3E4A4A39394A4A4A4A4A4A4A3E394A393939 +393939394A4A3939393E3E4A34393E39393939393E4A4B4B1515143E3E3E3E3E +1215153E1515151515151515153E3E3E153E4B4B151515151515153E4B4A4A37 +374A4A4A4A4A4A4A3E3E3030303030303030304A3E30303E304A30303030303E +30303E4A } diff --git a/runtime/lexer.reds b/runtime/lexer.reds index f5b6326fe1..f4dc4e1eb2 100644 --- a/runtime/lexer.reds +++ b/runtime/lexer.reds @@ -1446,15 +1446,9 @@ lexer: context [ ] ] - load-file: func [lex [state!] s e [byte-ptr!] flags [integer!] load? [logic!] - /local - p [byte-ptr!] - ][ + load-file: func [lex [state!] s e [byte-ptr!] flags [integer!] load? [logic!]][ flags: flags and not C_FLAG_CARET ;-- clears caret flag - either s/2 = #"^"" [s: s + 1][ ;-- skip " - p: s until [p: p + 1 any [p/1 = #"%" p = e]] ;-- check if any %xx - if p < e [flags: flags or C_FLAG_ESC_HEX or C_FLAG_CARET] - ] + if s/2 = #"^"" [s: s + 1] ;-- skip " lex/type: TYPE_FILE either load? [ load-string lex s e flags yes diff --git a/tests/source/units/lexer-test.red b/tests/source/units/lexer-test.red index 49ff03eab7..aec1812f41 100644 --- a/tests/source/units/lexer-test.red +++ b/tests/source/units/lexer-test.red @@ -130,29 +130,27 @@ Red [ --test-- "tr-19" out: transcode { - %examples.r - %big-image.jpg - %graphics/amiga.jpg - %/c/plug-in/video.r - %//sound/goldfinger.mp3 - %"this file.txt" - %"cool movie clip.mpg" - %this%20file.txt - %cool%20movie%20clip.mpg - %dir/file.txt - %docs/intro.txt - %docs/new/notes.txt - %"new mail/inbox.mbx" - %. - %./ - %./file.txt - %.. - %../ - %../script.r - %../../plans/schedule.r - %/C/docs/file.txt - %"/c/program files/qualcomm/eudora mail/out.mbx" - %//docs/notes + %examples.r + %big-image.jpg + %graphics/amiga.jpg + %/c/plug-in/video.r + %//sound/goldfinger.mp3 + %"this file.txt" + %"cool movie clip.mpg" + %dir/file.txt + %docs/intro.txt + %docs/new/notes.txt + %"new mail/inbox.mbx" + %. + %./ + %./file.txt + %.. + %../ + %../script.r + %../../plans/schedule.r + %/C/docs/file.txt + %"/c/program files/qualcomm/eudora mail/out.mbx" + %//docs/notes } --assert out == [ %examples.r @@ -160,14 +158,12 @@ Red [ %graphics/amiga.jpg %/c/plug-in/video.r %//sound/goldfinger.mp3 - %this%20file.txt - %cool%20movie%20clip.mpg - %this%20file.txt - %cool%20movie%20clip.mpg + %"this file.txt" + %"cool movie clip.mpg" %dir/file.txt %docs/intro.txt %docs/new/notes.txt - %new%20mail/inbox.mbx + %"new mail/inbox.mbx" %. %./ %./file.txt @@ -176,7 +172,7 @@ Red [ %../script.r %../../plans/schedule.r %/C/docs/file.txt - %/c/program%20files/qualcomm/eudora%20mail/out.mbx + %"/c/program files/qualcomm/eudora mail/out.mbx" %//docs/notes ] forall out [--assert file? out/1] @@ -433,8 +429,7 @@ Red [ --test-- "tro-23" --assert #{000041} == transcode/one {64#{AABB}} --test-- "tro-24" --assert "Hello World!" == to-string transcode/one {64#{SGVsbG8gV29ybGQh}} --test-- "tro-25" --assert %hello.red == transcode/one {%hello.red} - --test-- "tro-26" --assert %hello%20world.red == transcode/one {%"hello world.red"} - --test-- "tro-27" --assert %hello%20world.red == transcode/one {%hello%20world.red} + --test-- "tro-26" --assert {%"hello world.red"} == mold transcode/one {%"hello world.red"} --test-- "tro-28" --assert == transcode/one {} --test-- "tro-29" --assert #{00} == transcode/one "#{00} " diff --git a/tests/source/units/serialization-test.red b/tests/source/units/serialization-test.red index 93b28ffc05..9694fc42d6 100644 --- a/tests/source/units/serialization-test.red +++ b/tests/source/units/serialization-test.red @@ -127,10 +127,10 @@ ser-formed: {1 none true false c red Red a/b 'a/b :a/b a/b: 1 + 2 a a c d b e f --assert "%目录1" = mold %目录1 --test-- "mold-file2" - --assert "%^^(76EE)^^(5F55)1" = mold/all %目录1 + --assert "%^(76EE)^(5F55)1" = mold/all %目录1 --test-- "mold-file3" - --assert "%a%20b" = mold %a%20b + --assert {%"a b"} = mold %"a b" ===end-group=== diff --git a/utils/generate-lexer-table.red b/utils/generate-lexer-table.red index 0d67ba23a2..3ac22b295b 100644 --- a/utils/generate-lexer-table.red +++ b/utils/generate-lexer-table.red @@ -21,95 +21,93 @@ context [ S_SKIP_MSTR TYPE_STRING ;-- 5 S_FILE_1ST TYPE_FILE ;-- 6 S_FILE TYPE_FILE ;-- 7 - S_FILE_HEX1 TYPE_FILE ;-- 8 - S_FILE_HEX2 TYPE_FILE ;-- 9 - S_FILE_STR TYPE_FILE ;-- 10 - S_HDPER_ST TYPE_STRING ;-- 11 - S_HERDOC_ST TYPE_STRING ;-- 12 - S_HDPER_C0 TYPE_STRING ;-- 13 - S_HDPER_CL TYPE_STRING ;-- 14 - S_SLASH TYPE_REFINEMENT ;-- 15 - S_SLASH_N TYPE_WORD ;-- 16 - S_SHARP TYPE_ISSUE ;-- 17 - S_BINARY TYPE_BINARY ;-- 18 - S_LINE_CMT2 TYPE_VALUE ;-- 19 - S_CHAR TYPE_CHAR ;-- 20 - S_SKIP_CHAR TYPE_CHAR ;-- 21 - S_CONSTRUCT TYPE_VALUE ;-- 22 - S_ISSUE TYPE_ISSUE ;-- 23 - S_NUMBER TYPE_INTEGER ;-- 24 - S_DOTNUM TYPE_FLOAT ;-- 25 - S_DECIMAL TYPE_FLOAT ;-- 26 - S_DECEXP TYPE_FLOAT ;-- 27 - S_DECX TYPE_FLOAT ;-- 28 - S_DEC_SPECIAL TYPE_FLOAT ;-- 29 - S_TUPLE TYPE_TUPLE ;-- 30 - S_DATE TYPE_DATE ;-- 31 - S_TIME_1ST TYPE_TIME ;-- 32 - S_TIME TYPE_TIME ;-- 33 - S_PAIR_1ST TYPE_PAIR ;-- 34 - S_PAIR TYPE_PAIR ;-- 35 - S_MONEY_1ST TYPE_MONEY ;-- 36 - S_MONEY TYPE_MONEY ;-- 37 - S_MONEY_DEC TYPE_MONEY ;-- 38 - S_HEX TYPE_INTEGER ;-- 39 - S_HEX_END TYPE_WORD ;-- 40 - S_HEX_END2 TYPE_INTEGER ;-- 41 - S_LESSER TYPE_TAG ;-- 42 - S_TAG TYPE_TAG ;-- 43 - S_TAG_STR TYPE_TAG ;-- 44 - S_TAG_STR2 TYPE_TAG ;-- 45 - S_SIGN TYPE_WORD ;-- 46 - S_DOTWORD TYPE_WORD ;-- 47 - S_DOTDEC TYPE_FLOAT ;-- 48 - S_WORD_1ST TYPE_WORD ;-- 49 - S_WORD TYPE_WORD ;-- 50 - S_WORDSET TYPE_SET_WORD ;-- 51 - S_PERCENT TYPE_WORD ;-- 52 - S_URL TYPE_URL ;-- 53 - S_EMAIL TYPE_EMAIL ;-- 54 - S_REF TYPE_REF ;-- 55 - S_PATH TYPE_PATH ;-- 56 - S_PATH_NUM TYPE_INTEGER ;-- 57 - S_PATH_W1ST TYPE_WORD ;-- 58 - S_PATH_WORD TYPE_WORD ;-- 59 - S_PATH_SHARP TYPE_ISSUE ;-- 60 - S_PATH_SIGN TYPE_WORD ;-- 61 - --EXIT_STATES-- - ;-- 62 - T_EOF - ;-- 63 - T_ERROR TYPE_ERROR ;-- 64 - T_BLK_OP - ;-- 65 - T_BLK_CL - ;-- 66 - T_PAR_OP - ;-- 67 - T_PAR_CL - ;-- 68 - T_MSTR_OP - ;-- 69 - T_MSTR_CL TYPE_STRING ;-- 70 - T_MAP_OP - ;-- 71 - T_PATH - ;-- 72 - T_CONS_MK - ;-- 73 - T_CMT - ;-- 74 - T_STRING TYPE_STRING ;-- 75 - T_WORD TYPE_WORD ;-- 76 - T_ISSUE TYPE_ISSUE ;-- 77 - T_INTEGER TYPE_INTEGER ;-- 78 - T_REFINE TYPE_REFINEMENT ;-- 79 - T_CHAR TYPE_CHAR ;-- 80 - T_FILE TYPE_FILE ;-- 81 - T_BINARY TYPE_BINARY ;-- 82 - T_PERCENT TYPE_PERCENT ;-- 83 - T_FLOAT TYPE_FLOAT ;-- 84 - T_FLOAT_SP TYPE_FLOAT ;-- 85 - T_TUPLE TYPE_TUPLE ;-- 86 - T_DATE TYPE_DATE ;-- 87 - T_PAIR TYPE_PAIR ;-- 88 - T_TIME TYPE_TIME ;-- 89 - T_MONEY TYPE_MONEY ;-- 90 - T_TAG TYPE_TAG ;-- 91 - T_URL TYPE_URL ;-- 92 - T_EMAIL TYPE_EMAIL ;-- 93 - T_HEX TYPE_INTEGER ;-- 94 - T_RAWSTRING TYPE_STRING ;-- 95 - T_REF TYPE_REF ;-- 96 + S_FILE_STR TYPE_FILE ;-- 8 + S_HDPER_ST TYPE_STRING ;-- 9 + S_HERDOC_ST TYPE_STRING ;-- 10 + S_HDPER_C0 TYPE_STRING ;-- 11 + S_HDPER_CL TYPE_STRING ;-- 12 + S_SLASH TYPE_REFINEMENT ;-- 13 + S_SLASH_N TYPE_WORD ;-- 14 + S_SHARP TYPE_ISSUE ;-- 15 + S_BINARY TYPE_BINARY ;-- 16 + S_LINE_CMT2 TYPE_VALUE ;-- 17 + S_CHAR TYPE_CHAR ;-- 18 + S_SKIP_CHAR TYPE_CHAR ;-- 19 + S_CONSTRUCT TYPE_VALUE ;-- 20 + S_ISSUE TYPE_ISSUE ;-- 21 + S_NUMBER TYPE_INTEGER ;-- 22 + S_DOTNUM TYPE_FLOAT ;-- 23 + S_DECIMAL TYPE_FLOAT ;-- 24 + S_DECEXP TYPE_FLOAT ;-- 25 + S_DECX TYPE_FLOAT ;-- 26 + S_DEC_SPECIAL TYPE_FLOAT ;-- 27 + S_TUPLE TYPE_TUPLE ;-- 28 + S_DATE TYPE_DATE ;-- 29 + S_TIME_1ST TYPE_TIME ;-- 30 + S_TIME TYPE_TIME ;-- 31 + S_PAIR_1ST TYPE_PAIR ;-- 32 + S_PAIR TYPE_PAIR ;-- 33 + S_MONEY_1ST TYPE_MONEY ;-- 34 + S_MONEY TYPE_MONEY ;-- 35 + S_MONEY_DEC TYPE_MONEY ;-- 36 + S_HEX TYPE_INTEGER ;-- 37 + S_HEX_END TYPE_WORD ;-- 38 + S_HEX_END2 TYPE_INTEGER ;-- 39 + S_LESSER TYPE_TAG ;-- 40 + S_TAG TYPE_TAG ;-- 41 + S_TAG_STR TYPE_TAG ;-- 42 + S_TAG_STR2 TYPE_TAG ;-- 43 + S_SIGN TYPE_WORD ;-- 44 + S_DOTWORD TYPE_WORD ;-- 45 + S_DOTDEC TYPE_FLOAT ;-- 46 + S_WORD_1ST TYPE_WORD ;-- 47 + S_WORD TYPE_WORD ;-- 48 + S_WORDSET TYPE_SET_WORD ;-- 49 + S_PERCENT TYPE_WORD ;-- 50 + S_URL TYPE_URL ;-- 51 + S_EMAIL TYPE_EMAIL ;-- 52 + S_REF TYPE_REF ;-- 53 + S_PATH TYPE_PATH ;-- 54 + S_PATH_NUM TYPE_INTEGER ;-- 55 + S_PATH_W1ST TYPE_WORD ;-- 56 + S_PATH_WORD TYPE_WORD ;-- 57 + S_PATH_SHARP TYPE_ISSUE ;-- 58 + S_PATH_SIGN TYPE_WORD ;-- 59 + --EXIT_STATES-- - ;-- 60 + T_EOF - ;-- 61 + T_ERROR TYPE_ERROR ;-- 62 + T_BLK_OP - ;-- 63 + T_BLK_CL - ;-- 64 + T_PAR_OP - ;-- 65 + T_PAR_CL - ;-- 66 + T_MSTR_OP - ;-- 67 + T_MSTR_CL TYPE_STRING ;-- 68 + T_MAP_OP - ;-- 69 + T_PATH - ;-- 70 + T_CONS_MK - ;-- 71 + T_CMT - ;-- 72 + T_STRING TYPE_STRING ;-- 73 + T_WORD TYPE_WORD ;-- 74 + T_ISSUE TYPE_ISSUE ;-- 75 + T_INTEGER TYPE_INTEGER ;-- 76 + T_REFINE TYPE_REFINEMENT ;-- 77 + T_CHAR TYPE_CHAR ;-- 78 + T_FILE TYPE_FILE ;-- 79 + T_BINARY TYPE_BINARY ;-- 80 + T_PERCENT TYPE_PERCENT ;-- 81 + T_FLOAT TYPE_FLOAT ;-- 82 + T_FLOAT_SP TYPE_FLOAT ;-- 83 + T_TUPLE TYPE_TUPLE ;-- 84 + T_DATE TYPE_DATE ;-- 85 + T_PAIR TYPE_PAIR ;-- 86 + T_TIME TYPE_TIME ;-- 87 + T_MONEY TYPE_MONEY ;-- 88 + T_TAG TYPE_TAG ;-- 89 + T_URL TYPE_URL ;-- 90 + T_EMAIL TYPE_EMAIL ;-- 91 + T_HEX TYPE_INTEGER ;-- 92 + T_RAWSTRING TYPE_STRING ;-- 93 + T_REF TYPE_REF ;-- 94 ] CSV-table: %../docs/lexer/lexer-FSM.csv