Skip to content

Fix dict/map literal expression parsing #262

Description

@tjsmith-meta

Looks like jinja2cpp just doesn't match the spec here on parsing dict/map literals.
https://jinja.palletsprojects.com/en/2.10.x/templates/#literals

Here's what works in Python (but doesn't work with jinja2cpp).

{% set foo = {"bar":"baz"} %}

Here's what currently works in jinja2cpp (but doesn't work with Python).

{% set foo = {"bar"="baz"} %}

Here's the local code changes I made to make jinja2cpp behave the same as Python and match the docs/spec.

diff --git a/jinja2cpp/src/expression_parser.cpp b/jinja2cpp/src/expression_parser.cpp
--- a/jinja2cpp/src/expression_parser.cpp
+++ b/jinja2cpp/src/expression_parser.cpp
@@ -395,11 +395,11 @@
         if (key != Token::String)
             return MakeParseError(ErrorCode::ExpectedStringLiteral, key);

-        if (!lexer.EatIfEqual('='))
+        if (!lexer.EatIfEqual(':'))
         {
             auto tok = lexer.PeekNextToken();
             auto tok1 = tok;
-            tok1.type = Token::Assign;
+            tok1.type = Token::Colon;
             return MakeParseError(ErrorCode::ExpectedToken, tok, {tok1});
         }

diff --git a/jinja2cpp/src/lexer.h b/jinja2cpp/src/lexer.h
--- a/jinja2cpp/src/lexer.h
+++ b/jinja2cpp/src/lexer.h
@@ -37,6 +37,7 @@
         RCrlBracket = '}',
         Assign = '=',
         Comma = ',',
+        Colon = ':',
         Eof = 256,

         // General
diff --git a/jinja2cpp/src/template_parser.h b/jinja2cpp/src/template_parser.h
--- a/jinja2cpp/src/template_parser.h
+++ b/jinja2cpp/src/template_parser.h
@@ -1017,6 +1017,7 @@
     { Token::RCrlBracket, UNIVERSAL_STR("}") },
     { Token::Assign, UNIVERSAL_STR("=") },
     { Token::Comma, UNIVERSAL_STR(",") },
+    { Token::Colon, UNIVERSAL_STR(":") },
     { Token::Eof, UNIVERSAL_STR("<<End of block>>") },
     { Token::Equal, UNIVERSAL_STR("==") },
     { Token::NotEqual, UNIVERSAL_STR("!=") },

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions