Log inRegister an accountBrowse CSDbHelp & documentationFacts & StatisticsThe forumsAvailable RSS-feeds on CSDbSupport CSDb Commodore 64 Scene Database
You are not logged in - nap
CSDb User Forums


Forums > C64 Coding > Anybody know Bison/Yacc?
2017-07-23 13:25
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....
 
2017-07-30 11:35
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.
2017-07-31 08:54
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 :)
2017-07-31 10:04
oziphantom

Registered: Oct 2014
Posts: 490
and now labels work
2017-07-31 13:21
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...
2017-08-17 19:13
Count Zero

Registered: Jan 2003
Posts: 1932
How is this progressing? Patch upcoming for "upstream"? :)
Previous - 1 | 2 - Next
RefreshSubscribe to this thread:

You need to be logged in to post in the forum.

Search the forum:
Search   for   in  
All times are CET.
Search CSDb
Advanced
Users Online
csabanw
Guests online: 103
Top Demos
1 Next Level  (9.7)
2 13:37  (9.7)
3 Mojo  (9.7)
4 Coma Light 13  (9.6)
5 Edge of Disgrace  (9.6)
6 What Is The Matrix 2  (9.6)
7 The Demo Coder  (9.6)
8 Uncensored  (9.6)
9 Comaland 100%  (9.6)
10 Wonderland XIV  (9.6)
Top onefile Demos
1 No Listen  (9.6)
2 Layers  (9.6)
3 Cubic Dream  (9.6)
4 Party Elk 2  (9.6)
5 Copper Booze  (9.6)
6 Dawnfall V1.1  (9.5)
7 Rainbow Connection  (9.5)
8 Onscreen 5k  (9.5)
9 Morph  (9.5)
10 Libertongo  (9.5)
Top Groups
1 Performers  (9.3)
2 Booze Design  (9.3)
3 Oxyron  (9.3)
4 Triad  (9.3)
5 Censor Design  (9.3)
Top Graphicians
1 Mirage  (9.8)
2 Archmage  (9.7)
3 Pal  (9.6)
4 Carrion  (9.6)
5 Sulevi  (9.6)

Home - Disclaimer
Copyright © No Name 2001-2024
Page generated in: 0.338 sec.