diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/cmd.src/cmdlex.l | |
| download | sdcc-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.l | 182 |
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; +} |
