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:
Charles Haley 2021-03-07 11:01:50 +00:00
parent ca9db62ead
commit bde8cd5e65
2 changed files with 8 additions and 6 deletions

View File

@ -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

View File

@ -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