Список правил, запрещающих конечный разделитель в BNFC - PullRequest
0 голосов
/ 06 апреля 2019

Я пишу свою собственную грамматику языка программирования с использованием 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 «нормализует» его. Это можно считать ошибкой, но набор правил, запрещающих завершающую точку с запятой, будет намного более сложный Непустой случай строгий.

Мне не удалось найти или найти простое решение. Это легко сделать?

...