Support comments between (* and *)

This commit is contained in:
2025-09-10 23:57:56 +02:00
parent d16ec370dc
commit 3d5d5666b8
3 changed files with 1371 additions and 446 deletions

View File

@@ -14,7 +14,7 @@ directory 'build/boot'
directory 'build/valid'
def compile(input, output)
sh ENV.fetch('CC', 'gcc'), '-nostdlib', '-o', output, input
sh ENV.fetch('CC', 'gcc'), '-nostdlib', '-fpie', '-g', '-o', output, input
end
def run(exe)
@@ -39,43 +39,16 @@ end
desc 'Convert previous stage language into the current stage language'
task :convert do
File.open('boot/stage8.elna', 'w') do |current_stage|
File.readlines('boot/stage7.elna').each do |line|
if line == ".section .bss\n"
current_stage << <<~SECTION
const
symbol_builtin_name_int := "Int";
symbol_builtin_name_word := "Word";
symbol_builtin_name_pointer := "Pointer";
symbol_builtin_name_char := "Char";
symbol_builtin_name_bool := "Bool";
File.open('boot/stage9.elna', 'w') do |current_stage|
File.readlines('boot/stage8.elna').each do |line|
comment_match = /^(\s*)#(.*)/.match line
# Every type info starts with a word describing what type it is.
#
# PRIMITIVE_TYPE = 1
#
# Primitive types have only type size.
symbol_builtin_type_int := S(1, 4);
symbol_builtin_type_word := S(1, 4);
symbol_builtin_type_pointer := S(1, 4);
symbol_builtin_type_char := S(1, 1);
symbol_builtin_type_bool := S(1, 1);
# Info objects start with a word describing its type.
#
# INFO_TYPE = 1
#
# Type info has the type it belongs to.
symbol_type_info_int := S(1, @symbol_builtin_type_int);
symbol_type_info_word := S(1, @symbol_builtin_type_word);
symbol_type_info_pointer := S(1, @symbol_builtin_type_pointer);
symbol_type_info_char := S(1, @symbol_builtin_type_char);
symbol_type_info_bool := S(1, @symbol_builtin_type_bool);
SECTION
elsif line == ".section .data\n"
current_stage << "var\n"
elsif !(line == ".section .text\n" || line == ".globl _start\n")
if comment_match.nil?
current_stage << line
elsif comment_match[2].empty?
current_stage << "\n"
else
current_stage << "#{comment_match[1]}(* #{comment_match[2].strip} *)\n"
end
end
end