scanner: fill out '@FN' placeholder at compile time while scanning
parent
7a404af097
commit
aa30549337
|
@ -96,6 +96,48 @@ fn (s mut Scanner) ident_name() string {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ident_fn_name look ahead and return name of function if possible, otherwise empty string
|
||||||
|
fn (s mut Scanner) ident_fn_name() string {
|
||||||
|
start := s.pos
|
||||||
|
mut pos := s.pos
|
||||||
|
pos++
|
||||||
|
// Search for function scope start
|
||||||
|
for pos < s.text.len && s.text[pos] != `{` {
|
||||||
|
pos++
|
||||||
|
}
|
||||||
|
if pos >= s.text.len {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
// Search backwards for "first" occurrence of function open paranthesis
|
||||||
|
for pos > start && s.text[pos] != `(` {
|
||||||
|
pos--
|
||||||
|
}
|
||||||
|
if pos < start {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
// Search backwards for end position of function name
|
||||||
|
for pos > start && !util.is_func_char(s.text[pos]) {
|
||||||
|
pos--
|
||||||
|
}
|
||||||
|
end_pos := pos + 1
|
||||||
|
if pos < start {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
// Search for the start position
|
||||||
|
for pos > start && util.is_func_char(s.text[pos]) {
|
||||||
|
pos--
|
||||||
|
}
|
||||||
|
start_pos := pos + 1
|
||||||
|
if pos < start || pos >= s.text.len {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
if s.text[start_pos].is_digit() || end_pos > s.text.len || end_pos <= start_pos || end_pos <= start || start_pos <= start {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
fn_name := s.text[start_pos..end_pos]
|
||||||
|
return fn_name
|
||||||
|
}
|
||||||
|
|
||||||
fn filter_num_sep(txt byteptr, start int, end int) string {
|
fn filter_num_sep(txt byteptr, start int, end int) string {
|
||||||
unsafe{
|
unsafe{
|
||||||
mut b := malloc(end - start + 1) // add a byte for the endstring 0
|
mut b := malloc(end - start + 1) // add a byte for the endstring 0
|
||||||
|
@ -392,7 +434,11 @@ pub fn (s mut Scanner) scan() token.Token {
|
||||||
// Check if not .eof to prevent panic
|
// Check if not .eof to prevent panic
|
||||||
next_char := if s.pos + 1 < s.text.len { s.text[s.pos + 1] } else { `\0` }
|
next_char := if s.pos + 1 < s.text.len { s.text[s.pos + 1] } else { `\0` }
|
||||||
if token.is_key(name) {
|
if token.is_key(name) {
|
||||||
return s.new_token(token.key_to_token(name), name, name.len)
|
kind := token.key_to_token(name)
|
||||||
|
if kind == .key_fn {
|
||||||
|
s.fn_name = s.ident_fn_name()
|
||||||
|
}
|
||||||
|
return s.new_token(kind, name, name.len)
|
||||||
}
|
}
|
||||||
// 'asdf $b' => "b" is the last name in the string, dont start parsing string
|
// 'asdf $b' => "b" is the last name in the string, dont start parsing string
|
||||||
// at the next ', skip it
|
// at the next ', skip it
|
||||||
|
|
|
@ -40,4 +40,6 @@ fn test_scan() {
|
||||||
assert 1.23e+10 == 1.23e10
|
assert 1.23e+10 == 1.23e10
|
||||||
assert 1.23e+10 == 1.23e0010
|
assert 1.23e+10 == 1.23e0010
|
||||||
assert (-1.23e+10) == (1.23e0010 * -1.0)
|
assert (-1.23e+10) == (1.23e0010 * -1.0)
|
||||||
|
// test @FN
|
||||||
|
assert @FN == 'test_scan'
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,11 @@ fn is_name_char(c byte) bool {
|
||||||
return (c >= `a` && c <= `z`) || (c >= `A` && c <= `Z`) || c == `_`
|
return (c >= `a` && c <= `z`) || (c >= `A` && c <= `Z`) || c == `_`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[inline]
|
||||||
|
fn is_func_char(c byte) bool {
|
||||||
|
return (c >= `a` && c <= `z`) || (c >= `A` && c <= `Z`) || c == `_` || c.is_digit()
|
||||||
|
}
|
||||||
|
|
||||||
[inline]
|
[inline]
|
||||||
fn is_nl(c byte) bool {
|
fn is_nl(c byte) bool {
|
||||||
return c == `\r` || c == `\n`
|
return c == `\r` || c == `\n`
|
||||||
|
|
Loading…
Reference in New Issue