В последнее время я изучаю Haskell и подумал, что лексер может быть интересным проектом. Я использую эту грамматику ANSI C Yacc как Руководство.
Общая структура программы:
lex :: [Char] -> Maybe [Token]
lex s =
case tokenize([], s) of
Just (tokens, []) -> Just tokens
_ -> Nothing
tokenize :: ([Token], [Char]) -> Maybe ([Token], [Char])
Где tokenize
составляет список токенов. Мне сложно придумать подходящую структуру для tokenize
. Например, для соответствия таким ключевым словам, как int
, я мог бы написать:
tokenize (toks, 'i':'n':'t':' ':rest) = tokenize (toks++[TokenKeyword IntK], rest)
Но это кажется ужасным способом делать что-то. Есть ли способ сопоставления шаблонов с элементами в списке? Могу ли я создать список всех ключевых слов и попытаться сопоставить их как префиксы входной строки?