From 9d32899ca9fa7f8bca4a7b055d83a489c7693bde Mon Sep 17 00:00:00 2001 From: Tan Kian-ting Date: Wed, 14 Feb 2024 23:19:03 +0800 Subject: [PATCH] fix something --- docs/defineASTandGrammar.md | 8 ++-- src/ch1/src/index.js | 43 +++++++++++++++------ src/ch1/src/index.js.map | 2 +- src/ch1/src/index.ts | 74 +++++++++++++++++++++++++++++++------ 4 files changed, 99 insertions(+), 28 deletions(-) diff --git a/docs/defineASTandGrammar.md b/docs/defineASTandGrammar.md index 71ac11f..7fae95a 100644 --- a/docs/defineASTandGrammar.md +++ b/docs/defineASTandGrammar.md @@ -92,10 +92,10 @@ EXPR ::= APPLY | FN | LIST | CONST | VAR | "(" EXPR ")" APPLY ::= OP EXPR+ | EXPR EXPR+ FN ::= "fn" ARGS R_ARR BODY ARGS ::= ARG | ARG ARGS -ARG ::= "(" TYPE VAR ")" -CONST ::= FLO | STR | INT -VAR ::= ID -TYPE ::= ID +* ARG ::= "(" TYPE VAR ")" +* CONST ::= FLO | STR | INT +* VAR ::= ID +* TYPE ::= ID LIST ::= [LIST_INNER] LIST_INNER ::= EXPR | EXPR SEMICOLON LIST_INNER ``` diff --git a/src/ch1/src/index.js b/src/ch1/src/index.js index e60c19c..ad08ea8 100644 --- a/src/ch1/src/index.js +++ b/src/ch1/src/index.js @@ -41,25 +41,34 @@ const tokenizer = p.buildLexer([ [true, /^\d+[.]\d+/g, TokenKind.Flo], [true, /^\d+/g, TokenKind.Int], [true, /^[@]/g, TokenKind.At], - [true, /^[_\w][_\d\w]*/g, TokenKind.Id], + [true, /^[_a-zA-Z][_0-9a-zA-Z]*/g, TokenKind.Id], [true, /^->/g, TokenKind.RArr], [true, /^[;]/g, TokenKind.SColon], - [true, /^[(]/g, TokenKind.LPar], - [true, /^[)]/g, TokenKind.RPar], + [true, /^\(/g, TokenKind.LPar], + [true, /^\)/g, TokenKind.RPar], [true, /^[=]/g, TokenKind.Assign], [true, /^([\+\-\*\/]|[!<>=]=)/g, TokenKind.Op], [true, /^#[^#]*#/g, TokenKind.Com], [true, /^[\\]/g, TokenKind.BSlash], [true, /^\"([^"]|[\\\"])*\"/g, TokenKind.Str], - [true, /^([^\\]+?)/g, TokenKind.LitStr], [true, /^\s+/g, TokenKind.Space], + [true, /^([^\\]+?)/g, TokenKind.LitStr], ]); /** ignore spaces ,new lines, and comments */ -//const _ = p.opt(p.alt( -// p.tok(TokenKind.Space), -// p.tok(TokenKind.Com), -// ) -//); +const _ = p.opt(p.alt(p.tok(TokenKind.Space), p.tok(TokenKind.Com))); +function applyArg(value) { + let type = value[2]; + let variable = value[4]; + return [type, variable]; +} +function applyID(value) { + // extend value to ASTNode + const newNode = { + actualValue: value.text, + ...value + }; + return newNode; +} function applyInteger(value) { // extend value to ASTNode const newNode = { @@ -85,21 +94,33 @@ function applyString(value) { } /** define all the parser sentence */ const CONST = p.rule(); -/*const VAR = p.rule(); -const ARG = p.rule(); +const VAR = p.rule(); +const TYPE = p.rule(); +const ARG = p.rule(); +/* const EXPR = p.rule(); const LETTING = p.rule(); const LAMBDA = p.rule(); const APPLYING = p.rule(); */ +/** ARG ::= "(" TYPE VAR ")" */ +ARG.setPattern(p.apply(p.seq(p.tok(TokenKind.LPar), _, TYPE, _, VAR, _, p.tok(TokenKind.RPar)), applyArg)); +/** VAR ::= ID */ +VAR.setPattern(p.apply(p.tok(TokenKind.Id), applyID)); +/** TYPE ::= ID */ +TYPE.setPattern(p.apply(p.tok(TokenKind.Id), applyID)); +/** * CONST ::= FLO | STR | INT */ CONST.setPattern(p.alt(p.apply(p.tok(TokenKind.Flo), applyFloat), p.apply(p.tok(TokenKind.Int), applyInteger), p.apply(p.tok(TokenKind.Str), applyString))); +// parse the strings function mainParse(inputStr) { return p.expectSingleResult(p.expectEOF(CONST.parse(tokenizer.parse(inputStr)))); + // ARG.parse(tokenizer.parse(inputStr)))); } // test function main() { assert.strictEqual(mainParse("123").actualValue, 123n); assert.strictEqual(mainParse("3.14").actualValue, 3.14); assert.strictEqual(mainParse("\"foo\"").actualValue, "foo"); + //assert.strictEqual(astToSExp(mainParse("( int a )")), "(int a)"); } ; main(); diff --git a/src/ch1/src/index.js.map b/src/ch1/src/index.js.map index 93a77c1..bb956ca 100644 --- a/src/ch1/src/index.js.map +++ b/src/ch1/src/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/ch1/src/index.ts b/src/ch1/src/index.ts index c46f820..d6e05da 100644 --- a/src/ch1/src/index.ts +++ b/src/ch1/src/index.ts @@ -49,30 +49,50 @@ const tokenizer = p.buildLexer([ [true,/^\d+[.]\d+/g , TokenKind.Flo], [true, /^\d+/g, TokenKind.Int], [true,/^[@]/g, TokenKind.At ], - [true,/^[_\w][_\d\w]*/g, TokenKind.Id ], + [true,/^[_a-zA-Z][_0-9a-zA-Z]*/g, TokenKind.Id ], [true,/^->/g , TokenKind.RArr ], [true, /^[;]/g, TokenKind.SColon ], - [true, /^[(]/g, TokenKind.LPar ], - [true, /^[)]/g, TokenKind.RPar ], + [true, /^\(/g, TokenKind.LPar ], + [true, /^\)/g, TokenKind.RPar ], [true, /^[=]/g, TokenKind.Assign ], [true, /^([\+\-\*\/]|[!<>=]=)/g, TokenKind.Op ], [true, /^#[^#]*#/g, TokenKind.Com ], [true, /^[\\]/g, TokenKind.BSlash ], [true,/^\"([^"]|[\\\"])*\"/g , TokenKind.Str ], - [true, /^([^\\]+?)/g, TokenKind.LitStr ], [true, /^\s+/g, TokenKind.Space], + [true, /^([^\\]+?)/g, TokenKind.LitStr ], ]); /** ignore spaces ,new lines, and comments */ -//const _ = p.opt(p.alt( -// p.tok(TokenKind.Space), -// p.tok(TokenKind.Com), -// ) -//); +const _ = p.opt(p.alt( + p.tok(TokenKind.Space), + p.tok(TokenKind.Com), + ) +); + +function applyArg(value: [p.Token, + p.Token | undefined, + ASTNode, + p.Token | undefined, + ASTNode, + p.Token | undefined, + p.Token]): AST[]{ + let type = value[2]; + let variable = value[4]; + return [type, variable]; +} + +function applyID(value: p.Token): ASTNode { + // extend value to ASTNode + const newNode : ASTNode = { + actualValue : value.text , + ...value}; + return newNode; +} function applyInteger(value: p.Token): ASTNode { // extend value to ASTNode @@ -99,13 +119,40 @@ function applyString(value: p.Token): ASTNode { /** define all the parser sentence */ const CONST = p.rule(); -/*const VAR = p.rule(); -const ARG = p.rule(); +const VAR = p.rule(); +const TYPE = p.rule(); +const ARG = p.rule(); + +/* const EXPR = p.rule(); const LETTING = p.rule(); const LAMBDA = p.rule(); const APPLYING = p.rule(); */ +/** ARG ::= "(" TYPE VAR ")" */ +ARG.setPattern( + p.apply(p.seq( + p.tok(TokenKind.LPar), + _, + TYPE, + _, + VAR, + _, + p.tok(TokenKind.RPar), + ),applyArg) +); + + +/** VAR ::= ID */ +VAR.setPattern( + p.apply(p.tok(TokenKind.Id), applyID), +); +/** TYPE ::= ID */ +TYPE.setPattern( + p.apply(p.tok(TokenKind.Id), applyID), +); + +/** * CONST ::= FLO | STR | INT */ CONST.setPattern( p.alt( p.apply(p.tok(TokenKind.Flo), applyFloat), @@ -116,9 +163,11 @@ CONST.setPattern( ); +// parse the strings function mainParse(inputStr : string){ return p.expectSingleResult(p.expectEOF( CONST.parse(tokenizer.parse(inputStr)))); + // ARG.parse(tokenizer.parse(inputStr)))); } @@ -126,7 +175,8 @@ return p.expectSingleResult(p.expectEOF( function main(){ assert.strictEqual(mainParse("123").actualValue, 123n); assert.strictEqual(mainParse("3.14").actualValue, 3.14); - assert.strictEqual(mainParse("\"foo\"").actualValue, "foo"); + assert.strictEqual(mainParse("\"foo\"").actualValue, "foo"); + //assert.strictEqual(astToSExp(mainParse("( int a )")), "(int a)"); }; -- 2.39.2