@@ -1194,8 +1194,11 @@ void read_inner_var_decl(var_t *vd, bool anon, bool is_param)
11941194 vd -> init_val = 0 ;
11951195 /* Preserve typedef pointer level - don't reset if already inherited */
11961196
1197- while (lex_accept (T_asterisk ))
1197+ while (lex_accept (T_asterisk )) {
11981198 vd -> ptr_level ++ ;
1199+ /* Skip const after asterisk for now */
1200+ lex_accept (T_const );
1201+ }
11991202
12001203 /* is it function pointer declaration? */
12011204 if (lex_accept (T_open_bracket )) {
@@ -1281,6 +1284,11 @@ void read_inner_var_decl(var_t *vd, bool anon, bool is_param)
12811284/* starting next_token, need to check the type */
12821285void read_full_var_decl (var_t * vd , bool anon , bool is_param )
12831286{
1287+ /* Skip const qualifier if present */
1288+ bool is_const = false;
1289+ if (lex_accept (T_const ))
1290+ is_const = true;
1291+
12841292 char type_name [MAX_TYPE_LEN ];
12851293 int find_type_flag = lex_accept (T_struct ) ? 2 : 1 ;
12861294 if (find_type_flag == 1 && lex_accept (T_union )) {
@@ -1296,6 +1304,8 @@ void read_full_var_decl(var_t *vd, bool anon, bool is_param)
12961304 }
12971305
12981306 vd -> type = type ;
1307+ if (is_const )
1308+ vd -> is_const_qualified = true;
12991309
13001310 read_inner_var_decl (vd , anon , is_param );
13011311}
@@ -1579,8 +1589,37 @@ void handle_single_dereference(block_t *parent, basic_block_t **bb)
15791589 var_t * var = find_var (token , parent );
15801590 lex_expect (T_identifier );
15811591
1582- /* Push the variable onto the stack */
1583- opstack_push (var );
1592+ /* Check for postfix operators on the pointer before dereferencing
1593+ */
1594+ if (lex_peek (T_increment , NULL ) || lex_peek (T_decrement , NULL )) {
1595+ /* Handle p++ or p-- before dereferencing */
1596+ opcode_t postfix_op = lex_accept (T_increment ) ? OP_add : OP_sub ;
1597+
1598+ /* Push original pointer value for dereference */
1599+ var_t * orig_ptr = require_var (parent );
1600+ gen_name_to (orig_ptr -> var_name );
1601+ add_insn (parent , * bb , OP_assign , orig_ptr , var , NULL , 0 , NULL );
1602+
1603+ /* Create increment value (pointer size) */
1604+ var_t * inc_val = require_var (parent );
1605+ gen_name_to (inc_val -> var_name );
1606+ inc_val -> init_val = var -> type ? var -> type -> size : PTR_SIZE ;
1607+ add_insn (parent , * bb , OP_load_constant , inc_val , NULL , NULL , 0 ,
1608+ NULL );
1609+
1610+ /* Increment the pointer */
1611+ var_t * new_ptr = require_var (parent );
1612+ gen_name_to (new_ptr -> var_name );
1613+ add_insn (parent , * bb , postfix_op , new_ptr , var , inc_val , 0 ,
1614+ NULL );
1615+ add_insn (parent , * bb , OP_assign , var , new_ptr , NULL , 0 , NULL );
1616+
1617+ /* Use original pointer value for dereference */
1618+ opstack_push (orig_ptr );
1619+ } else {
1620+ /* Push the variable onto the stack */
1621+ opstack_push (var );
1622+ }
15841623
15851624 /* Apply dereference */
15861625 rs1 = opstack_pop ();
@@ -1834,9 +1873,28 @@ void read_expr_operand(block_t *parent, basic_block_t **bb)
18341873 int cast_ptr_level = 0 ;
18351874
18361875 /* Look ahead to see if we have a typename followed by ) */
1876+ /* Skip const qualifier if present in cast */
1877+ bool has_const_in_cast = false;
1878+ if (lex_peek (T_const , NULL )) {
1879+ has_const_in_cast = true;
1880+ lex_accept (T_const );
1881+ }
1882+
1883+ /* Check for struct/union after const */
1884+ bool is_struct = false;
1885+ bool is_union = false;
1886+ if (lex_peek (T_struct , NULL )) {
1887+ is_struct = true;
1888+ lex_accept (T_struct );
1889+ } else if (lex_peek (T_union , NULL )) {
1890+ is_union = true;
1891+ lex_accept (T_union );
1892+ }
1893+
18371894 if (lex_peek (T_identifier , lookahead_token )) {
18381895 /* Check if it's a basic type or typedef */
1839- type_t * type = find_type (lookahead_token , true);
1896+ int find_flag = (is_struct | is_union ) ? 2 : 1 ;
1897+ type_t * type = find_type (lookahead_token , find_flag );
18401898
18411899 if (type ) {
18421900 /* Save current position to backtrack if needed */
@@ -4368,6 +4426,33 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
43684426 prefix_op = OP_add ;
43694427 else if (lex_accept (T_decrement ))
43704428 prefix_op = OP_sub ;
4429+
4430+ /* Check for parenthesized expression as statement */
4431+ if (lex_peek (T_open_bracket , NULL )) {
4432+ /* This could be a cast or parenthesized expression */
4433+ read_expr (parent , & bb );
4434+ read_ternary_operation (parent , & bb );
4435+
4436+ /* Handle postfix operators if present */
4437+ if (lex_peek (T_increment , NULL ) || lex_peek (T_decrement , NULL )) {
4438+ /* For now, just consume the token to avoid crash */
4439+ /* TODO: Implement proper postfix handling for expressions */
4440+ if (lex_accept (T_increment )) {
4441+ /* Increment - not implemented yet */
4442+ } else if (lex_accept (T_decrement )) {
4443+ /* Decrement - not implemented yet */
4444+ }
4445+ }
4446+
4447+ lex_expect (T_semicolon );
4448+ return bb ;
4449+ }
4450+
4451+ /* Check for const qualifier */
4452+ bool has_const = false;
4453+ if (lex_accept (T_const ))
4454+ has_const = true;
4455+
43714456 /* must be an identifier or asterisk (for pointer dereference) */
43724457 bool has_asterisk = lex_peek (T_asterisk , NULL );
43734458 if (!lex_peek (T_identifier , token ) && !has_asterisk )
@@ -4443,6 +4528,8 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
44434528 if (type ) {
44444529 var = require_typed_var (parent , type );
44454530 read_full_var_decl (var , false, false);
4531+ if (has_const )
4532+ var -> is_const_qualified = true;
44464533 add_insn (parent , bb , OP_allocat , var , NULL , NULL , 0 , NULL );
44474534 add_symbol (bb , var );
44484535 if (lex_accept (T_assign )) {
@@ -5165,6 +5252,11 @@ void read_global_statement(void)
51655252
51665253 lex_expect (T_semicolon );
51675254 } else {
5255+ /* Skip const qualifier if present */
5256+ bool typedef_is_const = false;
5257+ if (lex_accept (T_const ))
5258+ typedef_is_const = true;
5259+
51685260 char base_type [MAX_TYPE_LEN ];
51695261 type_t * base ;
51705262 type_t * type = add_type ();
@@ -5198,6 +5290,7 @@ void parse_internal(void)
51985290 GLOBAL_FUNC = add_func ("" , true);
51995291 GLOBAL_FUNC -> stack_size = 4 ;
52005292 GLOBAL_FUNC -> bbs = arena_calloc (BB_ARENA , 1 , sizeof (basic_block_t ));
5293+ GLOBAL_FUNC -> bbs -> belong_to = GLOBAL_FUNC ; /* Set the belong_to pointer */
52015294
52025295 /* built-in types */
52035296 TY_void = add_named_type ("void" );
0 commit comments