jinja2cpp / jinja2cpp/Jinja2Cpp

Fix dict/map literal expression parsing

Open
#262 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
600
Forks
114
PR merge metrics
No merged PRs in 30d

Description

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("<>") },
{ Token::Equal, UNIVERSAL_STR("==") },
{ Token::NotEqual, UNIVERSAL_STR("!=") },
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by reading the dict/map literal parsing in jinja2cpp/src/expression_parser.cpp, then trace token definitions in jinja2cpp/src/lexer.h and their display names in jinja2cpp/src/template_parser.h. Reproduce the two examples from the issue and verify that colon-separated literals match the Jinja/Python syntax while equals-separated literals no longer do.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
compilers
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Clearly specified
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.