@bablr/language-en-spamex 0.4.3 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,6 +4,7 @@ import * as productions from '@bablr/helpers/productions';
4
4
  import * as Regex from '@bablr/language-en-regex-vm-pattern';
5
5
  import * as CSTML from '@bablr/language-en-cstml';
6
6
  import * as Space from '@bablr/language-en-blank-space';
7
+ import { notNull } from '@bablr/agast-helpers/tree';
7
8
 
8
9
  export const canonicalURL = 'https://bablr.org/languages/core/en/spamex';
9
10
 
@@ -12,79 +13,118 @@ export const dependencies = { Regex, CSTML, Space };
12
13
  const { eatMatchTrivia } = CSTML;
13
14
 
14
15
  export const grammar = class SpamexGrammar {
16
+ @Node
17
+ *Pattern() {
18
+ yield i`eat(<Matcher /> 'matcher')`;
19
+ }
20
+
15
21
  @CoveredBy('Expression')
16
22
  *Matcher() {
17
- yield i`eat(<Any> null [
18
- <NodeMatcher '<'>
19
- <CSTML:String /['"]/>
20
- <Regex:Pattern '/'>
23
+ yield i`eat(<Any /> null [
24
+ <NodeMatcher '<' />
25
+ <CSTML:String /['"]/ />
26
+ <Regex:Pattern '/' />
21
27
  ])`;
22
28
  }
23
29
 
24
- @CoveredBy('Matcher')
25
- @CoveredBy('Expression')
26
30
  @Node
31
+ @CoveredBy('Matcher')
27
32
  *NodeMatcher() {
28
- yield i`eat(<~*Punctuator '<' balancedSpan='Tag' balanced='>'> 'open')`;
29
- yield i`eat(<CSTML:Flags>)`;
30
- if (yield i`match(/[a-zA-Z]+:/)`) {
31
- yield i`eat(<*CSTML:Identifier> 'language')`;
32
- yield i`eat(<~*Punctuator ':'> 'namespaceOperator')`;
33
- yield i`eat(<*CSTML:Identifier> 'type')`;
33
+ let open = yield i`eat(<OpenNodeMatcher /> 'open')`;
34
+
35
+ // Problem: not handling gaps
36
+ // gaps have a non-nullish representation
37
+ //
38
+ const { selfClosingTagToken } = open.properties;
39
+ const selfClosing = notNull(selfClosingTagToken);
40
+
41
+ if (selfClosing) {
42
+ yield i`eat([] 'children[]')`;
43
+ yield i`eat(null 'close')`;
34
44
  } else {
45
+ // TODO
46
+ yield* eatMatchTrivia();
47
+
48
+ yield i`eat(<CloseNodeMatcher /> 'close')`;
49
+ }
50
+ }
51
+
52
+ @Node
53
+ *OpenNodeMatcher() {
54
+ yield i`eat(<~*Punctuator '<' balancedSpan='Tag' balanced='>' /> 'open')`;
55
+ yield i`eat(<CSTML:Flags /> 'flags')`;
56
+ if (yield i`match(/[a-zA-Z]+:/)`) {
57
+ yield i`eat(<*CSTML:Identifier /> 'language')`;
58
+ yield i`eat(<~*Punctuator ':' /> 'namespaceOperator')`;
59
+ yield i`eat(<*CSTML:Identifier /> 'type')`;
60
+ } else if (yield i`match(/[a-zA-Z]/)`) {
35
61
  yield i`eat(null 'language')`;
36
62
  yield i`eat(null 'namespaceOperator')`;
37
- yield i`eatMatch(<*CSTML:Identifier> 'type')`;
63
+ yield i`eatMatch(<*CSTML:Identifier /> 'type')`;
64
+ } else if (yield i`match('?')`) {
65
+ yield i`eat(<~*Punctuator '?' /> 'type')`;
66
+ } else if (yield i`match(/[ \t]/)`) {
67
+ yield i`eatMatch(<~*Punctuator /[ \t]+/ /> 'type')`;
38
68
  }
39
69
  let sp = yield* eatMatchTrivia();
40
70
 
41
- if (sp && (yield i`eatMatch(<StringMatcher> 'intrinsicValue')`)) {
71
+ if (sp && (yield i`eatMatch(<StringMatcher /> 'intrinsicValue')`)) {
42
72
  sp = yield* eatMatchTrivia();
43
73
  }
44
74
 
45
75
  while (sp && (yield i`match(/!?[a-zA-Z]/)`)) {
46
- yield i`eat(<Attribute> 'attributes[]')`;
76
+ yield i`eat(<Attribute /> 'attributes[]')`;
47
77
  sp = yield* eatMatchTrivia();
48
78
  }
49
- yield i`eat(<~*Punctuator '>' balancer> 'close')`;
79
+
80
+ yield i`eatMatch(<~*Punctuator '/' /> 'selfClosingTagToken')`;
81
+ yield i`eat(<~*Punctuator '>' balancer /> 'close')`;
82
+ }
83
+
84
+ @Node
85
+ @CoveredBy('Matcher')
86
+ *CloseNodeMatcher() {
87
+ yield i`eat(<~*Punctuator '</' balanced='>' /> 'openToken')`;
88
+ yield i`eatMatch(<TagType />)`;
89
+ yield i`eat(<~*Punctuator '>' balancer /> 'closeToken')`;
50
90
  }
51
91
 
52
92
  *Attributes() {
53
- yield i`eatMatch(<List> null {
54
- element: <Attribute>
93
+ yield i`eatMatch(<List /> null {
94
+ element: <Attribute />
55
95
  allowTrailingSeparator: false
56
96
  })`;
57
97
  }
58
98
 
59
99
  *Attribute() {
60
100
  if (yield i`match(/[a-zA-Z]+\s*=/)`) {
61
- yield i`eat(<MappingAttribute>)`;
101
+ yield i`eat(<MappingAttribute />)`;
62
102
  } else {
63
- yield i`eat(<BooleanAttribute>)`;
103
+ yield i`eat(<BooleanAttribute />)`;
64
104
  }
65
105
  }
66
106
 
67
107
  @CoveredBy('Attribute')
68
108
  @Node
69
109
  *BooleanAttribute() {
70
- yield i`eat(<*CSTML:Identifier> 'key')`;
110
+ yield i`eat(<*CSTML:Identifier /> 'key')`;
71
111
  }
72
112
 
73
113
  @CoveredBy('Attribute')
74
114
  @Node
75
115
  *MappingAttribute() {
76
- yield i`eat(<*CSTML:Identifier> 'key')`;
77
- yield i`eat(<~*Punctuator '='> 'mapOperator')`;
78
- yield i`eat(<CSTML:AttributeValue> 'value')`;
116
+ yield i`eat(<*CSTML:Identifier /> 'key')`;
117
+ yield i`eat(<~*Punctuator '=' /> 'mapOperator')`;
118
+ yield i`eat(<CSTML:AttributeValue /> 'value')`;
79
119
  }
80
120
 
81
121
  @CoveredBy('Matcher')
82
122
  @CoveredBy('Expression')
83
123
  *StringMatcher() {
84
124
  if (yield i`match(/['"]/)`) {
85
- yield i`eat(<CSTML:String>)`;
125
+ yield i`eat(<CSTML:String />)`;
86
126
  } else {
87
- yield i`eat(<Regex:Pattern>)`;
127
+ yield i`eat(<Regex:Pattern />)`;
88
128
  }
89
129
  }
90
130
 
@@ -93,7 +133,7 @@ export const grammar = class SpamexGrammar {
93
133
  @CoveredBy('Expression')
94
134
  @Node
95
135
  *String() {
96
- yield i`eat(<CSTML:String>)`;
136
+ yield i`eat(<CSTML:String />)`;
97
137
  }
98
138
 
99
139
  @CoveredBy('StringMatcher')
@@ -101,10 +141,10 @@ export const grammar = class SpamexGrammar {
101
141
  @CoveredBy('Expression')
102
142
  @Node
103
143
  *Regex() {
104
- yield i`eat(<~*Punctuator '/' balanced='/'> 'open')`;
105
- yield i`eat(<Regex:Alternatives> 'alternatives[]')`;
106
- yield i`eat(<~*Punctuator '/' balancer> 'close')`;
107
- yield i`eat(<Regex:Flags> 'flags')`;
144
+ yield i`eat(<~*Punctuator '/' balanced='/' /> 'open')`;
145
+ yield i`eat(<Regex:Alternatives /> 'alternatives[]')`;
146
+ yield i`eat(<~*Punctuator '/' balancer /> 'close')`;
147
+ yield i`eat(<Regex:Flags /> 'flags')`;
108
148
  }
109
149
 
110
150
  @InjectFrom(productions)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bablr/language-en-spamex",
3
- "version": "0.4.3",
3
+ "version": "0.5.0",
4
4
  "description": "A BABLR language for SPAM Expressions",
5
5
  "engines": {
6
6
  "node": ">=12.0.0"
@@ -22,18 +22,18 @@
22
22
  },
23
23
  "dependencies": {
24
24
  "@babel/runtime": "^7.23.2",
25
- "@bablr/agast-helpers": "0.3.2",
26
- "@bablr/agast-vm-helpers": "0.3.2",
27
- "@bablr/helpers": "0.18.1",
28
- "@bablr/language-en-blank-space": "0.3.1",
29
- "@bablr/language-en-cstml": "0.4.3",
30
- "@bablr/language-en-regex-vm-pattern": "0.5.1"
25
+ "@bablr/agast-helpers": "0.4.0",
26
+ "@bablr/agast-vm-helpers": "0.4.0",
27
+ "@bablr/helpers": "0.19.0",
28
+ "@bablr/language-en-blank-space": "0.4.0",
29
+ "@bablr/language-en-cstml": "0.5.0",
30
+ "@bablr/language-en-regex-vm-pattern": "0.6.0"
31
31
  },
32
32
  "devDependencies": {
33
- "@bablr/boot": "0.4.0",
33
+ "@bablr/boot": "0.5.0",
34
34
  "@bablr/eslint-config-base": "github:bablr-lang/eslint-config-base#49f5952efed27f94ee9b94340eb1563c440bf64e",
35
35
  "@bablr/macrome": "0.1.3",
36
- "@bablr/macrome-generator-bablr": "0.3.1",
36
+ "@bablr/macrome-generator-bablr": "0.3.2",
37
37
  "enhanced-resolve": "^5.12.0",
38
38
  "eslint": "^7.32.0",
39
39
  "eslint-import-resolver-enhanced-resolve": "^1.0.5",