#line, #pragma
This commit is contained in:
parent
29ea5195fa
commit
6e75b24b7c
4 changed files with 88 additions and 7 deletions
|
@ -118,6 +118,12 @@
|
||||||
:str_undef
|
:str_undef
|
||||||
string undef
|
string undef
|
||||||
byte 0
|
byte 0
|
||||||
|
:str_pragma
|
||||||
|
string pragma
|
||||||
|
byte 0
|
||||||
|
:str_line
|
||||||
|
string line
|
||||||
|
byte 0
|
||||||
:str_include
|
:str_include
|
||||||
string include
|
string include
|
||||||
byte 0
|
byte 0
|
||||||
|
|
17
05/main.b
17
05/main.b
|
@ -27,11 +27,28 @@ function compile_error
|
||||||
fputc(2, 10)
|
fputc(2, 10)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
function compile_warning
|
||||||
|
argument file
|
||||||
|
argument line
|
||||||
|
argument message
|
||||||
|
fputs(2, file)
|
||||||
|
fputc(2, ':)
|
||||||
|
fputn(2, line)
|
||||||
|
fputs(2, .str_warning_prefix)
|
||||||
|
fputs(2, message)
|
||||||
|
fputc(2, 10)
|
||||||
|
return
|
||||||
|
|
||||||
:str_error_prefix
|
:str_error_prefix
|
||||||
string : Error:
|
string : Error:
|
||||||
byte 32
|
byte 32
|
||||||
byte 0
|
byte 0
|
||||||
|
|
||||||
|
:str_warning_prefix
|
||||||
|
string : Warning:
|
||||||
|
byte 32
|
||||||
|
byte 0
|
||||||
|
|
||||||
#include util.b
|
#include util.b
|
||||||
#include constants.b
|
#include constants.b
|
||||||
#include preprocess.b
|
#include preprocess.b
|
||||||
|
|
|
@ -11,13 +11,10 @@ JOIN(X, X)
|
||||||
|
|
||||||
STRINGIFY(X)
|
STRINGIFY(X)
|
||||||
|
|
||||||
#define E 5
|
#line 6
|
||||||
#define D E
|
|
||||||
#define C D
|
|
||||||
#define B C
|
|
||||||
#define A B
|
|
||||||
|
|
||||||
int x = E;
|
#line 7 "some_file.c"
|
||||||
|
#pragma whatever
|
||||||
|
|
||||||
main(void) {
|
main(void) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -452,6 +452,18 @@ function pptoken_skip_spaces
|
||||||
*8p_in = in
|
*8p_in = in
|
||||||
return
|
return
|
||||||
|
|
||||||
|
function pptoken_skip_to_newline
|
||||||
|
argument p_in
|
||||||
|
local in
|
||||||
|
in = *8p_in
|
||||||
|
:pptoken_skip_to_newline_loop
|
||||||
|
if *1in == 10 goto pptoken_skip_to_newline_end
|
||||||
|
pptoken_skip(&in)
|
||||||
|
goto pptoken_skip_to_newline_loop
|
||||||
|
:pptoken_skip_to_newline_end
|
||||||
|
*8p_in = in
|
||||||
|
return
|
||||||
|
|
||||||
; phase 4:
|
; phase 4:
|
||||||
; Preprocessing directives are executed and macro invocations are expanded.
|
; Preprocessing directives are executed and macro invocations are expanded.
|
||||||
; A #include preprocessing directive causes the named header or source file to be processed from phase 1 through phase 4, recursively.
|
; A #include preprocessing directive causes the named header or source file to be processed from phase 1 through phase 4, recursively.
|
||||||
|
@ -506,6 +518,10 @@ function translation_phase_4
|
||||||
if b != 0 goto pp_directive_define
|
if b != 0 goto pp_directive_define
|
||||||
b = str_equals(in, .str_undef)
|
b = str_equals(in, .str_undef)
|
||||||
if b != 0 goto pp_directive_undef
|
if b != 0 goto pp_directive_undef
|
||||||
|
b = str_equals(in, .str_pragma)
|
||||||
|
if b != 0 goto pp_directive_pragma
|
||||||
|
b = str_equals(in, .str_line)
|
||||||
|
if b != 0 goto pp_directive_line
|
||||||
goto unrecognized_directive
|
goto unrecognized_directive
|
||||||
:pp_directive_error
|
:pp_directive_error
|
||||||
fputs(2, filename)
|
fputs(2, filename)
|
||||||
|
@ -513,6 +529,39 @@ function translation_phase_4
|
||||||
fputn(2, line_number)
|
fputn(2, line_number)
|
||||||
fputs(2, .str_directive_error)
|
fputs(2, .str_directive_error)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
:pp_directive_line
|
||||||
|
; at this stage, we just turn #line directives into a nicer format:
|
||||||
|
; {$line_number filename} e.g. {$77 main.c}
|
||||||
|
local new_line_number
|
||||||
|
pptoken_skip(&in)
|
||||||
|
pptoken_skip_spaces(&in)
|
||||||
|
new_line_number = stoi(in)
|
||||||
|
new_line_number -= 1 ; #line directive applies to the following line
|
||||||
|
*1out = '$
|
||||||
|
out += 1
|
||||||
|
; copy line number
|
||||||
|
p = itos(new_line_number)
|
||||||
|
out = strcpy(out, p)
|
||||||
|
*1out = 32
|
||||||
|
out += 1
|
||||||
|
pptoken_skip(&in)
|
||||||
|
pptoken_skip_spaces(&in)
|
||||||
|
if *1in == 10 goto ppdirective_line_no_filename
|
||||||
|
if *1in != '" goto bad_line_directive
|
||||||
|
; copy filename
|
||||||
|
in += 1
|
||||||
|
filename = out
|
||||||
|
out = memccpy(out, in, '")
|
||||||
|
*1out = 0
|
||||||
|
out += 1
|
||||||
|
goto ppdirective_line_cont
|
||||||
|
:ppdirective_line_no_filename
|
||||||
|
out = strcpy(out, filename)
|
||||||
|
out += 1
|
||||||
|
:ppdirective_line_cont
|
||||||
|
pptoken_skip_to_newline(&in)
|
||||||
|
line_number = new_line_number
|
||||||
|
goto process_pptoken
|
||||||
:pp_directive_undef
|
:pp_directive_undef
|
||||||
pptoken_skip(&in)
|
pptoken_skip(&in)
|
||||||
pptoken_skip_spaces(&in)
|
pptoken_skip_spaces(&in)
|
||||||
|
@ -622,7 +671,14 @@ function translation_phase_4
|
||||||
function_macros_size = p - function_macros
|
function_macros_size = p - function_macros
|
||||||
free(param_names)
|
free(param_names)
|
||||||
goto phase4_next_line
|
goto phase4_next_line
|
||||||
|
:pp_directive_pragma
|
||||||
|
; we don't have any pragmas
|
||||||
|
compile_warning(filename, line_number, .str_unrecognized_pragma)
|
||||||
|
pptoken_skip_to_newline(&in)
|
||||||
|
goto process_pptoken
|
||||||
|
:str_unrecognized_pragma
|
||||||
|
string Unrecognized #pragma.
|
||||||
|
byte 0
|
||||||
:str_directive_error
|
:str_directive_error
|
||||||
string : #error
|
string : #error
|
||||||
byte 10
|
byte 10
|
||||||
|
@ -654,6 +710,11 @@ function translation_phase_4
|
||||||
:str_bad_undef
|
:str_bad_undef
|
||||||
string Bad #undef.
|
string Bad #undef.
|
||||||
byte 0
|
byte 0
|
||||||
|
:bad_line_directive
|
||||||
|
compile_error(filename, line_number, .str_bad_line_directive)
|
||||||
|
:str_bad_line_directive
|
||||||
|
string Bad #line.
|
||||||
|
byte 0
|
||||||
|
|
||||||
; returns a pointer to the replacement pptokens, or 0 if this macro is not defined
|
; returns a pointer to the replacement pptokens, or 0 if this macro is not defined
|
||||||
function look_up_macro
|
function look_up_macro
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue