Есть такой код на Haskell:
import Data.Char
isAtom :: String -> Bool
isAtom word = all isAlpha word
token :: String -> String
token word
| word `elem` ["+", "-", "/", "*", "%"] = "operator"
| word == "(" = "lbracket"
| word == ")" = "rbracket"
| (c1 == '"') && (c2 == '"') = "string"
| isAtom word = "atom"
where
c1 = head word
c2 = last word
Вообще это должен быть интерпретатор лиспоподобных арифметических выражений. Собственно, все типы лексем распознавать научился, кроме чисел. Пока в голову приходят два варианта, оба не нравятся: либо пытаться применить
read word :: Float
и ловить исключение, либо перебирать все символы строки и проверять, являются ли они цифрами. Второй вариант был бы хорош, если бы не дробные числа -- можно было бы написать просто
all isDigit word
. Может есть какой-нибудь более простой и очевидный способ это сделать?
P. S. На выходе программа должна интерпретировать выражения вида
(+ 1 (* 5 4 (/ 4 2)) 3)
. Уже написал такое на Python, теперь просто переписываю то же на Haskell, чтобы немного набить руку перед тем как писать полноценный интерпретатор по "Write your Scheme in 48 hours"