diff --git a/src/feel.grammar b/src/feel.grammar index 3d7dd41..1ac7065 100644 --- a/src/feel.grammar +++ b/src/feel.grammar @@ -1,3 +1,5 @@ +@dialects { camunda } + @precedence { name, type, @@ -322,8 +324,12 @@ Identifier { identifier | nameIdentifier } +BacktickIdentifier { + backtickIdentifier +} + VariableName { - (!name Identifier ~ident)+ + (!name Identifier ~ident)+ | BacktickIdentifier } AdditionalIdentifier[@name=Identifier] { @@ -453,6 +459,10 @@ commaSep { (digits ("." digits)? | "." digits) } + backtickIdentifier[@dialect=camunda] { + "`" (![\\\n`] | "\\" _)* "`" + } + @precedence { BlockComment, LineComment, divide } @precedence { diff --git a/test/camunda.txt b/test/camunda.txt new file mode 100644 index 0000000..0cf4bf8 --- /dev/null +++ b/test/camunda.txt @@ -0,0 +1,13 @@ +# VariableName (backtick escaped) { "top": "Expressions", "dialect": "camunda" } + +`foo`; +foo.`bar`; +foo.`bar-baz`; + +==> + +Expressions( + VariableName(BacktickIdentifier(...)), + PathExpression(VariableName(...), VariableName(BacktickIdentifier(...))), + PathExpression(VariableName(...), VariableName(BacktickIdentifier(...))) +) \ No newline at end of file diff --git a/test/expressions.txt b/test/expressions.txt index 1525c2b..7b5070a 100644 --- a/test/expressions.txt +++ b/test/expressions.txt @@ -2619,4 +2619,19 @@ foo[[[[[[[(1..10).start included]]]]]]] Expression( FilterExpression(VariableName(...), List(...)) +) + + +# Backtick escaped variables (Camunda) { "top": "Expressions", "dialect": "camunda" } + +`foo`; +foo.`bar`; +foo.`bar-baz`; + +==> + +Expressions( + VariableName(...), + PathExpression(VariableName(...), VariableName(...)), + PathExpression(VariableName(...), VariableName(...)) ) \ No newline at end of file diff --git a/test/test-feel.js b/test/test-feel.js index 7fbdde4..9b18259 100644 --- a/test/test-feel.js +++ b/test/test-feel.js @@ -171,7 +171,7 @@ for (const file of fs.readdirSync(caseDir)) { }) : parser; }; - const contextTracker = /expressions|unary-test/.test(fileName) + const contextTracker = /expressions|unary-test|camunda/.test(fileName) ? trackVariables : null;