mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
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.
This commit is contained in:
parent
ca9db62ead
commit
bde8cd5e65
@ -217,7 +217,7 @@ General Program Mode replaces the template with a program written in the `templa
|
|||||||
top_expression ::= or_expression
|
top_expression ::= or_expression
|
||||||
or_expression ::= and_expression [ '||' and_expression ]*
|
or_expression ::= and_expression [ '||' and_expression ]*
|
||||||
and_expression ::= not_expression [ '&&' not_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_expr ::= add_sub_expr [ compare_op add_sub_expr ]
|
||||||
compare_op ::= '==' | '!=' | '>=' | '>' | '<=' | '<' | 'in' |
|
compare_op ::= '==' | '!=' | '>=' | '>' | '<=' | '<' | 'in' |
|
||||||
'==#' | '!=#' | '>=#' | '>#' | '<=#' | '<#'
|
'==#' | '!=#' | '>=#' | '>#' | '<=#' | '<#'
|
||||||
@ -227,13 +227,13 @@ General Program Mode replaces the template with a program written in the `templa
|
|||||||
times_div_op ::= '*' | '/'
|
times_div_op ::= '*' | '/'
|
||||||
unary_op_expr ::= [ add_sub_op unary_op_expr ]* | expression
|
unary_op_expr ::= [ add_sub_op unary_op_expr ]* | expression
|
||||||
expression ::= identifier | constant | function | assignment |
|
expression ::= identifier | constant | function | assignment |
|
||||||
if_expression | for_expression | '(' top_expression ')'
|
if_expression | for_expression | '(' expression_list ')'
|
||||||
identifier ::= sequence of letters or ``_`` characters
|
identifier ::= sequence of letters or ``_`` characters
|
||||||
constant ::= " string " | ' string ' | number
|
constant ::= " string " | ' string ' | number
|
||||||
function ::= identifier '(' top_expression [ ',' top_expression ]* ')'
|
function ::= identifier '(' expression_list [ ',' expression_list ]* ')'
|
||||||
assignment ::= identifier '=' top_expression
|
assignment ::= identifier '=' top_expression
|
||||||
if_expression ::= 'if' condition 'then' expression_list
|
if_expression ::= 'if' condition 'then' expression_list
|
||||||
[elif_expression] ['else' expression_list] 'fi'
|
[ elif_expression ] [ 'else' expression_list ] 'fi'
|
||||||
condition ::= top_expression
|
condition ::= top_expression
|
||||||
elif_expression ::= 'elif' condition 'then' expression_list elif_expression | ''
|
elif_expression ::= 'elif' condition 'then' expression_list elif_expression | ''
|
||||||
for_expression ::= 'for' identifier 'in' list_expression
|
for_expression ::= 'for' identifier 'in' list_expression
|
||||||
|
@ -568,7 +568,7 @@ class _Parser(object):
|
|||||||
def expr(self):
|
def expr(self):
|
||||||
if self.token_op_is_lparen():
|
if self.token_op_is_lparen():
|
||||||
self.consume()
|
self.consume()
|
||||||
rv = self.top_expr()
|
rv = self.expression_list()
|
||||||
if not self.token_op_is_rparen():
|
if not self.token_op_is_rparen():
|
||||||
self.error(_('Missing )'))
|
self.error(_('Missing )'))
|
||||||
self.consume()
|
self.consume()
|
||||||
@ -598,7 +598,7 @@ class _Parser(object):
|
|||||||
arguments = list()
|
arguments = list()
|
||||||
while not self.token_op_is_rparen():
|
while not self.token_op_is_rparen():
|
||||||
# evaluate the expression (recursive call)
|
# evaluate the expression (recursive call)
|
||||||
arguments.append(self.top_expr())
|
arguments.append(self.expression_list())
|
||||||
if not self.token_op_is_comma():
|
if not self.token_op_is_comma():
|
||||||
break
|
break
|
||||||
self.consume()
|
self.consume()
|
||||||
@ -906,6 +906,8 @@ class _Interpreter(object):
|
|||||||
|
|
||||||
def expr(self, prog):
|
def expr(self, prog):
|
||||||
try:
|
try:
|
||||||
|
if isinstance(prog, list):
|
||||||
|
return self.expression_list(prog)
|
||||||
return self.NODE_OPS[prog.node_type](self, prog)
|
return self.NODE_OPS[prog.node_type](self, prog)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
raise e
|
raise e
|
||||||
|
Loading…
x
Reference in New Issue
Block a user