isIdentChar c = isAlphanum c || c == '_'
lexOp s tv = list (fromString s) >>| pure tv
lexKw kw tv = lexOp kw tv <* check (not o isIdentChar) >>| pure tv
isIdentChar c = isAlphanum c || c == '_'
lexOp s tv = list (fromString s) >>| pure tv
lexKw kw tv = lexOp kw tv <* check (not o isIdentChar) >>| pure tv