jinja2cpp / jinja2cpp/Jinja2Cpp
Fix dict/map literal expression parsing
- 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