summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author6cdh <cd6cdh@gmail.com>2023-08-02 13:34:17 +0800
committer6cdh <cd6cdh@gmail.com>2023-08-02 13:34:17 +0800
commitdbfe8096bc1b54fb4f2abe26f27b89e73be5a013 (patch)
treed41c21489474d65bb4d87373b6fddbbaca76ba1d
parentd181a9738177a3b21b9f0e7bbb33b1a562f73ba6 (diff)
feat: optimize symbol/number parse and reduce library size
-rw-r--r--grammar.js38
-rw-r--r--src/grammar.json12446
-rw-r--r--src/node-types.json18
-rw-r--r--src/parser.c13634
4 files changed, 12829 insertions, 13307 deletions
diff --git a/grammar.js b/grammar.js
index 21839a109..e46a9d37a 100644
--- a/grammar.js
+++ b/grammar.js
@@ -1,10 +1,6 @@
const PREC = {
first: $ => prec(100, $),
last: $ => prec(-1, $),
- number: $ => prec(2, $),
- symbol: $ => prec(1, $),
- left: prec.left,
- right: prec.right,
};
const LEAF = {
@@ -164,17 +160,16 @@ module.exports = grammar({
// string }}}
number: _ =>
- PREC.number(
- token(
- choice(
- extflonum(2),
- extflonum(8),
- extflonum(10),
- extflonum(16),
- number_base(2),
- number_base(8),
- number_base(10),
- number_base(16)))),
+ token(
+ choice(
+ extflonum(2),
+ extflonum(8),
+ extflonum(10),
+ extflonum(16),
+ number_base(2),
+ number_base(8),
+ number_base(10),
+ number_base(16))),
decimal: _ => /[0-9]+/,
@@ -191,13 +186,12 @@ module.exports = grammar({
/./))),
symbol: _ =>
- PREC.symbol(
- token(
- choice(
- /#[cC][iIsS]/, // read-case-sensitive parameter
- seq(
- LEAF.symbol_start,
- repeat(LEAF.symbol_remain))))),
+ token(
+ choice(
+ /#[cC][iIsS]/, // read-case-sensitive parameter
+ seq(
+ LEAF.symbol_start,
+ repeat(LEAF.symbol_remain)))),
keyword: _ =>
token(
diff --git a/src/grammar.json b/src/grammar.json
index fa6443736..741fd1804 100644
--- a/src/grammar.json
+++ b/src/grammar.json
@@ -525,6555 +525,6551 @@
}
},
"number": {
- "type": "PREC",
- "value": 2,
+ "type": "TOKEN",
"content": {
- "type": "TOKEN",
- "content": {
- "type": "CHOICE",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "PATTERN",
- "value": "#[bB]"
- },
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "PATTERN",
- "value": "[+-]"
- },
- {
- "type": "BLANK"
- }
- ]
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[01]"
- }
- },
- {
- "type": "REPEAT",
- "content": {
- "type": "STRING",
- "value": "#"
- }
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "PATTERN",
+ "value": "#[bB]"
+ },
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "PATTERN",
+ "value": "[+-]"
+ },
+ {
+ "type": "BLANK"
+ }
+ ]
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[01]"
}
- ]
- },
- {
- "type": "CHOICE",
- "members": [
- {
+ },
+ {
+ "type": "REPEAT",
+ "content": {
"type": "STRING",
- "value": "."
- },
- {
- "type": "BLANK"
+ "value": "#"
}
- ]
- },
- {
- "type": "REPEAT",
- "content": {
+ }
+ ]
+ },
+ {
+ "type": "CHOICE",
+ "members": [
+ {
"type": "STRING",
- "value": "#"
+ "value": "."
+ },
+ {
+ "type": "BLANK"
}
+ ]
+ },
+ {
+ "type": "REPEAT",
+ "content": {
+ "type": "STRING",
+ "value": "#"
}
- ]
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[01]"
- }
- },
- {
- "type": "BLANK"
+ }
+ ]
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[01]"
}
- ]
- },
- {
- "type": "STRING",
- "value": "."
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[01]"
- }
- },
- {
- "type": "REPEAT",
- "content": {
- "type": "STRING",
- "value": "#"
- }
+ },
+ {
+ "type": "BLANK"
+ }
+ ]
+ },
+ {
+ "type": "STRING",
+ "value": "."
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[01]"
}
- ]
- }
- ]
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[01]"
- }
- },
- {
- "type": "REPEAT",
- "content": {
- "type": "STRING",
- "value": "#"
- }
+ },
+ {
+ "type": "REPEAT",
+ "content": {
+ "type": "STRING",
+ "value": "#"
}
- ]
- },
- {
- "type": "STRING",
- "value": "/"
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[01]"
- }
- },
- {
- "type": "REPEAT",
- "content": {
- "type": "STRING",
- "value": "#"
- }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[01]"
}
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "PATTERN",
- "value": "[tT]"
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "PATTERN",
- "value": "[+-]"
- },
- {
- "type": "BLANK"
- }
- ]
- },
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[01]"
- }
+ },
+ {
+ "type": "REPEAT",
+ "content": {
+ "type": "STRING",
+ "value": "#"
}
- ]
- }
- ]
- },
- {
- "type": "BLANK"
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "PATTERN",
- "value": "[+-]"
- },
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "PATTERN",
- "value": "[iI][nN][fF]\\.[0fFtT]"
- },
- {
- "type": "PATTERN",
- "value": "[nN][aA][nN]\\.[0fFtT]"
- }
- ]
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "PATTERN",
- "value": "#[oO]"
- },
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "PATTERN",
- "value": "[+-]"
- },
- {
- "type": "BLANK"
- }
- ]
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
+ }
+ ]
+ },
+ {
+ "type": "STRING",
+ "value": "/"
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[01]"
+ }
+ },
+ {
+ "type": "REPEAT",
+ "content": {
+ "type": "STRING",
+ "value": "#"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "PATTERN",
+ "value": "[tT]"
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "CHOICE",
+ "members": [
+ {
"type": "PATTERN",
- "value": "[0-7]"
- }
- },
- {
- "type": "REPEAT",
- "content": {
- "type": "STRING",
- "value": "#"
+ "value": "[+-]"
+ },
+ {
+ "type": "BLANK"
}
+ ]
+ },
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[01]"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "BLANK"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "PATTERN",
+ "value": "[+-]"
+ },
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "PATTERN",
+ "value": "[iI][nN][fF]\\.[0fFtT]"
+ },
+ {
+ "type": "PATTERN",
+ "value": "[nN][aA][nN]\\.[0fFtT]"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "PATTERN",
+ "value": "#[oO]"
+ },
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "PATTERN",
+ "value": "[+-]"
+ },
+ {
+ "type": "BLANK"
+ }
+ ]
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[0-7]"
}
- ]
- },
- {
- "type": "CHOICE",
- "members": [
- {
+ },
+ {
+ "type": "REPEAT",
+ "content": {
"type": "STRING",
- "value": "."
- },
- {
- "type": "BLANK"
+ "value": "#"
}
- ]
- },
- {
- "type": "REPEAT",
- "content": {
+ }
+ ]
+ },
+ {
+ "type": "CHOICE",
+ "members": [
+ {
"type": "STRING",
- "value": "#"
+ "value": "."
+ },
+ {
+ "type": "BLANK"
}
+ ]
+ },
+ {
+ "type": "REPEAT",
+ "content": {
+ "type": "STRING",
+ "value": "#"
}
- ]
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[0-7]"
- }
- },
- {
- "type": "BLANK"
+ }
+ ]
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "CHOICE",
+ "members": [
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[0-7]"
}
- ]
- },
- {
- "type": "STRING",
- "value": "."
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[0-7]"
- }
- },
- {
- "type": "REPEAT",
- "content": {
- "type": "STRING",
- "value": "#"
- }
+ },
+ {
+ "type": "BLANK"
+ }
+ ]
+ },
+ {
+ "type": "STRING",
+ "value": "."
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[0-7]"
}
- ]
- }
- ]
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[0-7]"
- }
- },
- {
- "type": "REPEAT",
- "content": {
- "type": "STRING",
- "value": "#"
- }
+ },
+ {
+ "type": "REPEAT",
+ "content": {
+ "type": "STRING",
+ "value": "#"
}
- ]
- },
- {
- "type": "STRING",
- "value": "/"
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[0-7]"
- }
- },
- {
- "type": "REPEAT",
- "content": {
- "type": "STRING",
- "value": "#"
- }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "SEQ",
+ "members": [
+ {
+ "type": "REPEAT1",
+ "content": {
+ "type": "PATTERN",
+ "value": "[0-7]"
}
- ]
- }
- ]
- }
- ]
- },
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "SEQ",
- "members": [
- {
- "type": "PATTERN",
- "value": "[tT]"
- },
- {
- "type": "SEQ",
- "members": [
- {
- "type": "CHOICE",
- "members": [
- {
- "type": "PATTERN",
- "value": "[+-]"
- },
- {
- "type": "BLANK"
- }
- ]
- },
- {
- "type": "REPEAT1",
- "content": {
- "type": "PATTERN",
- "value": "[0-7]"
- }
+ },
+ {
+ "type": "REPEAT",
+ "content": {
+ "type": "STRING",
+ "value": "#"