\r
block_expression\r
=\r
- | ( start:block_start contents:expressions end:block_end )\r
- | block:block_start\r
+ | block_expression_pair\r
+ | block_expression_single\r
+ ;\r
+\r
+block_expression_pair\r
+ =\r
+ start:block_start contents:expressions end:block_end\r
+ ;\r
+\r
+block_expression_single\r
+ =\r
+ block:block_start\r
;\r
\r
block_start\r
from datetime import datetime\r
+from tatsu.exceptions import FailedSemantics\r
from tatsu.util import asjson\r
import json\r
import pprint\r
from jinja2.environment import Environment\r
\r
\r
+class JinjaSemantics(object):\r
+\r
+ def block_expression_pair(self, ast):\r
+ start_block = ast['start']\r
+ end_block = ast['end']\r
+\r
+ if start_block['name'] != end_block['name']:\r
+ raise FailedSemantics()\r
+\r
+ return ast\r
+\r
+\r
with open('grammar.ebnf', 'r') as tatsu_grammar:\r
with open('test_template.jinja', 'r') as test_template:\r
template_string = test_template.read()\r
\r
parse_start = datetime.now()\r
\r
- ast = grammar.parse(template_string, whitespace='', parseinfo=True)\r
+ ast = grammar.parse(template_string, whitespace='', parseinfo=True, semantics=JinjaSemantics())\r
\r
parse_end = datetime.now()\r
\r