In my lexer & parser by ocamllex and ocamlyacc, I have a .mly
as follows:
%{
open Params
open Syntax
%}
main:
| expr EOF { $1 }
expr:
| INTEGER { EE_integer $1 }
| LBRACKET expr_separators RBRACKET { EE_brackets (List.rev $2) }
expr_separators:
/* empty */ { [] }
| expr { [$1] }
| expr_separators ...... expr_separators { $3 :: $1 }
In params.ml
, a variable separator
is defined. Its value is either ;
or ,
and set by the upstream system.
In the .mly
, I want the rule of expr_separators
to be defined based on the value of Params.separator
. For example, when params.separtor
is ;
, only [1;2;3]
is considered as expr
, whereas [1,2,3]
is not. When params.separtor
is ,
, only [1,2,3]
is considered as expr
, whereas [1;2;3]
is not.
Does anyone know how to amend the lexer and parser to realize this?
PS:
The value of Params.separator
is set before the parsing, it will not change during the parsing.
At the moment, in the lexer, ,
returns a token COMMA
and ;
returns SEMICOLON
. In the parser, there are other rules where COMMA
or SEMICOLON
are involved.
I just want to set a rule expr_separators
such that it considers ;
and ignores ,
(which may be parsed by other rules), when Params.separator
is ;
; and it considers ,
and ignore ;
(which may be parsed by other rules), when Params.separator
is ,
.