+++ /dev/null
-%{
-#include <sclpl.h>
-
-static union {
- char* text;
- long long integer;
- double floating;
-} Value;
-
-static char* dupstring(const char* old) {
- size_t length = strlen(old);
- char* str = emalloc(length+1);
- memcpy(str, old, length);
- str[length] = '\0';
- return str;
-}
-
-%}
-
-DIGIT [0-9]
-ALPHA [a-zA_Z]
-ALPHA_ [a-zA_Z_]
-ALNUM_ [a-zA-Z0-9_]
-SPACE [ \t\r\n]
-NOSPACE [^ \t\r\n]
-
-%option noyywrap
-
-%%
-
-"\r\n" { yylineno++; }
-"\n" { yylineno++; }
-#.*[\r\n] { yylineno++; }
-[ \t] { /* whitespace is insignificant */ }
-
-"require" { return T_REQUIRES; }
-"provide" { return T_PROVIDES; }
-"let" { return T_LET; }
-"var" { return T_VAR; }
-"fun" { return T_FUN; }
-"type" { return T_TYPE; }
-"struct" { return T_STRUCT; }
-"union" { return T_UNION; }
-"return" { return T_RETURN; }
-"if" { return T_IF; }
-"else" { return T_ELSE; }
-
-"(" { return '('; }
-")" { return ')'; }
-"[" { return '['; }
-"]" { return ']'; }
-"{" { return '{'; }
-"}" { return '}'; }
-"." { return '.'; }
-"," { return ','; }
-"'" { return '\''; }
-":" { return ':'; }
-"&" { return '&'; }
-"=" { return '='; }
-";" { return ';'; }
-"*" { return '*'; }
-
-\\. { Value.integer = yytext[1]; return T_CHAR; }
-\\space { Value.integer = ' '; return T_CHAR; }
-\\newline { Value.integer = '\n'; return T_CHAR; }
-\\return { Value.integer = '\r'; return T_CHAR; }
-\\tab { Value.integer = '\t'; return T_CHAR; }
-\\vtab { Value.integer = '\v'; return T_CHAR; }
-
-0b[01]+ {
- Value.integer = strtol(&yytext[2], NULL, 2);
- return T_INT;
-}
-
-0o[0-7]+ {
- Value.integer = strtol(&yytext[2], NULL, 8);
- return T_INT;
-}
-
-0d[0-9]+ {
- Value.integer = strtol(&yytext[2], NULL, 10);
- return T_INT;
-}
-
-0h[0-9a-fA-F]+ {
- Value.integer = strtol(&yytext[2], NULL, 16);
- return T_INT;
-}
-
-[+-]?[0-9]+ {
- Value.integer = strtol(&yytext[0], NULL, 10);
- return T_INT;
-}
-
-[+-]?[0-9]+\.[0-9]+(e[+-]?[0-9]+)? {
- Value.floating = strtod(yytext, NULL);
- return T_FLOAT;
-}
-
-\"([^"]|\\\")*\" {
- size_t len = strlen(&yytext[1]);
- Value.text = dupstring(&yytext[1]);
- Value.text[len-1] = '\0';
- return T_STRING;
-}
-
-true {
- Value.integer = 1;
- return T_BOOL;
-}
-
-false {
- Value.integer = 0;
- return T_BOOL;
-}
-
-[a-zA-Z_][a-zA-Z0-9_]* {
- Value.text = dupstring(yytext);
- return T_ID;
-}
-
-<<EOF>> { return T_END_FILE; }
-. { return T_ERROR; }
-
-%%
-
-void gettoken(Parser* ctx) {
- ctx->tok.line = yylineno;
- ctx->tok.type = yylex();
- if (ctx->tok.type != T_END_FILE)
- memcpy(&(ctx->tok.value), &Value, sizeof(Value));
-}