Skip to content

Commit

Permalink
fix: parser issues
Browse files Browse the repository at this point in the history
  • Loading branch information
Justin Kimbrell committed Oct 9, 2023
1 parent c91fb7e commit bba6e55
Show file tree
Hide file tree
Showing 3 changed files with 1,227 additions and 317 deletions.
8 changes: 8 additions & 0 deletions __tests__/freemarker.spec.ts
Expand Up @@ -42,4 +42,12 @@ test('that the following freemarker syntax will parse', () => {
'inner',
'</#if>'
]);

expect(parse('${"test\'s"?test().a() && b < 2 || true}')).toEqual([
'${"test\'s"?test().a() && b < 2 || true}'
]);

expect(parse('<#if a() && foo.bar()?trim>')).toEqual([
'<#if a() && foo.bar()?trim>'
]);
})
31 changes: 21 additions & 10 deletions grammar.pegjs
@@ -1,7 +1,7 @@
start
= (conditional / tag / text)*

text
text "text"
= value: char+ { return value.join('') }

char "string"
Expand All @@ -26,31 +26,34 @@ endif
= &"</#if" value: "</#if>" { return value }

tag_expression "expression"
= value: ("(" _ unsafe_expression _ ")" / unsafe_expression) _ {
= value: ("!"? "(" _ unsafe_expression _ ")" / unsafe_expression) _ {
return value.flat(Infinity).join('')
}

expression "expression"
= value: ("(" _ unsafe_expression _ ")" / safe_expression) _ {
= value: ("!"? "(" _ unsafe_expression _ ")" / safe_expression) _ {
return value.flat(Infinity).join('')
}

unsafe_expression "equation"
= variable (_ unsafe_operator _ (variable/expression))*
= "!"? variable (_ unsafe_operator _ (variable/expression))*

safe_expression "equation"
= variable (_ safe_operator _ (variable/expression))*
= "!"? variable (_ safe_operator _ (variable/expression))*

variable
= value: (string ("." string)* ((args? "."? variable?)/(modifier_expression*))) {
return value.flat(Infinity).join('')
= value: (
(encapsulated_string ("." varname)* modifier_expression* ("." variable)*) /
(varname ("." varname)* args* modifier_expression* ("." variable)*)
) {
return Array.isArray(value) ? value.flat(Infinity).join('') : value;
}

modifier_expression
= "?" modifier args?

modifier "modifier"
= string
= varname

args = "(" arg? (comma arg)* ")"

Expand All @@ -66,6 +69,8 @@ safe_operator "operator"
/ "-"
/ "/"
/ "*"
/ "&&"
/ "||"

unsafe_operator "operator"
= safe_operator
Expand All @@ -77,9 +82,15 @@ number "number"
point: "." decimal: [0-9]+ { return "." + decimal.join('') }
)? { return `${negative ?? ''}${number.join('')}${decimal ?? ''}` }
string "string"
= value: ["a-zA-Z0-9_]+ { return value.join('') }
encapsulated_string
= &('"'/"'") value: (
("'" ("\\'" / (!"'" char))* "'") /
('"' ('\\"' / (!'"' char))* '"')
) { return value.flat(Infinity).filter(Boolean).join('') }
varname
= value: [a-zA-Z0-9_]+ { return value.join('') }
comma ","
= _ "," _
Expand Down

0 comments on commit bba6e55

Please sign in to comment.