Skip to content

Commit 5e48511

Browse files
committed
fix: correctly parse words
1 parent 318bf1b commit 5e48511

File tree

7 files changed

+619
-691
lines changed

7 files changed

+619
-691
lines changed

corpus/backtick.txt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
================================================================================
2+
Simple backtick
3+
================================================================================
4+
5+
`foobar`
6+
7+
--------------------------------------------------------------------------------
8+
9+
(help_file
10+
(line
11+
(backtick
12+
(word))))
13+
14+
================================================================================
15+
Backtick in text
16+
================================================================================
17+
18+
Hello `world`, I am a markup language
19+
20+
--------------------------------------------------------------------------------
21+
22+
(help_file
23+
(line
24+
(word)
25+
(backtick
26+
(word))
27+
(word)
28+
(word)
29+
(word)
30+
(word)
31+
(word)
32+
(word)))
33+
34+
================================================================================
35+
Backtick with command inside
36+
================================================================================
37+
38+
`:echo`
39+
40+
--------------------------------------------------------------------------------
41+
42+
(help_file
43+
(line
44+
(backtick
45+
(word))))

corpus/column_heading.txt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ Below
5252

5353
(help_file
5454
(column_heading
55-
(column_name
56-
(word)))
55+
(column_name))
5756
(line
5857
(word)))
5958

@@ -67,8 +66,6 @@ Bleh
6766

6867
(help_file
6968
(column_heading
70-
(column_name
71-
(word)
72-
(word)))
69+
(column_name))
7370
(line
7471
(word)))

