Zadanie polega na stworzeniu analizatora leksykalnego (skanera) dla prostego języka umożliwiającego obliczenia na macierzach. Analizator leksykalny powinien rozpoznawać następujące leksemy:
if
, else
, for
, while
break
, continue
oraz return
eye
, zeros
oraz ones
print
Przykład.
Dla następującego kodu:
A = zeros(5); # create 5x5 matrix filled with zeros B = ones(7); # create 7x7 matrix filled with ones I = eye(10); # create 10x10 matrix filled with ones on diagonal and zeros elsewhere D1 = A.+B' ; # add element-wise A with transpose of B D2 -= A.-B' ; # substract element-wise A with transpose of B D3 *= A.*B' ; # multiply element-wise A with transpose of B D4 /= A./B' ; # divide element-wise A with transpose of Banalizator leksykalny powinien zwracać następującą sekwencję i wypisywać ją na standardowym wyjściu:
(1): ID(A) (1): =(=) (1): ZEROS(zeros) (1): ((() (1): INTNUM(5) (1): )()) (1): ;(;) (2): ID(B) (2): =(=) (2): ONES(ones) (2): ((() (2): INTNUM(7) (2): )()) (2): ;(;) (3): ID(I) (3): =(=) (3): EYE(eye) (3): ((() (3): INTNUM(10) (3): )()) (3): ;(;) (4): ID(D1) (4): =(=) (4): ID(A) (4): DOTADD(.+) (4): ID(B) (4): '(') (4): ;(;) (5): ID(D2) (5): SUBASSIGN(-=) (5): ID(A) (5): DOTSUB(.-) (5): ID(B) (5): '(') (5): ;(;) (6): ID(D3) (6): MULASSIGN(*=) (6): ID(A) (6): DOTMUL(.*) (6): ID(B) (6): '(') (6): ;(;) (7): ID(D4) (7): DIVASSIGN(/=) (7): ID(A) (7): DOTDIV(./) (7): ID(B) (7): '(') (7): ;(;)
SLY
lub PLY
.