diff --git a/src/compiler/tests/compiler.test.ts b/src/compiler/tests/compiler.test.ts index 40b2271..46ee0b7 100644 --- a/src/compiler/tests/compiler.test.ts +++ b/src/compiler/tests/compiler.test.ts @@ -85,6 +85,21 @@ describe('compiler', () => { expect(`bloop = do: 'bloop' end; bloop`).toEvaluateTo('bloop') }) + test('function call with if statement and multiple expressions', () => { + expect(` + abc = do: + if false: + echo nope + end + + true + end + + abc + `) + .toEvaluateTo(true) + }) + test('simple conditionals', () => { expect(`(3 < 6)`).toEvaluateTo(true) expect(`(10 > 20)`).toEvaluateTo(false) diff --git a/src/parser/shrimp.grammar b/src/parser/shrimp.grammar index d1ceb9b..35fdcbc 100644 --- a/src/parser/shrimp.grammar +++ b/src/parser/shrimp.grammar @@ -204,5 +204,5 @@ expressionWithoutIdentifier { } block { - (consumeToTerminator newlineOrSemicolon)* + (consumeToTerminator? newlineOrSemicolon)* } \ No newline at end of file diff --git a/src/parser/shrimp.ts b/src/parser/shrimp.ts index 10dc75f..ba5f038 100644 --- a/src/parser/shrimp.ts +++ b/src/parser/shrimp.ts @@ -7,9 +7,9 @@ import {highlighting} from "./highlight" const spec_Identifier = {__proto__:null,do:52, end:58, null:74, if:88, elseif:96, else:100} export const parser = LRParser.deserialize({ version: 14, - states: ".pQYQbOOO#[QcO'#CrO$UQRO'#CsO$dQcO'#DnO${QbO'#DtOOQ`'#Cu'#CuO%TQbO'#CqO%uOSO'#CzOOQa'#Dr'#DrO&TOpO'#DSO&YQcO'#DqOOQ`'#Do'#DoO&qQbO'#DnO'PQbO'#EROOQ`'#DX'#DXO'nQRO'#DaOOQ`'#Dn'#DnO'sQQO'#DmOOQ`'#Dm'#DmOOQ`'#Db'#DbQYQbOOOOQa'#Dq'#DqOOQ`'#Cp'#CpO'{QbO'#DUOOQ`'#Dp'#DpOOQ`'#Dc'#DcO(VQbO,59ZO'PQbO,59_O'PQbO,59_OOQ`'#Dd'#DdO(sQbO'#CwO({QQO,5:`O)lQRO'#CsO)|QRO,59]O*_QRO,59]O*YQQO,59]O+YQQO,59]O+bQbO'#C|O+jQWO'#C}OOOO'#Dz'#DzOOOO'#Df'#DfO,OOSO,59fOOQa,59f,59fO,^O`O,59nO,cQbO'#DgO,hQbO,59YO,yQRO,5:mO-QQQO,5:mO-VQbO,59{OOQ`,5:X,5:XOOQ`-E7`-E7`OOQ`,59p,59pOOQ`-E7a-E7aOOQa1G.y1G.yO-aQcO1G.yOOQ`-E7b-E7bO-{QbO1G/zO'PQbO,59`O'PQbO,59`OOQa1G.w1G.wOOOO,59h,59hOOOO,59i,59iOOOO-E7d-E7dOOQa1G/Q1G/QOOQa1G/Y1G/YO!TQbO'#CrOOQ`,5:R,5:ROOQ`-E7e-E7eO.YQbO1G0XOOQ`1G/g1G/gO.gQbO7+%fO.lQbO7+%gOOQO1G.z1G.zO.yQRO1G.zOOQ`'#DZ'#DZO/TQbO7+%sO/YQbO7+%tOOQ`<mAN>mO'PQbO'#D]OOQ`'#Dh'#DhO0gQbOAN>zO0rQQO'#D_OOQ`AN>zAN>zO0wQbOAN>zO0|QRO,59wO1TQQO,59wOOQ`-E7f-E7fOOQ`G24fG24fO1YQbOG24fO1_QQO,59yO1dQQO1G/cOOQ`LD*QLD*QO.lQbO1G/eO/YQbO7+$}OOQ`7+%P7+%POOQ`<mAN>mO'PQbO'#D]OOQ`'#Dh'#DhO0pQbOAN>zO0{QQO'#D_OOQ`AN>zAN>zO1QQbOAN>zO1VQRO,59wO1^QQO,59wOOQ`-E7f-E7fOOQ`G24fG24fO1cQbOG24fO1hQQO,59yO1mQQO1G/cOOQ`LD*QLD*QO.lQbO1G/eO/]QbO7+$}OOQ`7+%P7+%POOQ`< spec_Identifier[value] || -1}], - tokenPrec: 761 + tokenPrec: 770 }) diff --git a/src/parser/tests/multiline.test.ts b/src/parser/tests/multiline.test.ts index 27bddc7..7ac995a 100644 --- a/src/parser/tests/multiline.test.ts +++ b/src/parser/tests/multiline.test.ts @@ -71,4 +71,20 @@ end keyword end `) }) + + test('multiline with empty lines', () => { + expect(` + do: + 2 + + end + `).toMatchTree(` + FunctionDef + keyword do + Params + colon : + Number 2 + keyword end + `) + }) })