在 FSYACC 中,通常会有导致元组的终端。但是,为方便起见,我想改用记录类型。例如,如果我的抽象语法树 (AbstractSyntaxTree.fsl) 中有以下内容:
namespace FS
module AbstractSyntaxTree =
type B = { x : int; y : int }
type Either =
| Record of B
| Tuple of int * string
type A =
| Int of int
| String of string
| IntTuple of Either
我不清楚 FSYACC (parser.fsy) 中的正确语法,因为如果我使用:
%start a
%token <string> STRING
%token <System.Int32> INT
%token ATOMTOKEN TUPLETOKEN EOF
%type < A > a
%%
a:
| atomS { $1 }
| atomI { $1 }
| either { $1 }
atomI:
| ATOMTOKEN INT { Int($2) }
atomS:
| ATOMTOKEN STRING { String($2) }
either:
| TUPLETOKEN INT INT { Record {x=$2;y=$3} } // !!!
| TUPLETOKEN TUPLETOKEN INT STRING { Tuple( $3, $4) } // !!!
我希望推断出类型 B 和元组。但是,FSYACC 对标有“!!!”的两行都给出了错误:
This expression was expected to have type A but here has type Either
最后两行的“任一”生产的正确语法是什么?