12 %define INHERIT : public cl_base
14 %define MEMBERS class cl_ucsim_lexer *lexer_object;\
15 virtual ~YY_cl_ucsim_parser_CLASS(void) { delete lexer_object; }
17 %define CONSTRUCTOR_PARAM \
18 class cl_ucsim_lexer *the_lexer
20 %define CONSTRUCTOR_CODE \
21 lexer_object= the_lexer;
23 %token PTOK_PLUS PTOK_MINUS PTOK_ASTERIX PTOK_SLASH PTOK_EQUAL
24 %token PTOK_LEFT_PAREN PTOK_RIGHT_PAREN
25 %token PTOK_LEFT_BRACKET PTOK_RIGHT_BRACKET
26 %token PTOK_DOT PTOK_AMPERSAND
28 %token <memory_object> PTOK_MEMORY_OBJECT
29 %token <memory> PTOK_MEMORY
30 %token <number> PTOK_NUMBER
34 %left PTOK_MINUS PTOK_PLUS
35 %left PTOK_ASTERIX PTOK_SLASH
36 %nonassoc UNARYMINUS PTOK_AMPERSAND
37 %nonassoc PTOK_LEFT_PAREN PTOK_RIGHT_PAREN
39 %type <number> ucsim_grammar assignment expression address_of_expression
45 class cl_memory *memory_object;
47 class cl_memory *memory;
51 class cl_memory *memory;
52 long mem_address, bit_address;
60 expression { application->dd_printf("%d\n", $1); }
64 memory PTOK_EQUAL expression
66 $1.memory->write($1.address, $3);
69 | bit PTOK_EQUAL expression
73 $1.memory->write($1.mem_address,
74 $1.memory->read($1.mem_address) | $1.mask);
79 $1.memory->write($1.mem_address,
80 $1.memory->read($1.mem_address) & ~($1.mask));
87 assignment { $$= $1; }
88 | expression PTOK_PLUS expression { $$= $1 + $3; }
89 | expression PTOK_MINUS expression { $$= $1 - $3; }
90 | expression PTOK_ASTERIX expression { $$= $1 * $3; }
91 | expression PTOK_SLASH expression
94 yyerror("Divide by zero");
98 | PTOK_MINUS expression %prec UNARYMINUS { $$= -$2; }
99 | address_of_expression { $$= $1; }
100 | PTOK_LEFT_PAREN expression PTOK_RIGHT_PAREN { $$= $2; }
101 | PTOK_NUMBER { $$= $1; }
102 | memory { $$= $1.memory->read($1.address); }
103 | bit { $$= ($1.memory->read($1.mem_address) & $1.mask)?1:0; }
106 address_of_expression:
107 PTOK_AMPERSAND memory { $$= $2.address; }
113 yyerror("Bit has no address.");
121 | PTOK_MEMORY_OBJECT PTOK_LEFT_BRACKET expression PTOK_RIGHT_BRACKET
129 | memory PTOK_DOT expression
131 $$.memory= $1.memory;
132 $$.mem_address= $1.address;
135 class cl_uc *uc= application->get_uc();
137 $$.bit_address= uc->bit_address($1.memory, $1.address, $3);
144 YY_cl_ucsim_parser_CLASS::yylex(YY_cl_ucsim_parser_STYPE *yylval)
146 lexer_object->activate_lexer_to_parse_into(yylval);
147 return(lexer_object->yylex());
151 YY_cl_ucsim_parser_CLASS::yyerror(char *msg)
153 application->dd_printf("Parser error: %s\n", msg);