Skip to content

Commit 8c12290

Browse files
committed
Add SCSS Grammar (#1)
If an open source Tree-sitter parser is available, we can run `./vendor.sh download` to download the C code thats needed to add a grammar. I'm using [serenadeai/tree-sitter-scss](https://github.com/serenadeai/tree-sitter-scss) to add the SCSS grammar. The `vendor.sh` script is using features from the latest version of Bash. MacOS includes an older version of Bash so I updated my system to v5. Add grammar: name; version / tag of repo to download; files to download `["scss"]="v1.0.0;parser.c;scanner.c"` Add repository `["scss"]="serenadeai/tree-sitter-scss"` From root of repo run: `./vendor.sh download` In new grammar directory add: - `binding.go` - `binding_test.go` Run your test to verify the new grammar works! - [Install Bash 5 on macOS](https://scriptingosx.com/2019/02/install-bash-5-on-macos/) - [Creating parsers | Tree-sitter](https://tree-sitter.github.io/tree-sitter/creating-parsers) - smacker#58
1 parent a5b223f commit 8c12290

File tree

6 files changed

+19652
-104
lines changed

6 files changed

+19652
-104
lines changed

_automation/grammars.json

+34-104
Original file line numberDiff line numberDiff line change
@@ -2,231 +2,171 @@
22
{
33
"language": "bash",
44
"url": "https://github.com/tree-sitter/tree-sitter-bash",
5-
"files": [
6-
"parser.c",
7-
"scanner.cc"
8-
],
5+
"files": ["parser.c", "scanner.cc"],
96
"reference": "v0.19.0",
107
"revision": "b6667bed364733c8a8f8e5973749f86cfa04ba2a"
118
},
129
{
1310
"language": "c",
1411
"url": "https://github.com/tree-sitter/tree-sitter-c",
15-
"files": [
16-
"parser.c"
17-
],
12+
"files": ["parser.c"],
1813
"reference": "v0.20.2",
1914
"revision": "7175a6dd5fc1cee660dce6fe23f6043d75af424a"
2015
},
2116
{
2217
"language": "csharp",
2318
"url": "https://github.com/tree-sitter/tree-sitter-c-sharp",
24-
"files": [
25-
"parser.c",
26-
"scanner.c"
27-
],
19+
"files": ["parser.c", "scanner.c"],
2820
"reference": "v0.20.0",
2921
"revision": "7a47daeaf0d410dd1a91c97b274bb7276dd96605"
3022
},
3123
{
3224
"language": "cpp",
3325
"url": "https://github.com/tree-sitter/tree-sitter-cpp",
34-
"files": [
35-
"parser.c",
36-
"scanner.cc"
37-
],
26+
"files": ["parser.c", "scanner.cc"],
3827
"reference": "v0.20.0",
3928
"revision": "f44509141e7e483323d2ec178f2d2e6c0fc041c1"
4029
},
4130
{
4231
"language": "css",
4332
"url": "https://github.com/tree-sitter/tree-sitter-css",
44-
"files": [
45-
"parser.c",
46-
"scanner.c"
47-
],
33+
"files": ["parser.c", "scanner.c"],
4834
"reference": "v0.19.0",
4935
"revision": "9668e889161358d18a558f68f1614b6edde34029"
5036
},
5137
{
5238
"language": "cue",
5339
"url": "https://github.com/eonpatapon/tree-sitter-cue",
54-
"files": [
55-
"parser.c",
56-
"scanner.c"
57-
],
40+
"files": ["parser.c", "scanner.c"],
5841
"reference": "main",
5942
"revision": "61843e3beebf19417e4fede4e8be4df1084317ad"
6043
},
6144
{
6245
"language": "dockerfile",
6346
"url": "https://github.com/camdencheek/tree-sitter-dockerfile",
64-
"files": [
65-
"parser.c"
66-
],
47+
"files": ["parser.c"],
6748
"reference": "v0.1.2",
6849
"revision": "d34a0cebd094e830bdd2106a28cb2f1fb22401d8"
6950
},
7051
{
7152
"language": "elixir",
7253
"url": "https://github.com/elixir-lang/tree-sitter-elixir",
73-
"files": [
74-
"parser.c",
75-
"scanner.cc"
76-
],
54+
"files": ["parser.c", "scanner.cc"],
7755
"reference": "v0.1.0",
7856
"revision": "869dff3ceb8823ca4b17ca33b663667c8e41e8ba"
7957
},
8058
{
8159
"language": "elm",
8260
"url": "https://github.com/elm-tooling/tree-sitter-elm",
83-
"files": [
84-
"parser.c",
85-
"scanner.cc"
86-
],
61+
"files": ["parser.c", "scanner.cc"],
8762
"reference": "v5.6.3",
8863
"revision": "cce0e5938e7779f86cf8bf445eadf7df4b88229d"
8964
},
9065
{
9166
"language": "golang",
9267
"url": "https://github.com/tree-sitter/tree-sitter-go",
93-
"files": [
94-
"parser.c"
95-
],
68+
"files": ["parser.c"],
9669
"reference": "master",
9770
"revision": "64457ea6b73ef5422ed1687178d4545c3e91334a"
9871
},
9972
{
10073
"language": "hcl",
10174
"url": "https://github.com/mitchellh/tree-sitter-hcl",
102-
"files": [
103-
"parser.c",
104-
"scanner.cc"
105-
],
75+
"files": ["parser.c", "scanner.cc"],
10676
"reference": "main",
10777
"revision": "a8bd2568d37065a3b451cfd91745607fac4aac84"
10878
},
10979
{
11080
"language": "html",
11181
"url": "https://github.com/tree-sitter/tree-sitter-html",
112-
"files": [
113-
"parser.c",
114-
"scanner.cc",
115-
"tag.h"
116-
],
82+
"files": ["parser.c", "scanner.cc", "tag.h"],
11783
"reference": "v0.19.0",
11884
"revision": "d93af487cc75120c89257195e6be46c999c6ba18"
11985
},
12086
{
12187
"language": "java",
12288
"url": "https://github.com/tree-sitter/tree-sitter-java",
123-
"files": [
124-
"parser.c"
125-
],
89+
"files": ["parser.c"],
12690
"reference": "v0.20.1",
12791
"revision": "09d650def6cdf7f479f4b78f595e9ef5b58ce31e"
12892
},
12993
{
13094
"language": "javascript",
13195
"url": "https://github.com/tree-sitter/tree-sitter-javascript",
132-
"files": [
133-
"parser.c",
134-
"scanner.c"
135-
],
96+
"files": ["parser.c", "scanner.c"],
13697
"reference": "v0.19.0",
13798
"revision": "efd8cc9ee8eb919c2ca0f0eebaeb8f39557d8a8a"
13899
},
139100
{
140101
"language": "kotlin",
141102
"url": "https://github.com/fwcd/tree-sitter-kotlin",
142-
"files": [
143-
"parser.c",
144-
"scanner.c"
145-
],
103+
"files": ["parser.c", "scanner.c"],
146104
"reference": "main",
147105
"revision": "cce9073807c6c1da81ce658d683fdac2878e5b57"
148106
},
149107
{
150108
"language": "lua",
151109
"url": "https://github.com/tjdevries/tree-sitter-lua",
152-
"files": [
153-
"parser.c",
154-
"scanner.c"
155-
],
110+
"files": ["parser.c", "scanner.c"],
156111
"reference": "master",
157112
"revision": "0e860f697901c9b610104eb61d3812755d5211fc"
158113
},
159114
{
160115
"language": "ocaml",
161116
"url": "https://github.com/tree-sitter/tree-sitter-ocaml",
162-
"files": [
163-
"parser.c",
164-
"scanner.cc",
165-
"scanner.h"
166-
],
117+
"files": ["parser.c", "scanner.cc", "scanner.h"],
167118
"reference": "v0.20.1",
168119
"revision": "de07323343946c32759933cb3b7c78e821098cad"
169120
},
170121
{
171122
"language": "php",
172123
"url": "https://github.com/tree-sitter/tree-sitter-php",
173-
"files": [
174-
"parser.c",
175-
"scanner.cc"
176-
],
124+
"files": ["parser.c", "scanner.cc"],
177125
"reference": "v0.19.0",
178126
"revision": "3ef0d5c253affe4b7fb46d9505db6df143db565a"
179127
},
180128
{
181129
"language": "protobuf",
182130
"url": "https://github.com/mitchellh/tree-sitter-proto",
183-
"files": [
184-
"parser.c"
185-
],
131+
"files": ["parser.c"],
186132
"reference": "main",
187133
"revision": "42d82fa18f8afe59b5fc0b16c207ee4f84cb185f"
188134
},
189135
{
190136
"language": "python",
191137
"url": "https://github.com/tree-sitter/tree-sitter-python",
192-
"files": [
193-
"parser.c",
194-
"scanner.cc"
195-
],
138+
"files": ["parser.c", "scanner.cc"],
196139
"reference": "v0.20.0",
197140
"revision": "2b9e9e0d231d5dd9f491d47f704817baee7d5af0"
198141
},
199142
{
200143
"language": "ruby",
201144
"url": "https://github.com/tree-sitter/tree-sitter-ruby",
202-
"files": [
203-
"parser.c",
204-
"scanner.cc"
205-
],
145+
"files": ["parser.c", "scanner.cc"],
206146
"reference": "v0.19.0",
207147
"revision": "fe6a2d634da0e16b11b5aa255cc3df568a4572fd"
208148
},
209149
{
210150
"language": "rust",
211151
"url": "https://github.com/tree-sitter/tree-sitter-rust",
212-
"files": [
213-
"parser.c",
214-
"scanner.c"
215-
],
152+
"files": ["parser.c", "scanner.c"],
216153
"reference": "v0.20.3",
217154
"revision": "0431a2c60828731f27491ee9fdefe25e250ce9c9"
218155
},
219156
{
220157
"language": "scala",
221158
"url": "https://github.com/tree-sitter/tree-sitter-scala",
222-
"files": [
223-
"parser.c",
224-
"scanner.c",
225-
"stack.h"
226-
],
159+
"files": ["parser.c", "scanner.c", "stack.h"],
227160
"reference": "v0.19.1",
228161
"revision": "918f0fb948405181707a1772cab639f2d278d384"
229162
},
163+
{
164+
"language": "scss",
165+
"url": "https://github.com/serenadeai/tree-sitter-scss",
166+
"files": ["parser.c", "scanner.c"],
167+
"reference": "v1.0.0",
168+
"revision": "c478c6868648eff49eb04a4df90d703dc45b312a"
169+
},
230170
{
231171
"language": "svelte",
232172
"url": "https://github.com/Himujjal/tree-sitter-svelte",
@@ -245,32 +185,22 @@
245185
{
246186
"language": "toml",
247187
"url": "https://github.com/ikatyang/tree-sitter-toml",
248-
"files": [
249-
"parser.c",
250-
"scanner.c"
251-
],
188+
"files": ["parser.c", "scanner.c"],
252189
"reference": "v0.5.1",
253190
"revision": "474fbbec27e27d76b45aeaf9191e8acb13a699e2"
254191
},
255192
{
256193
"language": "typescript",
257194
"url": "https://github.com/tree-sitter/tree-sitter-typescript",
258-
"files": [
259-
"parser.c",
260-
"scanner.c"
261-
],
195+
"files": ["parser.c", "scanner.c"],
262196
"reference": "v0.20.2",
263197
"revision": "5d20856f34315b068c41edaee2ac8a100081d259"
264198
},
265199
{
266200
"language": "yaml",
267201
"url": "https://github.com/ikatyang/tree-sitter-yaml",
268-
"files": [
269-
"parser.c",
270-
"scanner.cc",
271-
"schema.generated.cc"
272-
],
202+
"files": ["parser.c", "scanner.cc", "schema.generated.cc"],
273203
"reference": "v0.5.0",
274204
"revision": "6129a83eeec7d6070b1c0567ec7ce3509ead607c"
275205
}
276-
]
206+
]

scss/binding.go

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package scss
2+
3+
//#include "parser.h"
4+
//TSLanguage *tree_sitter_scss();
5+
import "C"
6+
7+
import (
8+
"unsafe"
9+
10+
sitter "github.com/codepen/go-tree-sitter"
11+
)
12+
13+
func GetLanguage() *sitter.Language {
14+
ptr := unsafe.Pointer(C.tree_sitter_scss())
15+
return sitter.NewLanguage(ptr)
16+
}

scss/binding_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package scss_test
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
sitter "github.com/codepen/go-tree-sitter"
8+
"github.com/codepen/go-tree-sitter/scss"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
func TestGrammar(t *testing.T) {
13+
assert := assert.New(t)
14+
15+
n, err := sitter.ParseCtx(context.Background(), []byte(`@import "compass"; $text-color: #555555; body { color: $text-color; }`), scss.GetLanguage())
16+
assert.NoError(err)
17+
assert.Equal(
18+
"(stylesheet (import_statement (string_value)) (declaration (variable_name) (color_value)) (rule_set (selectors (tag_name)) (block (declaration (property_name) (variable_value)))))",
19+
n.String(),
20+
)
21+
}

0 commit comments

Comments
 (0)