В моем лексере и парсере от ocamllex и ocamlyacc у меня есть .mly
следующим образом:
%{
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 }
В params.ml
определена переменная separator
. Его значение равно ;
или ,
и устанавливается вышестоящей системой.
В .mly
я хочу, чтобы правило expr_separators
определялось на основе значения Params.separator
. Например, когда params.separtor
is ;
, только [1;2;3]
рассматривается как expr
, а [1,2,3]
- нет. Когда params.separtor
is ,
, только [1,2,3]
считается expr
, а [1;2;3]
- нет.
Кто-нибудь знает, как изменить лексический анализатор и парсер, чтобы это понять?
PS:
Значение Params.separator
устанавливается перед синтаксическим анализом, во время синтаксического анализа оно не изменится.
В настоящий момент в лексере ,
возвращает токен COMMA
, а ;
возвращает SEMICOLON
. В парсере есть и другие правила, в которых задействованы COMMA
или SEMICOLON
.
Я просто хочу установить правило expr_separators
таким образом, чтобы оно учитывало ;
и игнорировало ,
(которое может быть проанализировано другими правилами), когда Params.separator
равно ;
; и он считает ,
и игнорирует ;
(который может быть проанализирован другими правилами), когда Params.separator
равно ,
.