%%
-[ \t\r\n] { /* whitespace is insignificant */ }
-#.*[\r\n] { /* skip line comments */ }
+"\r\n" { yylineno++; }
+"\n" { yylineno++; }
+#.*[\r\n] { yylineno++; }
+[ \t] { /* whitespace is insignificant */ }
"require" { return T_REQUIRES; }
"provide" { return T_PROVIDES; }
}
<<EOF>> { return T_END_FILE; }
-
. { return T_ERROR; }
%%
-void gettoken(Parser* ctx, Tok* tok) {
- tok->type = yylex();
- if (tok->type != T_END_FILE)
- memcpy(&(tok->value), &Value, sizeof(Value));
+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));
}
/* Driver Modes
*****************************************************************************/
static int emit_tokens(void) {
- Tok token = { 0 };
Parser ctx = { .input = stdin };
while (1) {
- gettoken(&ctx, &token);
- if (token.type == T_END_FILE)
+ gettoken(&ctx);
+ if (ctx.tok.type == T_END_FILE)
break;
else
- pprint_token(stdout, &token, true);
+ pprint_token(stdout, &(ctx.tok), true);
}
return 0;
}
*****************************************************************************/
static Tok* peek(Parser* p) {
if (T_NONE == p->tok.type)
- gettoken(p, &(p->tok));
+ gettoken(p);
return &(p->tok);
}
T_PACKAGE, T_REQUIRES, T_PROVIDES, T_LET, T_VAR, T_FUN, T_TYPE, T_STRUCT,
T_UNION,
T_ID, T_CHAR, T_INT, T_FLOAT, T_BOOL, T_STRING,
-// T_LBRACE, T_RBRACE, T_LBRACK, T_RBRACK, T_LPAR, T_RPAR, T_COMMA, T_SQUOTE,
-// T_DQUOTE, T_COLON, T_AMP, T_IF, T_ELSE, T_ASSIGN, T_SEMI, T_MUL
} TokType;
typedef struct {
SymTable syms;
} Parser;
-void gettoken(Parser* ctx, Tok* tok);
+void gettoken(Parser* ctx);
AST* toplevel(Parser* p);
void codegen_init(Parser* p);