From 5e9a34e64254000b9922d69697774c430cdeca36 Mon Sep 17 00:00:00 2001 From: Lizzy Hunt Date: Tue, 5 Mar 2024 14:49:46 -0700 Subject: [PATCH] fix parsing of RecordExpressions --- bun.lockb | Bin 16198 -> 25314 bytes package.json | 6 +++++- src/parser/grammar.pegjs | 6 +++--- src/parser/index.ts | 5 +++-- src/parser/parser.ts | 15 ++++++--------- test/interpreter.spec.ts | 7 +++++++ test/programs/index.ts | 3 +++ test/programs/record.cps | 7 +++++++ 8 files changed, 34 insertions(+), 15 deletions(-) create mode 100644 test/programs/record.cps diff --git a/bun.lockb b/bun.lockb index a815dc1d005e1ec773f0d72dc7d5ec073354a022..e3bcb1c78ad3e53029c9101e264879988adc83b6 100755 GIT binary patch delta 6820 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 HR~-E}GGKl{ diff --git a/package.json b/package.json index 163631d..11d6c63 100644 --- a/package.json +++ b/package.json @@ -10,9 +10,13 @@ }, "dependencies": { "minimist": "^1.2.8", + "nodemon": "^3.1.0", "peggy": "^4.0.0", "prettier": "^3.2.5", "prettier-plugin-pegjs": "^2.0.2", "ts-pegjs": "^4.2.1" + }, + "scripts": { + "watch-test": "nodemon -e ts,cps --exec 'bun test'" } -} \ No newline at end of file +} diff --git a/src/parser/grammar.pegjs b/src/parser/grammar.pegjs index 180b87f..0017b18 100644 --- a/src/parser/grammar.pegjs +++ b/src/parser/grammar.pegjs @@ -172,13 +172,13 @@ PrimitiveOperationExpression RecordExpressionTuple = LPAREN _? - variable:VarStatement + value:Value _? COMMA _? offset:OffsetStatement _? - RPAREN { return { variable, offset }; } + RPAREN { return { value, offset }; } RecordExpressionTupleList = LBRACKET @@ -202,7 +202,7 @@ RecordExpression _? COMMA _? - address:Literal + address:Identifier _? COMMA _? diff --git a/src/parser/index.ts b/src/parser/index.ts index 366042c..912e6f2 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -2,5 +2,6 @@ export * from './generate'; export * from './parser'; import * as peggy from './parser'; -export const peggyParse = (source: string): peggy.ContinuationExpression[] => - peggy.parse(source); +export const peggyParse = (source: string): peggy.ContinuationExpression[] => { + return peggy.parse(source); +}; diff --git a/src/parser/parser.ts b/src/parser/parser.ts index 934f3ff..b73df78 100644 --- a/src/parser/parser.ts +++ b/src/parser/parser.ts @@ -473,8 +473,8 @@ function peg$parse(input, options) { }; };// @ts-ignore - var peg$f11 = function(variable, offset) {// @ts-ignore - return { variable, offset }; };// @ts-ignore + var peg$f11 = function(value, offset) {// @ts-ignore + return { value, offset }; };// @ts-ignore var peg$f12 = function(records, lastRecord) { // @ts-ignore @@ -2588,7 +2588,7 @@ peg$parseRecordExpressionTuple() { s2 = null; } // @ts-ignore - s3 = peg$parseVarStatement(); + s3 = peg$parseValue(); // @ts-ignore if (s3 !== peg$FAILED) { // @ts-ignore @@ -2879,7 +2879,7 @@ peg$parseRecordExpression() { s8 = null; } // @ts-ignore - s9 = peg$parseLiteral(); + s9 = peg$parseIdentifier(); // @ts-ignore if (s9 !== peg$FAILED) { // @ts-ignore @@ -5372,15 +5372,12 @@ export type PrimitiveOperationExpression = { continuations: ContinuationList; }; }; -export type RecordExpressionTuple = { - variable: VarStatement; - offset: OffsetStatement; -}; +export type RecordExpressionTuple = { value: Value; offset: OffsetStatement }; export type RecordExpressionTupleList = any[]; export type RecordExpression = { record: { records: RecordExpressionTupleList; - address: Literal; + address: Identifier; body: ContinuationExpression; }; }; diff --git a/test/interpreter.spec.ts b/test/interpreter.spec.ts index 6d3189a..acca7bb 100644 --- a/test/interpreter.spec.ts +++ b/test/interpreter.spec.ts @@ -45,3 +45,10 @@ test('Application of identity function', async () => { const result = await evaluate(ast, testingLogger); expect(result).toEqual({ type: 'int', value: 3 }); }); + +test('Record construction', async () => { + const ast = peggyParse(await TestPrograms.RecordConstruction); + + const result = await evaluate(ast, testingLogger); + expect(result).toEqual({ type: 'int', value: 3 }); +}); diff --git a/test/programs/index.ts b/test/programs/index.ts index fae3b59..71ae303 100644 --- a/test/programs/index.ts +++ b/test/programs/index.ts @@ -19,4 +19,7 @@ export namespace TestPrograms { export const Application = Bun.file( join(import.meta.dir, 'application.cps'), ).text(); + export const RecordConstruction = Bun.file( + join(import.meta.dir, 'record.cps'), + ).text(); } diff --git a/test/programs/record.cps b/test/programs/record.cps new file mode 100644 index 0000000..fe82668 --- /dev/null +++ b/test/programs/record.cps @@ -0,0 +1,7 @@ +RECORD([(INT 1, OFFp 0), (INT 2, OFFp 0)], record, + SELECT(0, VAR one, record, + SELECT(1, VAR two, record, + PRIMOP(+, [VAR one, VAR two], [result], []) + ) + ) +) \ No newline at end of file