aboutsummaryrefslogtreecommitdiff
path: root/tasm/src/lexer.l
diff options
context:
space:
mode:
Diffstat (limited to 'tasm/src/lexer.l')
-rw-r--r--tasm/src/lexer.l237
1 files changed, 237 insertions, 0 deletions
diff --git a/tasm/src/lexer.l b/tasm/src/lexer.l
new file mode 100644
index 0000000..01a4bee
--- /dev/null
+++ b/tasm/src/lexer.l
@@ -0,0 +1,237 @@
+/* SPDX-License-Identifier: copyleft-next-0.3.1 */
+/* Copyright 2023 Kim Kuparinen < kimi.h.kuparinen@gmail.com > */
+
+%option reentrant noyywrap nounput noinput nodefault
+%{
+#define FROM_LEXER
+#include <tasm/parser.h>
+
+static void update_yylloc(struct parser *parser, YYLTYPE *lloc, const char *text)
+{
+ (void)parser;
+
+ lloc->first_line = lloc->last_line;
+ lloc->first_column = lloc->last_column;
+
+ for (size_t i = 0; text[i] != 0; ++i) {
+ if (text[i] == '\n') {
+ lloc->last_line++;
+ /* flex uses 1 based indexing */
+ lloc->last_column = 1;
+ } else {
+ lloc->last_column++;
+ }
+ }
+}
+
+#define YY_USER_ACTION update_yylloc(parser, yylloc, yytext);
+%}
+
+%x SC_COMMENT
+
+id [_a-zA-Z][_a-zA-Z0-9]*
+label {id}[[:space:]]*:
+
+dec -?[0-9]+
+tri 0t[01i]+
+hept 0h[0-9A-HKMNPRTVXZa-hkmnprtvxz]+
+imm {tri}|{hept}|{dec}
+
+str \"(\\.|[^"\\])*\"
+
+%%
+
+{label} {
+ /* strip trailing ':' */
+ char *s = yytext + strlen(yytext);
+ s[-1] = '\0';
+
+ yylval->str = yytext;
+ return label;
+}
+
+{imm} {
+ yylval->tri = parse_imm(yytext);
+ return imm;
+}
+
+{str} {
+ /* strip leading and trailing " */
+ char *s = yytext + strlen(yytext);
+ s[-1] = '\0';
+
+ yylval->str = yytext + 1;
+ return str;
+}
+
+".set" {return set;}
+".include" {return include;}
+
+"x0" {return x0;}
+"x1" {return x1;}
+"x2" {return x2;}
+"x3" {return x3;}
+"x4" {return x4;}
+"x5" {return x5;}
+"x6" {return x6;}
+"x7" {return x7;}
+"x8" {return x8;}
+"x9" {return x9;}
+"x10" {return x10;}
+"x11" {return x11;}
+"x12" {return x12;}
+"x13" {return x13;}
+"x14" {return x14;}
+"x15" {return x15;}
+"x16" {return x16;}
+"x17" {return x17;}
+"x18" {return x18;}
+"x19" {return x19;}
+"x20" {return x20;}
+"x21" {return x21;}
+"x22" {return x22;}
+"x23" {return x23;}
+"x24" {return x24;}
+"x25" {return x25;}
+"x26" {return x26;}
+"x27" {return x27;}
+"x28" {return x28;}
+"x29" {return x29;}
+"x30" {return x30;}
+"x31" {return x31;}
+"x32" {return x32;}
+"x33" {return x33;}
+"x34" {return x34;}
+"x35" {return x35;}
+"x36" {return x36;}
+"x37" {return x37;}
+"x38" {return x38;}
+"x39" {return x39;}
+"x40" {return x40;}
+"x41" {return x41;}
+"x42" {return x42;}
+"x43" {return x43;}
+"x44" {return x44;}
+"x45" {return x45;}
+"x46" {return x46;}
+"x47" {return x47;}
+"x48" {return x48;}
+"x49" {return x49;}
+"x50" {return x50;}
+"x51" {return x51;}
+"x52" {return x52;}
+"x53" {return x53;}
+"x54" {return x54;}
+"x55" {return x55;}
+"x56" {return x56;}
+"x57" {return x57;}
+"x58" {return x58;}
+"x59" {return x59;}
+"x60" {return x60;}
+"x61" {return x61;}
+"x62" {return x62;}
+"x63" {return x63;}
+"x64" {return x64;}
+"x65" {return x65;}
+"x66" {return x66;}
+"x67" {return x67;}
+"x68" {return x68;}
+"x69" {return x69;}
+"x70" {return x70;}
+"x71" {return x71;}
+"x72" {return x72;}
+"x73" {return x73;}
+"x74" {return x74;}
+"x75" {return x75;}
+"x76" {return x76;}
+"x77" {return x77;}
+"x78" {return x78;}
+"x79" {return x79;}
+"x80" {return x80;}
+
+"addi" {return addi; /* i */}
+"slti" {return slti;}
+"sgei" {return sgei;}
+"seqi" {return seqi;}
+"snei" {return snei;}
+"unop" {return unop;}
+"diop" {return diop;}
+"slli" {return slli;}
+"srli" {return srli;}
+"sll" {return sll;}
+"srl" {return srl;}
+"add" {return add;}
+"sub" {return sub;}
+"slt" {return slt;}
+"sge" {return sge;}
+"seq" {return seq;}
+"sne" {return sne;}
+"lui" {return lui;}
+"auipc" {return auipc;}
+"jal" {return jal;}
+"jalr" {return jalr;}
+"beq" {return beq;}
+"bne" {return bne;}
+"blt" {return blt;}
+"bge" {return bge;}
+"ld" {return ld;}
+"st" {return st;}
+"ecall" {return ecall;}
+"ebreak" {return ebreak;}
+"pcall" {return pcall;}
+"fence" {return fence;}
+"nop" {return nop; /* meta */}
+"li" {return li;}
+"la" {return la;}
+
+"mul" {return mul; /* m */}
+"div" {return diV;}
+"rem" {return rem;}
+
+"stt" {return stt; /* a */}
+"cst" {return cst;}
+"ent" {return ent;}
+"cat" {return cat;}
+
+"csrrw" {return csrrw; /* Zcsr */}
+"csrrs" {return csrrs;}
+"csrrc" {return csrrc;}
+
+"//".* {/* skip line comments */}
+
+"/*" {BEGIN(SC_COMMENT);}
+<SC_COMMENT>{
+ "/*" {++parser->comment_nesting;}
+ "*"+"/" {
+ if (parser->comment_nesting)
+ --parser->comment_nesting;
+ else
+ BEGIN(INITIAL);
+ }
+
+ "*"+ {}
+ [^/*\n]+ {}
+ [/] {}
+ \n {}
+}
+
+{id} {
+ yylval->str = yytext;
+ return id;
+}
+
+"(" {return LPAREN;}
+")" {return RPAREN;}
+"," {return COMMA;}
+
+[[:space:]]+ {/* skip whitespace */}
+
+. {
+ struct src_issue issue;
+ issue.loc = to_src_loc(yylloc);
+ issue.fctx.fbuf = parser->buf;
+ issue.fctx.fname = parser->fname;
+ src_issue(issue, "unexpected token: %s", yytext);
+ parser->failed = true;
+}
+%%