grammar.js

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@ module.exports = grammar({
22
name: 'help', // The actual language name is help
33

44
extras: ($) => [/[\t ]/],
5-
conflicts: ($) => [[$._atom, $.column_name]],
65

7-
externals: ($) => [$.code_block],
6+
externals: ($) => [
7+
$.word,
8+
$.column_name,
9+
$.uppercase_name,
10+
$.code_block
11+
],
812

913
rules: {
10-
help_file: ($) => repeat1(choice($.line, '\n', $.column_heading, $.headline)),
14+
help_file: ($) =>
15+
repeat1(choice($.line, '\n', $.column_heading, $.headline)),
1116

1217
headline: ($) =>
1318
seq(
@@ -16,25 +21,33 @@ module.exports = grammar({
1621
seq(repeat1($.word), $.tag),
1722
'\n',
1823
),
24+
1925
line: ($) => prec.right(seq(repeat1($._atom), optional('\n'))),
2026

21-
_atom: ($) => choice($.word, $.tag, $.code_block, $.tag, $.option, $.hotlink),
27+
_atom: ($) =>
28+
choice(
29+
$.word,
30+
$.tag,
31+
$.code_block,
32+
$.tag,
33+
$.option,
34+
$.hotlink,
35+
$.backtick,
36+
),
2237

23-
uppercase_name: ($) => repeat1(/[A-Z]+/),
24-
column_name: ($) => repeat1($.word),
2538
column_heading: ($) =>
2639
seq(
2740
choice(
2841
seq(field('name', $.uppercase_name), optional($.tag)),
29-
seq(field('name', $.column_name), '~'),
42+
field('name', $.column_name),
3043
),
3144
'\n',
3245
),
3346

34-
word: ($) => /[^*|'\n \t]*[^*|'\n \t~]/,
3547
tag: ($) => wrapped_word($, '*', 'name'),
3648
option: ($) => wrapped_word($, "'", 'name'),
3749
hotlink: ($) => wrapped_word($, '|', 'destination'),
50+
backtick: ($) => wrapped_word($, '`', 'content'),
3851
},
3952
});
4053

src/grammar.json

Lines changed: 44 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -125,23 +125,13 @@
125125
{
126126
"type": "SYMBOL",
127127
"name": "hotlink"
128+
},
129+
{
130+
"type": "SYMBOL",
131+
"name": "backtick"
128132
}
129133
]
130134
},
131-
"uppercase_name": {
132-
"type": "REPEAT1",
133-
"content": {
134-
"type": "PATTERN",
135-
"value": "[A-Z]+"
136-
}
137-
},
138-
"column_name": {
139-
"type": "REPEAT1",
140-
"content": {
141-
"type": "SYMBOL",
142-
"name": "word"
143-
}
144-
},
145135
"column_heading": {
146136
"type": "SEQ",
147137
"members": [
@@ -174,21 +164,12 @@
174164
]
175165
},
176166
{
177-
"type": "SEQ",
178-
"members": [
179-
{
180-
"type": "FIELD",
181-
"name": "name",
182-
"content": {
183-
"type": "SYMBOL",
184-
"name": "column_name"
185-
}
186-
},
187-
{
188-
"type": "STRING",
189-
"value": "~"
190-
}
191-
]
167+
"type": "FIELD",
168+
"name": "name",
169+
"content": {
170+
"type": "SYMBOL",
171+
"name": "column_name"
172+
}
192173
}
193174
]
194175
},
@@ -198,10 +179,6 @@
198179
}
199180
]
200181
},
201-
"word": {
202-
"type": "PATTERN",
203-
"value": "[^*|'\\n \\t]*[^*|'\\n \\t~]"
204-
},
205182
"tag": {
206183
"type": "SEQ",
207184
"members": [
@@ -264,6 +241,27 @@
264241
"value": "|"
265242
}
266243
]
244+
},
245+
"backtick": {
246+
"type": "SEQ",
247+
"members": [
248+
{
249+
"type": "STRING",
250+
"value": "`"
251+
},
252+
{
253+
"type": "FIELD",
254+
"name": "content",
255+
"content": {
256+
"type": "SYMBOL",
257+
"name": "word"
258+
}
259+
},
260+
{
261+
"type": "STRING",
262+
"value": "`"
263+
}
264+
]
267265
}
268266
},
269267
"extras": [
@@ -272,14 +270,21 @@
272270
"value": "[\\t ]"
273271
}
274272
],
275-
"conflicts": [
276-
[
277-
"_atom",
278-
"column_name"
279-
]
280-
],
273+
"conflicts": [],
281274
"precedences": [],
282275
"externals": [
276+
{
277+
"type": "SYMBOL",
278+
"name": "word"
279+
},
280+
{
281+
"type": "SYMBOL",
282+
"name": "column_name"
283+
},
284+
{
285+
"type": "SYMBOL",
286+
"name": "uppercase_name"
287+
},
283288
{
284289
"type": "SYMBOL",
285290
"name": "code_block"

src/node-types.json

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
11
[
2+
{
3+
"type": "backtick",
4+
"named": true,
5+
"fields": {
6+
"content": {
7+
"multiple": false,
8+
"required": true,
9+
"types": [
10+
{
11+
"type": "word",
12+
"named": true
13+
}
14+
]
15+
}
16+
}
17+
},
218
{
319
"type": "column_heading",
420
"named": true,
@@ -29,21 +45,6 @@
2945
]
3046
}
3147
},
32-
{
33-
"type": "column_name",
34-
"named": true,
35-
"fields": {},
36-
"children": {
37-
"multiple": true,
38-
"required": true,
39-
"types": [
40-
{
41-
"type": "word",
42-
"named": true
43-
}
44-
]
45-
}
46-
},
4748
{
4849
"type": "headline",
4950
"named": true,
@@ -110,6 +111,10 @@
110111
"multiple": true,
111112
"required": true,
112113
"types": [
114+
{
115+
"type": "backtick",
116+
"named": true
117+
},
113118
{
114119
"type": "code_block",
115120
"named": true
@@ -165,11 +170,6 @@
165170
}
166171
}
167172
},
168-
{
169-
"type": "uppercase_name",
170-
"named": true,
171-
"fields": {}
172-
},
173173
{
174174
"type": "\n",
175175
"named": false
@@ -182,20 +182,28 @@
182182
"type": "*",
183183
"named": false
184184
},
185+
{
186+
"type": "`",
187+
"named": false
188+
},
185189
{
186190
"type": "code_block",
187191
"named": true
188192
},
189193
{
190-
"type": "word",
194+
"type": "column_name",
191195
"named": true
192196
},
193197
{
194-
"type": "|",
195-
"named": false
198+
"type": "uppercase_name",
199+
"named": true
200+
},
201+
{
202+
"type": "word",
203+
"named": true
196204
},
197205
{
198-
"type": "~",
206+
"type": "|",
199207
"named": false
200208
}
201209
]

0 commit comments

Comments
 (0)