Skip to content

Commit

Permalink
simplify grammar
Browse files Browse the repository at this point in the history
  • Loading branch information
wrapperup committed Mar 6, 2024
1 parent ab4ad8c commit c93291c
Show file tree
Hide file tree
Showing 6 changed files with 328 additions and 519 deletions.
37 changes: 36 additions & 1 deletion corpus/main.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ Variables
(keyword))
(content))


====================
Comments
====================
Expand Down Expand Up @@ -185,3 +184,39 @@ Expressions
(tag
(keyword))
(content))

====================
Expressions 2
====================

{{ if test }}
{{}}
{{ }}
{{> javascriptCode() }}
{{-> javascriptCode() }}
{{> javascriptCode() -}}

---

(template
(content)
(tag
(keyword)
(code))
(content)
(tag)
(content)
(tag)
(content)
(tag
(keyword)
(code))
(content)
(tag
(keyword)
(code))
(content)
(tag
(keyword)
(code))
(content))
39 changes: 15 additions & 24 deletions grammar.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,53 +2,44 @@ module.exports = grammar({
name: 'vento',
externals: $ => [
$.code,
$.keyword,
],
rules: {
template: $ => repeat(choice(
$.tag,
alias($.comment_tag, $.tag),
$.content
)),

content: $ => prec.right(/[^(\{\{)]+/),

keyword: $ => /[a-zA-Z0-9\(\)\.]+/,
close_keyword: $ => /\/[a-zA-Z]+/,

codeSnippet: $ => /[^\/][\s]+/,
tag: $ => seq(
choice("{{", "{{-"),
optional($._expression),
optional($.filter),
choice("}}", "-}}")
),

_expression: $ => choice(
// "Solo keywords" aren't a valid expression,
// but we need to handle them here to avoid
// a conflict with the the sequence of a keyword
// and a code block.
alias(choice($.keyword, $.codeSnippet), $.code),
// "Solo keywords" are just code blocks
alias($.keyword, $.code),
alias($.close_keyword, $.keyword),
seq(
prec.left(1, $.keyword),
$.keyword,
$.code
),
$.comment,
),

tag: $ => seq(
choice("{{", "{{-"),
$._expression,
optional($.filter),
choice("}}", "-}}")
),
// General rule for keyword tags
// It just tries to match the first word in a tag block,
// plus any other special characters that might be present
keyword: $ => /[a-zA-Z0-9\(\)\.>]+/,
close_keyword: $ => /\/[a-zA-Z]+/,

filter: $ => repeat1(seq(
"|>",
$.code
)),

comment: $ => /#[^#]+#/,

comment_tag: $ => seq(
"{{",
$.comment,
"}}"
),
}
});
151 changes: 58 additions & 93 deletions src/grammar.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,6 @@
"type": "SYMBOL",
"name": "tag"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "comment_tag"
},
"named": true,
"value": "tag"
},
{
"type": "SYMBOL",
"name": "content"
Expand All @@ -34,67 +25,6 @@
"value": "[^(\\{\\{)]+"
}
},
"keyword": {
"type": "PATTERN",
"value": "[a-zA-Z0-9\\(\\)\\.]+"
},
"close_keyword": {
"type": "PATTERN",
"value": "\\/[a-zA-Z]+"
},
"codeSnippet": {
"type": "PATTERN",
"value": "[^\\/][\\s]+"
},
"_expression": {
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "keyword"
},
{
"type": "SYMBOL",
"name": "codeSnippet"
}
]
},
"named": true,
"value": "code"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "close_keyword"
},
"named": true,
"value": "keyword"
},
{
"type": "SEQ",
"members": [
{
"type": "PREC_LEFT",
"value": 1,
"content": {
"type": "SYMBOL",
"name": "keyword"
}
},
{
"type": "SYMBOL",
"name": "code"
}
]
}
]
},
"tag": {
"type": "SEQ",
"members": [
Expand All @@ -112,8 +42,16 @@
]
},
{
"type": "SYMBOL",
"name": "_expression"
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "_expression"
},
{
"type": "BLANK"
}
]
},
{
"type": "CHOICE",
Expand Down Expand Up @@ -142,6 +80,54 @@
}
]
},
"_expression": {
"type": "CHOICE",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "keyword"
},
"named": true,
"value": "code"
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "close_keyword"
},
"named": true,
"value": "keyword"
},
{
"type": "SEQ",
"members": [
{
"type": "SYMBOL",
"name": "keyword"
},
{
"type": "SYMBOL",
"name": "code"
}
]
},
{
"type": "SYMBOL",
"name": "comment"
}
]
},
"keyword": {
"type": "PATTERN",
"value": "[a-zA-Z0-9\\(\\)\\.>]+"
},
"close_keyword": {
"type": "PATTERN",
"value": "\\/[a-zA-Z]+"
},
"filter": {
"type": "REPEAT1",
"content": {
Expand All @@ -161,23 +147,6 @@
"comment": {
"type": "PATTERN",
"value": "#[^#]+#"
},
"comment_tag": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "{{"
},
{
"type": "SYMBOL",
"name": "comment"
},
{
"type": "STRING",
"value": "}}"
}
]
}
},
"extras": [
Expand All @@ -192,10 +161,6 @@
{
"type": "SYMBOL",
"name": "code"
},
{
"type": "SYMBOL",
"name": "keyword"
}
],
"inline": [],
Expand Down
2 changes: 1 addition & 1 deletion src/node-types.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
"fields": {},
"children": {
"multiple": true,
"required": true,
"required": false,
"types": [
{
"type": "code",
Expand Down
Loading

0 comments on commit c93291c

Please sign in to comment.