commit 4a9c4747cbd5f9c50e0ef8641f48607ab12914c8 parent 33ea3f56907ddabfb0db5697d3473a43e1a1d502 Author: erai <erai@omiltem.net> Date: Sat, 16 Mar 2024 11:39:45 -0400 fix heapsort Diffstat:
M | cc3.l | | | 101 | +++++++++++++++++++++++++++++++++++++++++-------------------------------------- |
M | lex.c | | | 23 | +++++++++++++++++------ |
2 files changed, 69 insertions(+), 55 deletions(-)
diff --git a/cc3.l b/cc3.l @@ -1,49 +1,52 @@ -comment = "//"; -whitespace = [ \r\n\t]; -ident = [a-zA-Z_][a-zA-Z0-9_]*; -str = "\""([^"\\]|"\\".)*"\""; -chr = "'"([^'\\]|"\\".)*"'"; -dec = [0-9]+; -hex = "0x"[0-9a-fA-F]*; -lpar = "("; -rpar = ")"; -lbra = "{"; -rbra = "}"; -comma = ","; -semi = ";"; -colon = ":"; -star = "*"; -equal = "="; -eq = "=="; -and = "&"; -andthen = "&&"; -or = "|"; -orelse = "||"; -xor = "^"; -bang = "!"; -ne = "!="; -lt = "<"; -lsh = "<<"; -le = "<="; -gt = ">"; -rsh = ">>"; -ge = ">="; -rsq = "["; -lsq = "]"; -plus = "+"; -minus = "-"; -mod = "%"; -return = "return"; -break = "break"; -sizeof = "sizeof"; -if = "if"; -else = "else"; -loop = "loop"; -continue = "continue"; -goto = "goto"; -var = "var"; -enum = "enum"; -struct = "struct"; -byte = "byte"; -int = "int"; -void = "void"; +COMMENT = "//"; +WHITESPACE = [ \r\n\t]; +IDENT = [a-zA-Z_][a-zA-Z0-9_]*; +STR = "\""([^"\\]|"\\".)*"\""; +CHR = "'"([^'\\]|"\\".)*"'"; +DEC = [0-9]+; +HEX = "0x"[0-9a-fA-F]*; +LPAR = "("; +RPAR = ")"; +LBRA = "{"; +RBRA = "}"; +COMMA = ","; +SEMI = ";"; +COLON = ":"; +STAR = "*"; +EQUAL = "="; +EQ = "=="; +AND = "&"; +ANDTHEN = "&&"; +OR = "|"; +ORELSE = "||"; +XOR = "^"; +BANG = "!"; +NE = "!="; +LT = "<"; +LSH = "<<"; +LE = "<="; +GT = ">"; +RSH = ">>"; +GE = ">="; +RSQ = "["; +LSQ = "]"; +PLUS = "+"; +MINUS = "-"; +MOD = "%"; +RETURN = "return"; +BREAK = "break"; +SIZEOF = "sizeof"; +IF = "if"; +ELSE = "else"; +LOOP = "loop"; +CONTINUE = "continue"; +GOTO = "goto"; +VAR = "var"; +ENUM = "enum"; +STRUCT = "struct"; +BYTE = "byte"; +INT = "int"; +VOID = "void"; +DOT = "."; +NOT = "~"; +DIV = "/"; diff --git a/lex.c b/lex.c @@ -998,15 +998,26 @@ nlist_sort(l: *nlist): void { i = l.fill - 1; loop { + j = i; + loop { + k = (j << 1) + 1; + if (k >= l.fill) { + break; + } + if (k + 1 < l.fill && l.live[k].id < l.live[k + 1].id) { + k = k + 1; + } + if (l.live[j].id >= l.live[k].id) { + break; + } + tmp = l.live[k]; + l.live[k] = l.live[j]; + l.live[j] = tmp; + j = k; + } if (i == 0) { break; } - j = (i - 1) >> 1; - if (l.live[i].id > l.live[j].id) { - tmp = l.live[j]; - l.live[j] = l.live[i]; - l.live[i] = tmp; - } i = i - 1; }