From bde8cd5e65984786471851309bd9c95be1f354a5 Mon Sep 17 00:00:00 2001 From: Charles Haley Date: Sun, 7 Mar 2021 11:01:50 +0000 Subject: [PATCH] 1) Fix regression in template language: at some point in V5 the template language was changed to disallow using an expression_list as a parameter. This was allowed in previous major revisions. 2) Allow expression lists in parameterized expressions. 3) Correct the grammar in the documentation. --- manual/template_lang.rst | 8 ++++---- src/calibre/utils/formatter.py | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/manual/template_lang.rst b/manual/template_lang.rst index db39240097..f90da3ae47 100644 --- a/manual/template_lang.rst +++ b/manual/template_lang.rst @@ -217,7 +217,7 @@ General Program Mode replaces the template with a program written in the `templa top_expression ::= or_expression or_expression ::= and_expression [ '||' and_expression ]* and_expression ::= not_expression [ '&&' not_expression ]* - not_expression ::= ['!' not_expression]* | compare_exp + not_expression ::= [ '!' not_expression ]* | compare_exp compare_expr ::= add_sub_expr [ compare_op add_sub_expr ] compare_op ::= '==' | '!=' | '>=' | '>' | '<=' | '<' | 'in' | '==#' | '!=#' | '>=#' | '>#' | '<=#' | '<#' @@ -227,13 +227,13 @@ General Program Mode replaces the template with a program written in the `templa times_div_op ::= '*' | '/' unary_op_expr ::= [ add_sub_op unary_op_expr ]* | expression expression ::= identifier | constant | function | assignment | - if_expression | for_expression | '(' top_expression ')' + if_expression | for_expression | '(' expression_list ')' identifier ::= sequence of letters or ``_`` characters constant ::= " string " | ' string ' | number - function ::= identifier '(' top_expression [ ',' top_expression ]* ')' + function ::= identifier '(' expression_list [ ',' expression_list ]* ')' assignment ::= identifier '=' top_expression if_expression ::= 'if' condition 'then' expression_list - [elif_expression] ['else' expression_list] 'fi' + [ elif_expression ] [ 'else' expression_list ] 'fi' condition ::= top_expression elif_expression ::= 'elif' condition 'then' expression_list elif_expression | '' for_expression ::= 'for' identifier 'in' list_expression diff --git a/src/calibre/utils/formatter.py b/src/calibre/utils/formatter.py index e7783236e1..dd6f4df275 100644 --- a/src/calibre/utils/formatter.py +++ b/src/calibre/utils/formatter.py @@ -568,7 +568,7 @@ class _Parser(object): def expr(self): if self.token_op_is_lparen(): self.consume() - rv = self.top_expr() + rv = self.expression_list() if not self.token_op_is_rparen(): self.error(_('Missing )')) self.consume() @@ -598,7 +598,7 @@ class _Parser(object): arguments = list() while not self.token_op_is_rparen(): # evaluate the expression (recursive call) - arguments.append(self.top_expr()) + arguments.append(self.expression_list()) if not self.token_op_is_comma(): break self.consume() @@ -906,6 +906,8 @@ class _Interpreter(object): def expr(self, prog): try: + if isinstance(prog, list): + return self.expression_list(prog) return self.NODE_OPS[prog.node_type](self, prog) except ValueError as e: raise e