mirror of
https://github.com/janet-lang/janet
synced 2024-11-24 17:27:18 +00:00
Update (parser/where) to support optional line and column
This commit is contained in:
parent
a55354357c
commit
77b79e9899
@ -985,8 +985,20 @@ static Janet cfun_parse_flush(int32_t argc, Janet *argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static Janet cfun_parse_where(int32_t argc, Janet *argv) {
|
static Janet cfun_parse_where(int32_t argc, Janet *argv) {
|
||||||
janet_fixarity(argc, 1);
|
janet_arity(argc, 1, 3);
|
||||||
JanetParser *p = janet_getabstract(argv, 0, &janet_parser_type);
|
JanetParser *p = janet_getabstract(argv, 0, &janet_parser_type);
|
||||||
|
if (argc > 1) {
|
||||||
|
int32_t line = janet_getinteger(argv, 1);
|
||||||
|
if (line < 1)
|
||||||
|
janet_panicf("invalid line number %d", line);
|
||||||
|
p->line = (size_t) line;
|
||||||
|
}
|
||||||
|
if (argc > 2) {
|
||||||
|
int32_t column = janet_getinteger(argv, 2);
|
||||||
|
if (column < 0)
|
||||||
|
janet_panicf("invalid column number %d", column);
|
||||||
|
p->column = (size_t) column;
|
||||||
|
}
|
||||||
Janet *tup = janet_tuple_begin(2);
|
Janet *tup = janet_tuple_begin(2);
|
||||||
tup[0] = janet_wrap_integer(p->line);
|
tup[0] = janet_wrap_integer(p->line);
|
||||||
tup[1] = janet_wrap_integer(p->column);
|
tup[1] = janet_wrap_integer(p->column);
|
||||||
@ -1247,8 +1259,10 @@ static const JanetReg parse_cfuns[] = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"parser/where", cfun_parse_where,
|
"parser/where", cfun_parse_where,
|
||||||
JDOC("(parser/where parser)\n\n"
|
JDOC("(parser/where parser &opt line col)\n\n"
|
||||||
"Returns the current line number and column of the parser's internal state.")
|
"Returns the current line number and column of the parser's internal state. If line or "
|
||||||
|
"line and col are provided, the current line number and column of the parser are set to "
|
||||||
|
"those values.")
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"parser/eof", cfun_parse_eof,
|
"parser/eof", cfun_parse_eof,
|
||||||
|
@ -128,6 +128,18 @@
|
|||||||
(assert (not= nil (parse-error @"\xc3\x28")) "reject invalid utf-8 symbol")
|
(assert (not= nil (parse-error @"\xc3\x28")) "reject invalid utf-8 symbol")
|
||||||
(assert (not= nil (parse-error @":\xc3\x28")) "reject invalid utf-8 keyword")
|
(assert (not= nil (parse-error @":\xc3\x28")) "reject invalid utf-8 keyword")
|
||||||
|
|
||||||
|
# Parser line and column numbers
|
||||||
|
(defn parser-location [input &opt location]
|
||||||
|
(def p (parser/new))
|
||||||
|
(parser/consume p input)
|
||||||
|
(if location
|
||||||
|
(parser/where p ;location)
|
||||||
|
(parser/where p)))
|
||||||
|
|
||||||
|
(assert (= [1 7] (parser-location @"(+ 1 2)")) "parser location 1")
|
||||||
|
(assert (= [5 7] (parser-location @"(+ 1 2)" [5])) "parser location 2")
|
||||||
|
(assert (= [10 10] (parser-location @"(+ 1 2)" [10 10])) "parser location 3")
|
||||||
|
|
||||||
# String check-set
|
# String check-set
|
||||||
(assert (string/check-set "abc" "a") "string/check-set 1")
|
(assert (string/check-set "abc" "a") "string/check-set 1")
|
||||||
(assert (not (string/check-set "abc" "z")) "string/check-set 2")
|
(assert (not (string/check-set "abc" "z")) "string/check-set 2")
|
||||||
|
Loading…
Reference in New Issue
Block a user