summaryrefslogtreecommitdiff
path: root/sim/ucsim/cmd.src/cmdlex.l
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/cmd.src/cmdlex.l
downloadsdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sim/ucsim/cmd.src/cmdlex.l')
-rw-r--r--sim/ucsim/cmd.src/cmdlex.l182
1 files changed, 182 insertions, 0 deletions
diff --git a/sim/ucsim/cmd.src/cmdlex.l b/sim/ucsim/cmd.src/cmdlex.l
new file mode 100644
index 0000000..0f4a558
--- /dev/null
+++ b/sim/ucsim/cmd.src/cmdlex.l
@@ -0,0 +1,182 @@
+%{
+#include <stdio.h>
+//#include <stdint.h>
+#include "cmdlexcl.h"
+#include "cmdpars.hh"
+
+static int uc_yy_check_id(char *token);
+static int uc_yy_input(char *buf, int max_size);
+#define YY_INPUT(buf,result,max_size) result = uc_yy_input(buf, max_size)
+%}
+
+%option nounput
+
+%%
+
+[ \t]* ;
+
+"int" return(PTOK_INT);
+"*=" return(PTOK_MUL_ASSIGN);
+"/=" return(PTOK_DIV_ASSIGN);
+"%=" return(PTOK_MOD_ASSIGN);
+"+=" return(PTOK_ADD_ASSIGN);
+"-=" return(PTOK_SUB_ASSIGN);
+"<<=" return(PTOK_LEFT_ASSIGN);
+">>=" return(PTOK_RIGHT_ASSIGN);
+"&=" return(PTOK_AND_ASSIGN);
+"^=" return(PTOK_XOR_ASSIGN);
+"|=" return(PTOK_OR_ASSIGN);
+"&&" return(PTOK_AND_OP);
+"||" return(PTOK_OR_OP);
+"++" return(PTOK_INC_OP);
+"--" return(PTOK_DEC_OP);
+"==" return(PTOK_EQ_OP);
+"!=" return(PTOK_NE_OP);
+">=" return(PTOK_GE_OP);
+"<=" return(PTOK_LE_OP);
+">>" return(PTOK_RIGHT_OP);
+"<<" return(PTOK_LEFT_OP);
+"+" return(PTOK_PLUS);
+"-" return(PTOK_MINUS);
+"*" return(PTOK_ASTERIX);
+"/" return(PTOK_SLASH);
+"(" return(PTOK_LEFT_PAREN);
+")" return(PTOK_RIGHT_PAREN);
+"[" return(PTOK_LEFT_BRACKET);
+"]" return(PTOK_RIGHT_BRACKET);
+"=" return(PTOK_EQUAL);
+"." return(PTOK_DOT);
+"&" return(PTOK_AMPERSAND);
+"|" return(PTOK_PIPE);
+"^" return(PTOK_CIRCUM);
+"%" return(PTOK_PERCENT);
+"~" return(PTOK_TILDE);
+"?" return(PTOK_QUESTION);
+":" return(PTOK_COLON);
+"<" return(PTOK_LESS);
+">" return(PTOK_GREATHER);
+"!" return(PTOK_EXCLAMATION);
+"," return(PTOK_COMMA);
+
+([0-9]+)|(0x[0-9a-fA-F]+) {
+ //printf("\nlexer found a nr: %s\n",yytext);
+ yylval.number = strtol(yytext, 0, 0);
+ return PTOK_NUMBER;
+}
+
+0b[01]+ {
+ yylval.number = 0;
+ for (int i= 2; yytext[i]; i++)
+ yylval.number = (yylval.number << 1) | (yytext[i] == '0' ? 0 : 1);
+ return PTOK_NUMBER;
+}
+
+[a-zA-Z_][0-9a-zA-Z_]* return(uc_yy_check_id(yytext));
+
+. return(yytext[0]);
+
+%%
+
+int
+yywrap()
+{
+ return 1;
+}
+
+#include "globals.h"
+static char *string_to_parse = NULL;
+
+void
+uc_yy_set_string_to_parse(const char *str)
+{
+ string_to_parse = strdup(str);
+ //YY_FLUSH_BUFFER;
+ yy_flush_buffer(YY_CURRENT_BUFFER);
+}
+
+static const char *string_ptr = NULL;
+
+void
+uc_yy_free_string_to_parse()
+{
+ free(string_to_parse);
+ string_ptr=NULL;
+}
+
+static int
+uc_yy_input(char *buf, int max_size)
+{
+ //printf("\nuc_yy_input called for max=%d\n",max_size);
+ if (NULL == string_ptr)
+ {
+ string_ptr = string_to_parse;
+ //printf("\nstring_ptr is NULL, start over with %s\n",string_to_parse);
+ }
+ else
+ {
+ //printf("\ncontinue with %s\n",string_ptr);
+ }
+
+ if (NULL != string_ptr)
+ {
+ int lrem = strlen(string_ptr);
+ int n = max_size;
+ if (lrem < max_size)
+ n = lrem;
+ strncpy(buf, string_ptr, n);
+ string_ptr += n;
+ //printf("\n%d chars copied, left=%s\n",n,string_ptr);
+ return n;
+ }
+ else
+ return 0;
+}
+
+static int
+uc_yy_check_id(char *token)
+{
+ class cl_uc *uc= application->get_uc();
+ //printf("checking id=\"%s\"\n",token);
+
+ if (uc)
+ {
+ class cl_memory *mem = uc->memory(token);
+ if (mem)
+ {
+ yylval.memory_object = mem;
+ return PTOK_MEMORY_OBJECT;
+ }
+
+ t_addr addr;
+ class cl_address_space *as;
+ bool found;
+ if ((found= uc->symbol2address(yytext, &as, &addr)))
+ {
+ yylval.memory.memory= as;
+ yylval.memory.address= addr;
+ return PTOK_MEMORY;
+ }
+ /*
+ else if ((found= uc->symbol2address(yytext, uc->sfr_tbl(), &addr)))
+ {
+ //yylval.number= addr; return PTOK_NUMBER;
+ yylval.memory.memory = uc->address_space(MEM_SFR_ID);
+ yylval.memory.address = addr;
+ return PTOK_MEMORY;
+ }
+ */
+ //found= uc->symbol2address(yytext, uc->bit_tbl(), &addr);
+ if (found)
+ {
+ t_addr memaddr;
+ t_mem mask;
+ yylval.bit.memory= uc->bit2mem(addr, &memaddr, &mask);
+ yylval.bit.mem_address = memaddr;
+ yylval.bit.bit_address = addr;
+ yylval.bit.mask = mask;
+ return PTOK_BIT;
+ }
+ }
+
+ return 0;
+}