Add one-line comment support and make some semi-column optional

Make possible the parsing of the counting example of *Clock-directed Modular Code Generation for Synchronous Data-flow Languages* (https://www.di.ens.fr/~pouzet/bib/lctes08a.pdf).

```
-- count the number of top between two tick
node counting (tick:bool; top:bool)
returns (o: int)
var v: int;
let o = if tick then v else 0 -> pre o + v;
    v = if top then 1 else 0;
tel;
```

The one-line comment rule was inspired from https://mukulrathi.com/create-your-own-programming-language/parsing-ocamllex-menhir/. Note their typo using `single_line_comment` instead of `read_single_line_comment`.
This commit is contained in:
Benjamin Loison 2022-12-10 01:58:09 +01:00
parent 97930ba85c
commit dcf7320c0d
2 changed files with 12 additions and 2 deletions

View File

@ -62,6 +62,11 @@ rule token = parse
| '/' { BO_div } | '/' { BO_div }
| '%' { BO_mod } | '%' { BO_mod }
| "->" { BO_arrow } | "->" { BO_arrow }
| "--" { read_single_line_comment lexbuf }
| eof { EOF } | eof { EOF }
| _ { raise (Lexing_error (Format.sprintf "Error when seeing %s" (lexeme lexbuf)))} | _ { raise (Lexing_error (Format.sprintf "Error when seeing %s" (lexeme lexbuf)))}
and read_single_line_comment = parse
| '\n' { token lexbuf }
| eof { EOF }
| _ { read_single_line_comment lexbuf }

View File

@ -187,9 +187,9 @@ node:
node_content: node_content:
IDENT LPAREN in_params RPAREN IDENT LPAREN in_params RPAREN
RETURNS LPAREN out_params RPAREN SEMICOL RETURNS LPAREN out_params RPAREN OPTIONAL_SEMICOL
local_params local_params
LET equations TEL LET equations TEL OPTIONAL_SEMICOL
{ let node_name = $1 in { let node_name = $1 in
let (t_in, e_in) = $3 in let (t_in, e_in) = $3 in
let (t_out, e_out) = $7 in let (t_out, e_out) = $7 in
@ -202,6 +202,11 @@ node_content:
n_type = FTArr (t_in, t_out); } in n_type = FTArr (t_in, t_out); } in
Hashtbl.add defined_nodes node_name n; n }; Hashtbl.add defined_nodes node_name n; n };
OPTIONAL_SEMICOL:
| /* empty */ {}
| SEMICOL {}
;
in_params: in_params:
| /* empty */ { (FTList [], []) } | /* empty */ { (FTList [], []) }
| param_list { $1 } | param_list { $1 }