Skip to content

Commit

Permalink
[parser] allow {-1-} position markers in identifiers/keywords
Browse files Browse the repository at this point in the history
  • Loading branch information
kLabz committed Sep 3, 2024
1 parent 3b050f0 commit ba7b10a
Showing 1 changed file with 27 additions and 7 deletions.
34 changes: 27 additions & 7 deletions src/syntax/lexer.ml
Original file line number Diff line number Diff line change
Expand Up @@ -310,30 +310,34 @@ let mk_keyword lexbuf kwd =
let invalid_char lexbuf =
error (Invalid_character (Uchar.to_int (lexeme_char lexbuf 0))) (lexeme_start lexbuf)

let alpha = [%sedlex.regexp?

This comment has been minimized.

Copy link
@kLabz

kLabz Sep 3, 2024

Author Contributor

Well, should be alphanum 😅

Star ('_' | 'a'..'z' | 'A'..'Z' | '0'..'9')
]

let ident = [%sedlex.regexp?
(
Star '_',
'a'..'z',
Star ('_' | 'a'..'z' | 'A'..'Z' | '0'..'9')
alpha
)
|
Plus '_'
|
(
Plus '_',
'0'..'9',
Star ('_' | 'a'..'z' | 'A'..'Z' | '0'..'9')
alpha
)
]

let sharp_ident = [%sedlex.regexp?
(
('a'..'z' | 'A'..'Z' | '_'),
Star ('a'..'z' | 'A'..'Z' | '0'..'9' | '_'),
alpha,
Star (
'.',
('a'..'z' | 'A'..'Z' | '_'),
Star ('a'..'z' | 'A'..'Z' | '0'..'9' | '_')
alpha
)
)
]
Expand Down Expand Up @@ -490,6 +494,15 @@ let rec token lexbuf =
let v = lexeme lexbuf in
let v = String.sub v 1 (String.length v - 1) in
mk lexbuf (Dollar v)
| alpha, "{-", integer_digits, "-}", alpha ->
let s = lexeme lexbuf in
let s = Str.global_replace (Str.regexp "\\{-[0-9]+-\\}") "" s in
s_token lexbuf s
| ident -> s_token lexbuf (lexeme lexbuf)
| idtype -> s_token lexbuf (lexeme lexbuf)
| _ -> invalid_char lexbuf

and s_token lexbuf = function
(* type decl *)
| "package" -> mk_keyword lexbuf Package
| "import" -> mk_keyword lexbuf Import
Expand Down Expand Up @@ -541,9 +554,16 @@ let rec token lexbuf =
| "new" -> mk_keyword lexbuf New
| "in" -> mk_keyword lexbuf In
| "cast" -> mk_keyword lexbuf Cast
| ident -> mk_ident lexbuf
| idtype -> mk lexbuf (Const (Ident (lexeme lexbuf)))
| _ -> invalid_char lexbuf
| tk ->
let pmin = lexeme_start lexbuf in
let pmax = lexeme_end lexbuf in
let sub = Sedlexing.Utf8.from_string tk in
(match%sedlex sub with
| eof -> raise Exit
| ident -> mk_tok (Const (Ident (lexeme sub))) (pmin + (lexeme_start sub)) pmax
| idtype -> mk_tok (Const (Ident (lexeme sub))) (pmin + (lexeme_start sub)) pmax
| _ -> invalid_char sub
);

and comment lexbuf =
match%sedlex lexbuf with
Expand Down

0 comments on commit ba7b10a

Please sign in to comment.