Skip to content

Commit

Permalink
Fix lexer rule to handle operator of format like operator + comment
Browse files Browse the repository at this point in the history
  • Loading branch information
trdthg committed Jul 10, 2024
1 parent 09ac4b2 commit d03da2e
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 6 deletions.
23 changes: 17 additions & 6 deletions src/lib/lexer.mll
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,12 @@ let tyvar_start = '\''
let oper_char = ['!''%''&''*''+''-''.''/'':''<''=''>''@''^''|']
let oper_char_no_slash = ['!''%''&''*''+''-''.'':''<''=''>''@''^''|']
let oper_char_no_slash_star = ['!''%''&''+''-''.'':''<''=''>''@''^''|']
let operator1 = oper_char
let operator2 = oper_char oper_char_no_slash_star | oper_char_no_slash oper_char
let operatorn = oper_char oper_char_no_slash_star (oper_char* ('_' ident)?) | oper_char_no_slash oper_char (oper_char* ('_' ident)?) | oper_char ('_' ident)?
let operator = operator1 | operator2 | operatorn
let oper_char_no_star = ['!''%''&''+''-''.''/'':''<''=''>''@''^''|']
let operator_any_start = oper_char (oper_char_no_slash_star oper_char)*
| (oper_char oper_char_no_slash_star)*
let operator_no_slash_start = oper_char_no_slash (oper_char oper_char_no_slash_star)*
| (oper_char_no_slash_star oper_char)*
let operator = (operator_any_start | operator_no_slash_start) ('_' ident)?
let escape_sequence = ('\\' ['\\''\"''\'''n''t''b''r']) | ('\\' digit digit digit) | ('\\' 'x' hexdigit hexdigit)
let lchar = [^'\n']

Expand All @@ -188,7 +190,7 @@ rule token comments = parse
token comments lexbuf }
| "@" { At }
| "2" ws "^" { TwoCaret }
| "^" { Caret }
| "^" { Caret }
| "::" { ColonColon }
| ":" { Colon ":" }
| "," { Comma }
Expand Down Expand Up @@ -235,7 +237,16 @@ rule token comments = parse
{ Fixity (InfixL, Big_int.of_string (Char.escaped p), op) }
| "infixr" ws (digit as p) ws (operator as op)
{ Fixity (InfixR, Big_int.of_string (Char.escaped p), op) }
| operator as op { OpId op }
| operator as op {
OpId op }
| (operator as op) ['/'] ['*'] {
block_comment comments (Lexing.lexeme_start_p lexbuf) (Buffer.create 10) 0 lexbuf;
if op = "=" then Eq "=" else OpId op
}
| (operator as op) ['/'] ['/'] {
line_comment comments (Lexing.lexeme_start_p lexbuf) (Buffer.create 10) lexbuf;
if op = "=" then Eq "=" else OpId op
}
| tyvar_start startident ident* as i { TyVar i }
| "~" { Id "~" }
| startident ident* as i { if M.mem i kw_table then
Expand Down
36 changes: 36 additions & 0 deletions test/format/default/operator.expect
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
default Order dec
$include <prelude.sail>

infix 4 ===_u
infix 4 =/
infix 4 ===/_u
infix 4 /=/=/=_u
infix 4 ===*_u

val operator ===/_u : forall 'n. (int('n), int('n)) -> bool
function operator ===/_u(x, y) = x == y

val operator =/ : forall 'n. (int('n), int('n)) -> bool
function operator =/(x, y) = x == y

function f () = {
if eq2_comment == /**/ /**/ 1 then {
1
};

if eq_slash =/ 1 then {
1
};

let eq_comment =
/**/ 1;
let eq_comment =
//
1;

if eq3_slash ===/_u 1 then {
1
};

0
}
28 changes: 28 additions & 0 deletions test/format/operator.sail
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
default Order dec
$include <prelude.sail>

infix 4 ===_u
infix 4 =/
infix 4 ===/_u
infix 4 /=/=/=_u
infix 4 ===*_u

val operator ===/_u : forall 'n. (int('n), int('n)) -> bool
function operator ===/_u(x, y) = x == y

val operator =/ : forall 'n. (int('n), int('n)) -> bool
function operator =/(x, y) = x == y

function f () = {
if eq2_comment /**/==/**/ 1 then { 1 };

if eq_slash =/ 1 then { 1 };

let eq_comment =/**/ 1;
let eq_comment =//
1;

if eq3_slash ===/_u 1 then { 1 };

0
}

0 comments on commit d03da2e

Please sign in to comment.