aboutsummaryrefslogtreecommitdiffstats
path: root/sources/api/lexyacc/smc.l
diff options
context:
space:
mode:
Diffstat (limited to 'sources/api/lexyacc/smc.l')
-rw-r--r--sources/api/lexyacc/smc.l77
1 files changed, 77 insertions, 0 deletions
diff --git a/sources/api/lexyacc/smc.l b/sources/api/lexyacc/smc.l
new file mode 100644
index 0000000..4d9e478
--- /dev/null
+++ b/sources/api/lexyacc/smc.l
@@ -0,0 +1,77 @@
+%{
+ #include <stdlib.h>
+ #include "instruction.h"
+ #include "y.tab.h"
+%}
+
+%%
+
+"//"[^\n]* ; /* Skip comments */
+[%\t ]+ ; /* Skip whitespace */
+
+0x[0-9a-f]+ {
+ yylval.lit = yytext+2;
+ return HEX_NUMBER;
+ }
+
+[0-9]+ {
+ yylval.num = atoi(yytext);
+ return DEC_NUMBER;
+ }
+
+r[0-9][0-9]? {
+ yylval.num = atoi(++yytext); /* Skip the first character? */
+ return REG_ID;
+ }
+
+"wait"|"WAIT" return WAIT;
+
+"add"|"ADD" return ADD;
+"addi"|"ADDI" return ADDI;
+"sub"|"SUB" return SUB;
+"subi"|"SUBI" return SUBI;
+"mov"|"MOV" return MOV;
+"src"|"SRC" return SRC;
+"li"|"LI" return LI;
+"ldwd"|"LDWD" return LDWD;
+
+"bl"|"BL" return BRL;
+"beq"|"beq" return BREQ;
+"jmp"|"JMP" return JMP;
+
+"wr"|"WR" return WR;
+"rd"|"RD" return RD;
+"act"|"ACT" return ACT;
+"pre"|"PRE" return PRE;
+"ref"|"REF" return REF;
+"zq"|"ZQ" return ZQ;
+"end"|"END" return END;
+
+
+"++" return INCREMENT;
+"AP"|"ap" return AUTO_PRECHARGE;
+"BC"|"bc" return BURST_CHOP;
+"PA"|"pa" return PRECHARGE_ALL;
+
+"times" return GENFOR;
+"ENDPROGRAM" return ENDPROGRAM;
+
+ [a-z_]+ {
+ char* var_name = (char*) malloc((yyleng+1)*sizeof(char));
+ strcpy(var_name, yytext);
+ yylval.lit = var_name;
+ return VARIABLE;
+ }
+
+ [A-Z_]+ {
+ char* lbl_name = (char*) malloc((yyleng+1)*sizeof(char));
+ strcpy(lbl_name, yytext);
+ yylval.lit = lbl_name;
+ return LABEL;
+ }
+
+ . return *yytext;
+
+%%
+
+int yywrap(void) { return 1; }