]> git.kianting.info Git - anotherTypesetter/commitdiff
fix something
authorTan Kian-ting <chenjt30@gmail.com>
Wed, 14 Feb 2024 15:19:03 +0000 (23:19 +0800)
committerTan Kian-ting <chenjt30@gmail.com>
Wed, 14 Feb 2024 15:19:03 +0000 (23:19 +0800)
docs/defineASTandGrammar.md
src/ch1/src/index.js
src/ch1/src/index.js.map
src/ch1/src/index.ts

index 71ac11f0ebf04fd813ec1c10714dd28d8cbc6288..7fae95a4be0d616a60a7daf875867df8dd5dbd95 100644 (file)
@@ -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
 ```
index e60c19c25afd121c7957b8eb79d8754dd1126c0f..ad08ea821aff856d38f124b2632f550f5276cd1f 100644 (file)
@@ -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<TokenKind, ASTNode>();
-const ARG = p.rule<TokenKind, ASTNode>();
+const VAR = p.rule();
+const TYPE = p.rule();
+const ARG = p.rule();
+/*
 const EXPR = p.rule<TokenKind, AST>();
 const LETTING = p.rule<TokenKind, AST>();
 const LAMBDA = p.rule<TokenKind, AST>();
 const APPLYING = p.rule<TokenKind, AST>(); */
+/** 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();
index 93a77c1a7c550bceb92634e602ed0ad7972a4e99..bb956ca184f21cd784aba1380573646fd59ad687 100644 (file)
@@ -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
index c46f8200fb91daa2aab188634090f24e1408ab76..d6e05da9d639636886bf22469120efc9702b5bcf 100644 (file)
@@ -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<TokenKind>,
+                            p.Token<TokenKind> | undefined,
+                            ASTNode,
+                            p.Token<TokenKind> | undefined,
+                            ASTNode,
+                            p.Token<TokenKind> | undefined,
+                            p.Token<TokenKind>]): AST[]{
 
+    let type = value[2];
+    let variable = value[4];
 
+    return [type, variable];
+}
+
+function applyID(value: p.Token<TokenKind.Id>): ASTNode {
+    // extend value to ASTNode
+    const newNode : ASTNode  = {
+        actualValue : value.text ,
+        ...value};
+    return newNode;
+}
 
 function applyInteger(value: p.Token<TokenKind.Int>): ASTNode {
     // extend value to ASTNode
@@ -99,13 +119,40 @@ function applyString(value: p.Token<TokenKind.Str>): ASTNode {
 
 /** define all the parser sentence */
 const CONST = p.rule<TokenKind, ASTNode>();
-/*const VAR = p.rule<TokenKind, ASTNode>();
-const ARG = p.rule<TokenKind, ASTNode>();
+const VAR = p.rule<TokenKind, ASTNode>();
+const TYPE = p.rule<TokenKind, ASTNode>();
+const ARG = p.rule<TokenKind, AST[]>();
+
+/*
 const EXPR = p.rule<TokenKind, AST>();
 const LETTING = p.rule<TokenKind, AST>();
 const LAMBDA = p.rule<TokenKind, AST>();
 const APPLYING = p.rule<TokenKind, AST>(); */
 
+/** 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(<BigInt>mainParse("123").actualValue, 123n);
     assert.strictEqual(<BigInt>mainParse("3.14").actualValue, 3.14);
-    assert.strictEqual(<BigInt>mainParse("\"foo\"").actualValue, "foo");
+    assert.strictEqual(<BigInt>mainParse("\"foo\"").actualValue, "foo"); 
+    //assert.strictEqual(astToSExp(mainParse("( int  a    )")), "(int a)");
 
 
 };