This commit is contained in:
Kovid Goyal 2021-11-11 18:04:10 +05:30
commit 0c3245ee38
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -46,6 +46,7 @@ class Node:
NODE_CONTINUE = 23 NODE_CONTINUE = 23
NODE_RETURN = 24 NODE_RETURN = 24
NODE_CHARACTER = 25 NODE_CHARACTER = 25
NODE_STRCAT = 26
def __init__(self, line_number, name): def __init__(self, line_number, name):
self.my_line_number = line_number self.my_line_number = line_number
@ -255,6 +256,13 @@ class CharacterNode(Node):
self.expression = expression self.expression = expression
class StrcatNode(Node):
def __init__(self, line_number, expression_list):
Node.__init__(self, line_number, 'strcat()')
self.node_type = self.NODE_STRCAT
self.expression_list = expression_list
class _Parser: class _Parser:
LEX_OP = 1 LEX_OP = 1
LEX_ID = 2 LEX_ID = 2
@ -535,9 +543,9 @@ class _Parser:
lambda ln, args: FieldNode(ln, args[0])), lambda ln, args: FieldNode(ln, args[0])),
'raw_field': (lambda args: len(args) == 1, 'raw_field': (lambda args: len(args) == 1,
lambda ln, args: RawFieldNode(ln, *args)), lambda ln, args: RawFieldNode(ln, *args)),
'test': (lambda args: len(args) == 1, 'test': (lambda args: len(args) == 3,
lambda ln, args: IfNode(ln, args[0], (args[1],), (args[2],))), lambda ln, args: IfNode(ln, args[0], (args[1],), (args[2],))),
'first_non_empty': (lambda args: len(args) == 1, 'first_non_empty': (lambda args: len(args) >= 1,
lambda ln, args: FirstNonEmptyNode(ln, args)), lambda ln, args: FirstNonEmptyNode(ln, args)),
'assign': (lambda args: len(args) == 2 and len(args[0]) == 1 and args[0][0].node_type == Node.NODE_RVALUE, 'assign': (lambda args: len(args) == 2 and len(args[0]) == 1 and args[0][0].node_type == Node.NODE_RVALUE,
lambda ln, args: AssignNode(ln, args[0][0].name, args[1])), lambda ln, args: AssignNode(ln, args[0][0].name, args[1])),
@ -547,6 +555,8 @@ class _Parser:
lambda ln, args: CharacterNode(ln, args[0])), lambda ln, args: CharacterNode(ln, args[0])),
'print': (lambda _: True, 'print': (lambda _: True,
lambda ln, args: PrintNode(ln, args)), lambda ln, args: PrintNode(ln, args)),
'strcat': (lambda _: True,
lambda ln, args: StrcatNode(ln, args))
} }
def expr(self): def expr(self):
@ -935,6 +945,12 @@ class _Interpreter:
self.break_reporter(prog.node_name, '', prog.line_number) self.break_reporter(prog.node_name, '', prog.line_number)
return '' return ''
def do_node_strcat(self, prog):
res = ''.join([self.expr(expr) for expr in prog.expression_list])
if self.break_reporter:
self.break_reporter(prog.node_name, res, prog.line_number)
return res
def do_node_for(self, prog): def do_node_for(self, prog):
line_number = prog.line_number line_number = prog.line_number
try: try:
@ -1125,6 +1141,7 @@ class _Interpreter:
Node.NODE_CONTINUE: do_node_continue, Node.NODE_CONTINUE: do_node_continue,
Node.NODE_RETURN: do_node_return, Node.NODE_RETURN: do_node_return,
Node.NODE_CHARACTER: do_node_character, Node.NODE_CHARACTER: do_node_character,
Node.NODE_STRCAT: do_node_strcat,
} }
def expr(self, prog): def expr(self, prog):