| |
oziphantom
Registered: Oct 2014 Posts: 490 |
Anybody know Bison/Yacc?
I want to extend the VICE monitor to be able to look up an address in a "bank" on a break.. so something like
break $1234 IF @IO:D010 & $40 = $40 where @IO:D010 looks up the VIC register D010 and get its value.
CMD_BANK BANKNAME end_cmd
{ mon_bank(e_default_space, $2); } seems to be the C you can use to change the banks
int monbank = mon_interfaces[mem]->current_bank;/code] seems like it would allow you to save the current bank. And
MEMSPACE src_mem = addr_memspace(start_addr);
WORD start = addr_location(start_addr);
byte1 = mon_get_mem_val(src_mem, start)); could be used to look up the value, its just a matter of putting it all together in a yacc file to glue it together and make it work as part of the condition_expression, so if somebody could help me with the yacc modifications I would greatly appreciate it ;)
For completeness it probably needs to be C: only and making it take the form @C:(bank):Addr to make it clear might be best.. |
|
... 10 posts hidden. Click here to view all posts.... |
| |
knue
Registered: Dec 2012 Posts: 37 |
So these are the important bits in the mon_lex.l:
%{
if (new_cmd) {
if (!(asm_mode && opt_asm)) {
last_len = cur_len = 0;
}
if (asm_mode) {
BEGIN (ASM_MODE);
opt_asm = 0;
} else {
BEGIN (CMD);
}
new_cmd = 0;
}
%}
<CMD>{
//...
bank { BEGIN(BNAME); return CMD_BANK; }
//...
}
//...
<BNAME>[_a-zA-Z0-9]* { yylval.str = lib_stralloc(yytext); return BANKNAME; }
So, lex is more powerful than just simple regular expressions. Additionally, you can define states. Simple example would be nested comments. Sth you couldn't do with straight regular expressions. Those <FOO> are the states. Read the code as follows:
When we are about to lex a new command that is *not* in asm_mode we begin CMD state.
Then, *only* if we are in CMD mode, lexing 'bank' starts BNAME mode. And only *then* we lex any string as BANKNAME. So this is the only occasion where yacc actually sees the BANKNAME token.
What we would have to do is to add a lex rule which additionally lexes a string as BANKNAME. A simple rule like:
§[_a-zA-Z0-9]* { yylval.str = lib_stralloc(yytext); return BANKNAME; }
would do the trick. Then, §io would be a BANKNAME token. BTW you can also change the parser to just recognize:
BANKAME ':' number
or even just
BANKNAME number
instead of
'@' BANKNAME ':' number
because '§' is now part of the BANKNAME token. |
| |
oziphantom
Registered: Oct 2014 Posts: 490 |
add '§' to the bankname would be bad, as then the char* to bank number functions won't recognise the string, it won't match.. doing a straight ++ on it to skip a char is kind of evil and will probably fail on some system somewhere.
SO I just put [_a-zA-Z0-0]* {yylval.str= lib_stralloc(yytext); return BANKNAME; } at the bottom of <COND_MODE>{ AND IT WORKS!!!
now onwards to getting labels to work :) |
| |
oziphantom
Registered: Oct 2014 Posts: 490 |
and now labels work |
| |
knue
Registered: Dec 2012 Posts: 37 |
ah, there is even a COND_MODE. I missed that. Sort of bad to work with that many states in the lexer. Would be better to have that logic in the parser... |
| |
Count Zero
Registered: Jan 2003 Posts: 1932 |
How is this progressing? Patch upcoming for "upstream"? :) |
Previous - 1 | 2 - Next |