fork download
  1. import re
  2. N=lambda x:next(x,0)
  3. G={'sum':[[2,1],1],'product':[[2,1],1],'print':[-1,[2]]}
  4. 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}'
  5. def O(l,n,E,t=-1,c=2):
  6. if l==0:c=2
  7. if l==t or-t==1and l:return l
  8. E(F(c,n));raise
  9. def X(l,n,s,b,E,C,L=0,W=0):
  10. v=U=0
  11. while(k:=N(l))or v==0:
  12. if(O(k,n,E)in[')',']'])^1:
  13. if k in'+-*/^':
  14. if v==0:O(1,n,E,-2,3)
  15. V,l=X(l,n,s,b,E,C)
  16. 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)
  17. v=V;U=1
  18. elif(','!=k)*U:O(0,n,E,-2,3)
  19. elif','==k:l=iter([k,*l])
  20. if'for'==k:
  21. if L:E(F(6,n))
  22. v=C(iter([k,*l]),n,s,b,E);U=1
  23. elif'('==k:v,l=X(l,n,s,b,E,C);O(N(l),n,E,')',2);U=1
  24. elif k.isalpha():
  25. if k in G:
  26. V,l=X(l,n,s,b,E,C,0,1)
  27. if V==0:O(0,n,E)
  28. if-1!=G[k][0]!=V:O(1,n,E,-2,4)
  29. v=G[k][1];U=1
  30. else:
  31. if~-(k in b[s]):O(1,n,E,-2,1)
  32. v=b[s][k]
  33. U=1
  34. elif k.isdigit():v=U=1
  35. elif'['==k:
  36. L=[]
  37. while 1:
  38. V,l=X(l,n,s,b,E,C)
  39. if V:
  40. L+=V,
  41. if(k:=N(l))==']':v=L;break
  42. O(k,n,E,',',3)
  43. else:O(O(N(l),n,E),n,E,']',3);break
  44. if(_:=len(Y:=set(map(str,L))))-1:
  45. if _>1:E(F(4,n))
  46. v=[2]+[[],[-1]][[]<L]
  47. else:v=[2,eval([*Y][0])]
  48. U=1
  49. else:break
  50. if U*W:break
  51. else:l=iter([k,*l]);break
  52. return v,l
  53. def p(l,n,s,b,E):
  54. k=N(l)
  55. if'let'==k:
  56. if O(k:=N(l),n,E).isalpha():
  57. if(I:=k in b[s]):E(F(5,n))
  58. O(x:=N(l),n,E);O(x,n,E,'=',3);V,l=X(l,n,s,b,E,p)
  59. if~-I*V:b[s][k]=V
  60. else:E(F(0,n))
  61. elif'for'==k:
  62. 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)
  63. if x in b[s]:E(F(5,n))
  64. V,l=X(l,n,s,b,E,p);O(V,n,E);O(N(l),n,E,')',2)
  65. if V*0==0:E(F(4,n))
  66. 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
  67. elif k in G:X(iter([k,*l]),n,s,b,E,p)
  68. def D(l):
  69. b,E={(0,):{}},[]
  70. for i,a in enumerate(filter(bool,l.split('\n')),1):
  71. try:
  72. r=[]
  73. while a:r+=[j:=re.search('\w+|\(|\)|\=|\+|\-|\*|/|\^|\[|\]|,|\s+|\W+',a).group()];a=a[len(j):]
  74. p(filter(str.strip,r),i,(0,),b,E.append)
  75. except:1
  76. return E
  77.  
  78. SRC="""let bb8 = 0
  79. let bbEight = lst
  80.  
  81. for (x in
  82. let x = 5*/5
  83. let y = 4
  84. let z = [5, 6] + y
  85. let y = [[4]] + [y]
  86. for (x in [[y, y+1], 5]) for (y in x)"""
  87. print(D(SRC))
Success #stdin #stdout 0.15s 15400KB
stdin
Standard input is empty
stdout
['Invalid identifier on line 1', 'Undefined identifier on line 2', 'Unexpected EOL on line 3', 'Unexpected token on line 4', 'Improper type on line 6', 'Multiple assignment on line 7', 'Improper type on line 7', 'Improper type on line 8', 'Nested for loop on line 8', 'Improper type on line 8', 'Unexpected EOL on line 8']