Fsyacc: добавлен элемент с тем же ключом

#f# #fsyacc

#f# #fsyacc

Вопрос:

Я начинаю играть с Fslex / Fsyacc. При попытке сгенерировать анализатор, используя этот ввод

Синтаксический анализатор.fsy:

 %{
open Ast
%}

// The start token becomes a parser function in the compiled code:
%start start

// These are the terminal tokens of the grammar along with the types of
// the data carried by each token:
%token <System.Int32> INT
%token <System.String> STRING
%token <System.String> ID
%token PLUS MINUS ASTER SLASH LT LT EQ GTE GT
%token LPAREN RPAREN LCURLY RCURLY LBRACKET RBRACKET COMMA
%token ARRAY IF THEN ELSE WHILE FOR TO DO LET IN END OF BREAK NIL FUNCTION VAR TYPE IMPORT PRIMITIVE
%token EOF

// This is the type of the data produced by a successful reduction of the 'start'
// symbol:
%type <Ast.Program> start

%%

// These are the rules of the grammar along with the F# code of the 
// actions executed as rules are reduced.  In this case the actions 
// produce data using F# data construction terms.
start: Prog { Program($1) }

Prog:
    | Expr EOF                  { $1 }

Expr: 
    // literals
    | NIL                   { Ast.Nil ($1) }
      | INT                       { Ast.Integer($1) }
    | STRING                    { Ast.Str($1) }

    // arrays and records
    | ID LBRACKET Expr RBRACKET OF Expr { Ast.Array ($1, $3, $6) } 
    | ID LCURLY AssignmentList RCURLY { Ast.Record ($1, $3) }

AssignmentList:
    | Assignment { [$1] }
    | Assignment COMMA AssignmentList {$1 :: $3 }

Assignment:
    | ID EQ Expr { Ast.Assignment ($1,$3) }
  

Ast.fs

 namespace Ast
open System

type Integer = 
    | Integer of Int32

and Str = 
    | Str of string

and Nil = 
    | None

and Id = 
    | Id of string

and Array = 
    | Array of Id * Expr * Expr

and Record = 
    | Record of Id * (Assignment list)

and Assignment = 
    | Assignment of Id * Expr

and Expr =
    | Nil
    | Integer
    | Str
    | Array
    | Record

and Program =
    | Program of Expr
  

Fsyacc сообщает о следующей ошибке: «FSYACC: ошибка FSY000: элемент с тем же ключом уже добавлен».

Я считаю, что проблема заключается в производстве для AssignmentList , но не могу найти обходной путь…

Любые советы будут оценены

Ответ №1:

Ненавижу отвечать на свои собственные вопросы, но проблема была здесь (строка 15 входного файла синтаксического анализатора)

% токен ПЛЮС МИНУС КОСАЯ ЧЕРТА ASTER LT, УРАВНЕНИЕ GTE GT

Обратите внимание на двойное определение (должно было быть LTE)

Я голосую за то, чтобы найти способ улучшить вывод исполняемых файлов Fslex / Fsyacc / задач msbuild