Skip to content

Instantly share code, notes, and snippets.

@eklitzke
Created March 21, 2020 19:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eklitzke/9a631d281dc6364ef7cf009b768cc6ec to your computer and use it in GitHub Desktop.
Save eklitzke/9a631d281dc6364ef7cf009b768cc6ec to your computer and use it in GitHub Desktop.
%%{
machine Lexer;
main := |*
'(' => {
CAPTURE_TOKEN_TYPE(Open);
fbreak;
};
')' => {
CAPTURE_TOKEN_TYPE(Close);
fbreak;
};
';' [^\n]* => {
CAPTURE_TOKEN(Comment);
fbreak;
};
"nil" => {
CAPTURE_TOKEN_TYPE(Nil);
fbreak;
};
'"' ([^"] | '\\"')* '"' => {
CAPTURE_TOKEN_TYPE(String);
size_t len = static_cast<size_t>(te - ts) - 2;
if (Unescape(std::string_view{ts + 1, len}, &tok.value)) {
tok.type = TokenType::Error;
tok.value = "Invalid string escape sequence";
}
fbreak;
};
['`,@#~.[\]] => {
CAPTURE_TOKEN(Punct);
fbreak;
};
('+' | '-')? digit+ => {
CAPTURE_TOKEN(Int);
fbreak;
};
('+' | '-')? digit+ '.' digit* => {
CAPTURE_TOKEN(Float);
fbreak;
};
(alpha | digit | '-' | [+~:?!/]) * => {
CAPTURE_TOKEN(Sym);
fbreak;
};
space+;
*|;
}%%
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment