commit 3e6cf95033fca07d02f9b8ecc199eb5f96c477b7
parent e5a4f27da11c657db6007486e8cb481b8ee4757e
Author: erai <erai@omiltem.net>
Date: Fri, 11 Oct 2024 11:06:45 -0400
Allow underscores in numbers
Diffstat:
M | cc0.c | | | 72 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ |
M | cc3.peg | | | 7 | ++++--- |
M | lib.c | | | 42 | +++++++++++++++--------------------------- |
3 files changed, 79 insertions(+), 42 deletions(-)
diff --git a/cc0.c b/cc0.c
@@ -413,7 +413,7 @@ enum {
my_P_bor_op = 27,
my_P_break = 69,
my_P_break_stmt = 15,
- my_P_byte = 79,
+ my_P_byte = 80,
my_P_call_expr = 57,
my_P_cast_expr = 59,
my_P_char = 66,
@@ -434,7 +434,7 @@ enum {
my_P_eq_op = 33,
my_P_expr = 25,
my_P_expr_stmt = 22,
- my_P_func = 82,
+ my_P_func = 83,
my_P_func_decl = 5,
my_P_func_type = 9,
my_P_ge_op = 30,
@@ -443,11 +443,11 @@ enum {
my_P_grammar = 0,
my_P_gt_op = 32,
my_P_hex = 63,
- my_P_ident = 83,
+ my_P_ident = 84,
my_P_if = 71,
my_P_if_stmt = 13,
my_P_index_expr = 56,
- my_P_int = 80,
+ my_P_int = 81,
my_P_label_stmt = 19,
my_P_le_op = 29,
my_P_loop = 73,
@@ -475,7 +475,7 @@ enum {
my_P_shift_expr = 48,
my_P_sizeof = 70,
my_P_sizeof_expr = 62,
- my_P_sp = 84,
+ my_P_sp = 85,
my_P_stmt = 10,
my_P_str = 65,
my_P_struct = 78,
@@ -483,9 +483,10 @@ enum {
my_P_sub_op = 37,
my_P_type = 6,
my_P_unary_expr = 55,
+ my_P_union = 79,
my_P_var = 76,
my_P_var_stmt = 18,
- my_P_void = 81,
+ my_P_void = 82,
my_P_xor_op = 39,
my_R_CR0 = 0,
my_R_CR1 = 1,
@@ -792,6 +793,7 @@ unsigned long( my_peg_P_struct_decl)(struct my_peg* my_c);
unsigned long( my_peg_P_sub_op)(struct my_peg* my_c);
unsigned long( my_peg_P_type)(struct my_peg* my_c);
unsigned long( my_peg_P_unary_expr)(struct my_peg* my_c);
+unsigned long( my_peg_P_union)(struct my_peg* my_c);
unsigned long( my_peg_P_var)(struct my_peg* my_c);
unsigned long( my_peg_P_var_stmt)(struct my_peg* my_c);
unsigned long( my_peg_P_void)(struct my_peg* my_c);
@@ -1155,6 +1157,9 @@ unsigned char*( my_P_tag_to_str)(unsigned long my_tag){
if ((unsigned long)(((long)(my_tag))==((long)(my_P_struct)))) {
return (unsigned char *)"struct";
}
+ if ((unsigned long)(((long)(my_tag))==((long)(my_P_union)))) {
+ return (unsigned char *)"union";
+ }
if ((unsigned long)(((long)(my_tag))==((long)(my_P_byte)))) {
return (unsigned char *)"byte";
}
@@ -2685,7 +2690,10 @@ unsigned long( my_dec2int)(unsigned char* my_s,unsigned long my_len,unsigned lon
break;
}
(my_d)=((unsigned long)(my_s)[my_i]);
- if ((unsigned long)(((unsigned long)(((long)(my_d))>=((long)(48))))&&((unsigned long)(((long)(my_d))<=((long)(57)))))) {
+ if ((unsigned long)(((long)(my_d))==((long)(95)))) {
+ (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL))));
+ continue;
+ } else if ((unsigned long)(((unsigned long)(((long)(my_d))>=((long)(48))))&&((unsigned long)(((long)(my_d))<=((long)(57)))))) {
(my_d)=((unsigned long)(((unsigned long)(my_d))-((unsigned long)(48))));
} else {
(*(my_ok))=(0UL);
@@ -4519,7 +4527,10 @@ unsigned long( my_hex2int)(unsigned char* my_s,unsigned long my_len,unsigned lon
break;
}
(my_d)=((unsigned long)(my_s)[my_i]);
- if ((unsigned long)(((unsigned long)(((long)(my_d))>=((long)(48))))&&((unsigned long)(((long)(my_d))<=((long)(57)))))) {
+ if ((unsigned long)(((long)(my_d))==((long)(95)))) {
+ (my_i)=((unsigned long)(((unsigned long)(my_i))+((unsigned long)(1UL))));
+ continue;
+ } else if ((unsigned long)(((unsigned long)(((long)(my_d))>=((long)(48))))&&((unsigned long)(((long)(my_d))<=((long)(57)))))) {
(my_d)=((unsigned long)(((unsigned long)(my_d))-((unsigned long)(48))));
} else if ((unsigned long)(((unsigned long)(((long)(my_d))>=((long)(97))))&&((unsigned long)(((long)(my_d))<=((long)(102)))))) {
(my_d)=((unsigned long)(((unsigned long)((unsigned long)(((unsigned long)(my_d))-((unsigned long)(97)))))+((unsigned long)(10UL))));
@@ -6260,11 +6271,21 @@ unsigned long( my_peg_P_continue_stmt)(struct my_peg* my_c){
unsigned long( my_peg_P_dec)(struct my_peg* my_c){
unsigned long my_ok = 0;
(my_enter)((my_c),(my_P_dec));
- (my_ok)=((my_charset)((my_c),((unsigned char *)"0123456789")));
+ (my_choice)((my_c));
+ (my_ok)=((my_literal)((my_c),((unsigned char *)"_")));
+ if (my_ok) {
+ (my_fail)((my_c));
+ (my_fail)((my_c));
+ (my_ok)=(0UL);
+ } else {
+ (my_ok)=(1UL);
+ }
+ if (my_ok) {
+ (my_ok)=((my_charset)((my_c),((unsigned char *)"0123456789_")));
if (my_ok) {
while (1) {
(my_choice)((my_c));
- (my_ok)=((my_charset)((my_c),((unsigned char *)"0123456789")));
+ (my_ok)=((my_charset)((my_c),((unsigned char *)"0123456789_")));
if ((unsigned long)(!(my_ok))) {
(my_ok)=(1UL);
break;
@@ -6272,6 +6293,7 @@ unsigned long( my_peg_P_dec)(struct my_peg* my_c){
(my_commit)((my_c));
}
}
+ }
if (my_ok) {
(my_leave)((my_c),(my_P_dec));
} else {
@@ -6817,11 +6839,11 @@ unsigned long( my_peg_P_hex)(struct my_peg* my_c){
(my_enter)((my_c),(my_P_hex));
(my_ok)=((my_literal)((my_c),((unsigned char *)"0x")));
if (my_ok) {
- (my_ok)=((my_charset)((my_c),((unsigned char *)"0123456789ABCDEFabcdef")));
+ (my_ok)=((my_charset)((my_c),((unsigned char *)"0123456789ABCDEF_abcdef")));
if (my_ok) {
while (1) {
(my_choice)((my_c));
- (my_ok)=((my_charset)((my_c),((unsigned char *)"0123456789ABCDEFabcdef")));
+ (my_ok)=((my_charset)((my_c),((unsigned char *)"0123456789ABCDEF_abcdef")));
if ((unsigned long)(!(my_ok))) {
(my_ok)=(1UL);
break;
@@ -7477,6 +7499,10 @@ unsigned long( my_peg_P_reserved)(struct my_peg* my_c){
}
if ((unsigned long)(!(my_ok))) {
(my_choice)((my_c));
+ (my_ok)=((my_peg_P_union)((my_c)));
+ }
+ if ((unsigned long)(!(my_ok))) {
+ (my_choice)((my_c));
(my_ok)=((my_peg_P_byte)((my_c)));
}
if ((unsigned long)(!(my_ok))) {
@@ -8016,6 +8042,28 @@ unsigned long( my_peg_P_unary_expr)(struct my_peg* my_c){
}
return my_ok;
}
+unsigned long( my_peg_P_union)(struct my_peg* my_c){
+ unsigned long my_ok = 0;
+ (my_enter)((my_c),(my_P_union));
+ (my_ok)=((my_literal)((my_c),((unsigned char *)"union")));
+ if (my_ok) {
+ (my_choice)((my_c));
+ (my_ok)=((my_charset)((my_c),((unsigned char *)"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz")));
+ if (my_ok) {
+ (my_fail)((my_c));
+ (my_fail)((my_c));
+ (my_ok)=(0UL);
+ } else {
+ (my_ok)=(1UL);
+ }
+ }
+ if (my_ok) {
+ (my_leave)((my_c),(my_P_union));
+ } else {
+ (my_fail)((my_c));
+ }
+ return my_ok;
+}
unsigned long( my_peg_P_var)(struct my_peg* my_c){
unsigned long my_ok = 0;
(my_enter)((my_c),(my_P_var));
diff --git a/cc3.peg b/cc3.peg
@@ -96,13 +96,13 @@ primary <- ident sp / hex sp / dec sp / str sp / char sp
sizeof_expr <- sizeof sp '(' sp expr ')' sp
-hex <- '0x'[0-9a-fA-F]+
-dec <- [0-9]+
+hex <- '0x'[0-9a-fA-F_]+
+dec <- !'_' [0-9_]+
str <- ["] ([\\] . / !["] .)* ["]
char <- ['] ([\\] . / !['] .)+ [']
reserved <- return / break / sizeof / if / else / loop / continue / goto
- / var / enum / struct / byte / int / void / func
+ / var / enum / struct / union / byte / int / void / func
return <- 'return' ![a-zA-Z0-9_]
break <- 'break' ![a-zA-Z0-9_]
@@ -115,6 +115,7 @@ goto <- 'goto' ![a-zA-Z0-9_]
var <- 'var' ![a-zA-Z0-9_]
enum <- 'enum' ![a-zA-Z0-9_]
struct <- 'struct' ![a-zA-Z0-9_]
+union <- 'union' ![a-zA-Z0-9_]
byte <- 'byte' ![a-zA-Z0-9_]
int <- 'int' ![a-zA-Z0-9_]
void <- 'void' ![a-zA-Z0-9_]
diff --git a/lib.c b/lib.c
@@ -101,35 +101,17 @@ fdputs(fd: int, msg: *byte) {
}
fdputh(fd: int, n: int) {
- var c: int;
- var r: int;
-
- r = 0;
- loop {
- if (n == 0) {
- break;
- }
-
- r = (r << 4) + (n & 15);
- n = n >> 4;
- }
-
- n = r;
+ var d: int;
- loop {
- c = n & 15;
- n = n >> 4;
+ d = n & 15;
- if (c < 10) {
- fdputc(fd, c + '0');
- } else {
- fdputc(fd, c + ('a' - 10));
- }
+ n = n >> 4;
- if (n == 0) {
- break;
- }
+ if n {
+ fdputh(fd, n);
}
+
+ fdputc(fd, "0123456789abcdef"[d]:int);
}
fdputhn(fd: int, x: int, d: int) {
@@ -508,7 +490,10 @@ hex2int(s: *byte, len: int, ok: *int): int {
d = s[i]:int;
- if d >= '0' && d <= '9' {
+ if d == '_' {
+ i = i + 1;
+ continue;
+ } else if d >= '0' && d <= '9' {
d = d - '0';
} else if d >= 'a' && d <= 'f' {
d = d - 'a' + 10;
@@ -546,7 +531,10 @@ dec2int(s: *byte, len: int, ok: *int): int {
}
d = s[i]:int;
- if d >= '0' && d <= '9' {
+ if d == '_' {
+ i = i + 1;
+ continue;
+ } else if d >= '0' && d <= '9' {
d = d - '0';
} else {
*ok = 0;