From 5fb2d4a21816d2d06ec0b12ff7be5b09a7771ce4 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sat, 5 Sep 2015 11:09:07 -0700 Subject: Syntax errors refer to REPL line number. * eval.c (eval_init): Registrations of lisp-parse and read must account for new optional argument. * lib.c (func_n5o): New function. * lib.h (func_n5o): Declared. * parser.c (lisp_parse): New argument for passing in line number. This is punched into the parser object. (read_eval_stream): Call to lisp_parse defaults new argument. (repl): Pass repl line number to lisp_parse. * parser.h (lisp_parse): Declaration updated. * txr.c (txr_main): Call to lisp_parse defaults new argument. --- eval.c | 4 ++-- lib.c | 8 ++++++++ lib.h | 1 + parser.c | 12 +++++++++--- parser.h | 3 ++- txr.c | 5 +++-- 6 files changed, 25 insertions(+), 8 deletions(-) diff --git a/eval.c b/eval.c index 98a7fbec..1e5919cf 100644 --- a/eval.c +++ b/eval.c @@ -4364,8 +4364,8 @@ void eval_init(void) reg_fun(intern(lit("hash-revget"), user_package), func_n4o(hash_revget, 2)); reg_fun(intern(lit("eval"), user_package), func_n2o(eval_intrinsic, 1)); - reg_fun(intern(lit("lisp-parse"), user_package), func_n4o(lisp_parse, 0)); - reg_fun(intern(lit("read"), user_package), func_n4o(lisp_parse, 0)); + reg_fun(intern(lit("lisp-parse"), user_package), func_n5o(lisp_parse, 0)); + reg_fun(intern(lit("read"), user_package), func_n5o(lisp_parse, 0)); reg_fun(intern(lit("load"), system_package), func_n2(sys_load)); reg_fun(intern(lit("expand"), system_package), func_n2o(expand, 1)); reg_fun(intern(lit("macro-form-p"), user_package), func_n2o(macro_form_p, 1)); diff --git a/lib.c b/lib.c index adc73095..597a5f81 100644 --- a/lib.c +++ b/lib.c @@ -4238,6 +4238,14 @@ val func_n4o(val (*fun)(val, val, val, val), int reqargs) return obj; } +val func_n5o(val (*fun)(val, val, val, val, val), int reqargs) +{ + val obj = func_n5(fun); + obj->f.optargs = 5 - reqargs; + return obj; +} + + val func_n1ov(val (*fun)(val, varg), int reqargs) { val obj = func_n1v(fun); diff --git a/lib.h b/lib.h index 38505cac..a7b4187b 100644 --- a/lib.h +++ b/lib.h @@ -750,6 +750,7 @@ val func_n1o(val (*fun)(val), int reqargs); val func_n2o(val (*fun)(val, val), int reqargs); val func_n3o(val (*fun)(val, val, val), int reqargs); val func_n4o(val (*fun)(val, val, val, val), int reqargs); +val func_n5o(val (*fun)(val, val, val, val, val), int reqargs); val func_n1ov(val (*fun)(val, varg), int reqargs); val func_n2ov(val (*fun)(val, val, varg), int reqargs); val func_n3ov(val (*fun)(val, val, val, varg), int reqargs); diff --git a/parser.c b/parser.c index 6344b82a..a0bec2dd 100644 --- a/parser.c +++ b/parser.c @@ -263,7 +263,8 @@ val regex_parse(val string, val error_stream) return parser.errors ? nil : parser.syntax_tree; } -val lisp_parse(val source_in, val error_stream, val error_return_val, val name_in) +val lisp_parse(val source_in, val error_stream, val error_return_val, + val name_in, val lineno) { uses_or2; val source = default_bool_arg(source_in); @@ -284,6 +285,9 @@ val lisp_parse(val source_in, val error_stream, val error_return_val, val name_i error_stream = if3(error_stream == t, std_output, or2(error_stream, std_null)); class_check (error_stream, stream_s); + if (lineno && !missingp(lineno)) + pi->lineno = c_num(lineno); + env_vbind(dyn_env, stderr_s, error_stream); { @@ -322,7 +326,7 @@ val read_eval_stream(val stream, val error_stream, val hash_bang_support) } for (;;) { - val form = lisp_parse(stream, error_stream, error_val, name); + val form = lisp_parse(stream, error_stream, error_val, name, colon_k); if (form == error_val) { if (parser_errors(get_parser(stream)) == zero) @@ -359,6 +363,7 @@ val repl(val bindings, val in_stream, val out_stream) while (!done) { val prompt = format(nil, lit("~a> "), counter, nao); + val prev_counter = counter; val var_counter = mod(counter, num_fast(100)); char *prompt_u8 = utf8_dup_to(c_str(prompt)); @@ -380,7 +385,8 @@ val repl(val bindings, val in_stream, val out_stream) { val line = string_utf8(line_u8); - val form = lisp_parse(line, out_stream, colon_k, colon_k); + val form = lisp_parse(line, out_stream, colon_k, + lit("line"), prev_counter); val value = eval_intrinsic(form, repl_env); if (value == quit_k) { done = t; diff --git a/parser.h b/parser.h index 16308570..bc6a3364 100644 --- a/parser.h +++ b/parser.h @@ -92,7 +92,8 @@ INLINE val rlcp(val to, val from) } val rlcp_tree(val to, val from); val regex_parse(val string, val error_stream); -val lisp_parse(val source, val error_stream, val error_return_val, val name); +val lisp_parse(val source_in, val error_stream, val error_return_val, + val name_in, val lineno); val read_eval_stream(val stream, val error_stream, val hash_bang_support); #if HAVE_TERMIOS val repl(val bindings, val in_stream, val out_stream); diff --git a/txr.c b/txr.c index 5786c044..67069e1a 100644 --- a/txr.c +++ b/txr.c @@ -580,7 +580,7 @@ int txr_main(int argc, char **argv) spec_file = arg; break; case 'e': - eval_intrinsic(lisp_parse(arg, std_error, colon_k, colon_k), + eval_intrinsic(lisp_parse(arg, std_error, colon_k, colon_k, colon_k), make_env(bindings, nil, nil)); evaled = t; break; @@ -593,7 +593,8 @@ int txr_main(int argc, char **argv) if3(c_chr(opt) == 'P', pprinl, tprint)); - pf(eval_intrinsic(lisp_parse(arg, std_error, colon_k, colon_k), + pf(eval_intrinsic(lisp_parse(arg, std_error, colon_k, + colon_k, colon_k), make_env(bindings, nil, nil)), std_output); evaled = t; } -- cgit v1.2.3