import re
N= lambda x:next( x, 0 )
G= { 'sum' :[ [ 2 , 1 ] , 1 ] , 'product' :[ [ 2 , 1 ] , 1 ] , 'print' :[ -1 , [ 2 ] ] }
F= lambda I, n:[ 'Invalid' +( D:= ' identifier' ) , 'Undefined' +D, ( U:= 'Unexpected ' ) +'EOL' , U+'token' , 'Improper type' , 'Multiple assignment' , 'Nested for loop' ] [ I] +f' on line {n}'
def O( l, n, E, t= -1 , c= 2 ) :
if l== 0 :c= 2
if l== t or-t== 1and l:return l
E( F( c, n) ) ; raise
def X( l, n, s, b, E, C, L= 0 , W= 0 ) :
v= U= 0
while ( k:= N( l) ) or v== 0 :
if ( O( k, n, E) in [ ')' , ']' ] ) ^1 :
if k in '+-*/^' :
if v== 0 :O( 1 , n, E, -2 , 3 )
V, l= X( l, n, s, b, E, C)
if ( Z:= v*0 != 0and v[ 0 ] or v, Z) not in { '+' :[ ( 1 , 1 ) , ( 2 , 2 ) ] } .get ( k, [ ( 1 , 1 ) ] ) or v!= V:O( 1 , n, E, -2 , 4 )
v= V; U= 1
elif ( ',' != k) *U:O( 0 , n, E, -2 , 3 )
elif ',' == k:l= iter ( [ k, *l] )
if 'for' == k:
if L:E( F( 6 , n) )
v= C( iter ( [ k, *l] ) , n, s, b, E) ; U= 1
elif '(' == k:v, l= X( l, n, s, b, E, C) ; O( N( l) , n, E, ')' , 2 ) ; U= 1
elif k.isalpha ( ) :
if k in G:
V, l= X( l, n, s, b, E, C, 0 , 1 )
if V== 0 :O( 0 , n, E)
if-1 != G[ k] [ 0 ] != V:O( 1 , n, E, -2 , 4 )
v= G[ k] [ 1 ] ; U= 1
else :
if ~ -( k in b[ s] ) :O( 1 , n, E, -2 , 1 )
v= b[ s] [ k]
U= 1
elif k.isdigit ( ) :v= U= 1
elif '[' == k:
L= [ ]
while 1 :
V, l= X( l, n, s, b, E, C)
if V:
L+= V,
if ( k:= N( l) ) == ']' :v= L; break
O( k, n, E, ',' , 3 )
else :O( O( N( l) , n, E) , n, E, ']' , 3 ) ; break
if ( _:= len ( Y:= set ( map ( str , L) ) ) ) -1 :
if _> 1 :E( F( 4 , n) )
v= [ 2 ] +[ [ ] , [ -1 ] ] [ [ ] < L]
else :v= [ 2 , eval ( [ *Y] [ 0 ] ) ]
U= 1
else :break
if U*W:break
else :l= iter ( [ k, *l] ) ; break
return v, l
def p( l, n, s, b, E) :
k= N( l)
if 'let' == k:
if O( k:= N( l) , n, E) .isalpha ( ) :
if ( I:= k in b[ s] ) :E( F( 5 , n) )
O( x:= N( l) , n, E) ; O( x, n, E, '=' , 3 ) ; V, l= X( l, n, s, b, E, p)
if ~ -I*V:b[ s] [ k] = V
else :E( F( 0 , n) )
elif 'for' == k:
O( N( l) , n, E, '(' , 3 ) ; O( x:= N( l) , n, E) ; O( 1 , n, E, x.isalpha ( ) , 0 ) ; O( m:= N( l) , n, E) ; O( m, n, E, 'in' , 3 )
if x in b[ s] :E( F( 5 , n) )
V, l= X( l, n, s, b, E, p) ; O( V, n, E) ; O( N( l) , n, E, ')' , 2 )
if V*0 == 0 :E( F( 4 , n) )
V, l= X( l, n, ( 0 , n) , { **b, ( 0 , n) :{ x:V if V*0 == 0else V[ 1 ] } } , E, p, 1 ) ; O( V, n, E) ; return
elif k in G:X( iter ( [ k, *l] ) , n, s, b, E, p)
def D( l) :
b, E= { ( 0 , ) :{ } } , [ ]
for i, a in enumerate ( filter ( bool , l.split ( '\n ' ) ) , 1 ) :
try :
r= [ ]
while a:r+= [ j:= re .search ( '\w +|\( |\) |\= |\+ |\- |\* |/|\^ |\[ |\] |,|\s +|\W +' , a) .group ( ) ] ; a= a[ len ( j) :]
p( filter ( str .strip , r) , i, ( 0 , ) , b, E.append )
except :1
return E
SRC= """let bb8 = 0
let bbEight = lst
for (x in
let x = 5*/5
let y = 4
let z = [5, 6] + y
let y = [[4]] + [y]
for (x in [[y, y+1], 5]) for (y in x)"""
print ( D( SRC) )
aW1wb3J0IHJlCk49bGFtYmRhIHg6bmV4dCh4LDApCkc9eydzdW0nOltbMiwxXSwxXSwncHJvZHVjdCc6W1syLDFdLDFdLCdwcmludCc6Wy0xLFsyXV19CkY9bGFtYmRhIEksbjpbJ0ludmFsaWQnKyhEOj0nIGlkZW50aWZpZXInKSwnVW5kZWZpbmVkJytELChVOj0nVW5leHBlY3RlZCAnKSsnRU9MJyxVKyd0b2tlbicsJ0ltcHJvcGVyIHR5cGUnLCdNdWx0aXBsZSBhc3NpZ25tZW50JywnTmVzdGVkIGZvciBsb29wJ11bSV0rZicgb24gbGluZSB7bn0nCmRlZiBPKGwsbixFLHQ9LTEsYz0yKToKIGlmIGw9PTA6Yz0yCiBpZiBsPT10IG9yLXQ9PTFhbmQgbDpyZXR1cm4gbAogRShGKGMsbikpO3JhaXNlCmRlZiBYKGwsbixzLGIsRSxDLEw9MCxXPTApOgogdj1VPTAKIHdoaWxlKGs6PU4obCkpb3Igdj09MDoKICBpZihPKGssbixFKWluWycpJywnXSddKV4xOgogICBpZiBrIGluJystKi9eJzoKICAgIGlmIHY9PTA6TygxLG4sRSwtMiwzKQogICAgVixsPVgobCxuLHMsYixFLEMpCiAgICBpZihaOj12KjAhPTBhbmQgdlswXW9yIHYsWilub3QgaW57JysnOlsoMSwxKSwoMiwyKV19LmdldChrLFsoMSwxKV0pb3IgdiE9VjpPKDEsbixFLC0yLDQpCiAgICB2PVY7VT0xCiAgIGVsaWYoJywnIT1rKSpVOk8oMCxuLEUsLTIsMykKICAgZWxpZicsJz09azpsPWl0ZXIoW2ssKmxdKQogICBpZidmb3InPT1rOgogICAgaWYgTDpFKEYoNixuKSkKICAgIHY9QyhpdGVyKFtrLCpsXSksbixzLGIsRSk7VT0xCiAgIGVsaWYnKCc9PWs6dixsPVgobCxuLHMsYixFLEMpO08oTihsKSxuLEUsJyknLDIpO1U9MQogICBlbGlmIGsuaXNhbHBoYSgpOgogICAgaWYgayBpbiBHOgogICAgIFYsbD1YKGwsbixzLGIsRSxDLDAsMSkKICAgICBpZiBWPT0wOk8oMCxuLEUpCiAgICAgaWYtMSE9R1trXVswXSE9VjpPKDEsbixFLC0yLDQpCiAgICAgdj1HW2tdWzFdO1U9MQogICAgZWxzZToKICAgICBpZn4tKGsgaW4gYltzXSk6TygxLG4sRSwtMiwxKQogICAgIHY9YltzXVtrXQogICAgVT0xCiAgIGVsaWYgay5pc2RpZ2l0KCk6dj1VPTEKICAgZWxpZidbJz09azoKICAgIEw9W10KICAgIHdoaWxlIDE6CiAgICAgVixsPVgobCxuLHMsYixFLEMpCiAgICAgaWYgVjoKICAgICAgTCs9ViwKICAgICAgaWYoazo9TihsKSk9PSddJzp2PUw7YnJlYWsKICAgICAgTyhrLG4sRSwnLCcsMykKICAgICBlbHNlOk8oTyhOKGwpLG4sRSksbixFLCddJywzKTticmVhawogICAgaWYoXzo9bGVuKFk6PXNldChtYXAoc3RyLEwpKSkpLTE6CiAgICAgaWYgXz4xOkUoRig0LG4pKQogICAgIHY9WzJdK1tbXSxbLTFdXVtbXTxMXQogICAgZWxzZTp2PVsyLGV2YWwoWypZXVswXSldCiAgICBVPTEKICAgZWxzZTpicmVhawogICBpZiBVKlc6YnJlYWsKICBlbHNlOmw9aXRlcihbaywqbF0pO2JyZWFrCiByZXR1cm4gdixsCmRlZiBwKGwsbixzLGIsRSk6CiBrPU4obCkKIGlmJ2xldCc9PWs6CiAgaWYgTyhrOj1OKGwpLG4sRSkuaXNhbHBoYSgpOgogICBpZihJOj1rIGluIGJbc10pOkUoRig1LG4pKQogICBPKHg6PU4obCksbixFKTtPKHgsbixFLCc9JywzKTtWLGw9WChsLG4scyxiLEUscCkKICAgaWZ+LUkqVjpiW3NdW2tdPVYKICBlbHNlOkUoRigwLG4pKQogZWxpZidmb3InPT1rOgogIE8oTihsKSxuLEUsJygnLDMpO08oeDo9TihsKSxuLEUpO08oMSxuLEUseC5pc2FscGhhKCksMCk7TyhtOj1OKGwpLG4sRSk7TyhtLG4sRSwnaW4nLDMpCiAgaWYgeCBpbiBiW3NdOkUoRig1LG4pKQogIFYsbD1YKGwsbixzLGIsRSxwKTtPKFYsbixFKTtPKE4obCksbixFLCcpJywyKQogIGlmIFYqMD09MDpFKEYoNCxuKSkKICBWLGw9WChsLG4sKDAsbikseyoqYiwoMCxuKTp7eDpWIGlmIFYqMD09MGVsc2UgVlsxXX19LEUscCwxKTtPKFYsbixFKTtyZXR1cm4KIGVsaWYgayBpbiBHOlgoaXRlcihbaywqbF0pLG4scyxiLEUscCkKZGVmIEQobCk6CiBiLEU9eygwLCk6e319LFtdCiBmb3IgaSxhIGluIGVudW1lcmF0ZShmaWx0ZXIoYm9vbCxsLnNwbGl0KCdcbicpKSwxKToKICB0cnk6CiAgIHI9W10KICAgd2hpbGUgYTpyKz1bajo9cmUuc2VhcmNoKCdcdyt8XCh8XCl8XD18XCt8XC18XCp8L3xcXnxcW3xcXXwsfFxzK3xcVysnLGEpLmdyb3VwKCldO2E9YVtsZW4oaik6XQogICBwKGZpbHRlcihzdHIuc3RyaXAsciksaSwoMCwpLGIsRS5hcHBlbmQpCiAgZXhjZXB0OjEKIHJldHVybiBFCiAKU1JDPSIiImxldCBiYjggPSAwCmxldCBiYkVpZ2h0ID0gbHN0Cgpmb3IgKHggaW4gCmxldCB4ID0gNSovNQpsZXQgeSA9IDQKbGV0IHogPSBbNSwgNl0gKyB5CmxldCB5ID0gW1s0XV0gKyBbeV0KZm9yICh4IGluIFtbeSwgeSsxXSwgNV0pIGZvciAoeSBpbiB4KSIiIgpwcmludChEKFNSQykp