Я пишу свою собственную грамматику языка программирования с использованием BNFC для дальнейшей интерпретации в Haskell. По инструкции BNFC:
separator nonempty Stm ";" ;
является сокращением для набора правил:
(:[]). [Stm] ::= Stm ;
(:). [Stm] ::= Stm ";" [Stm] ;
Это правило почти соответствует моим потребностям, но я также хотел бы, чтобы моя грамматика принимала пустой список и запрещала конечный разделитель. Другими словами, даны правила:
ParseResult. S ::= "[" [Integer] "]" ;
separator nonempty Integer "," ;
Я бы хотел, чтобы []
был допустимым входным значением, в результате чего ParseResult []
. В то же время, [1, 2]
должно привести к ParseResult [1, 2]
, но [1,2,]
не должно быть выводимым. Эта проблема упоминается в руководстве:
Задача . Грамматика, сгенерированная из разделителя без непустой воли
на самом деле также принять список, заканчивающийся точкой с запятой, тогда как
Pretty-Printer «нормализует» его. Это можно считать ошибкой,
но набор правил, запрещающих завершающую точку с запятой, будет намного
более сложный Непустой случай строгий.
Мне не удалось найти или найти простое решение. Это легко сделать?