我正在使用BNFC编写自己的编程语言语法,以便在Haskell中做进一步的解释。根据BNFC手册:
lib1
是一组规则的简写:
app
这条规则几乎可以满足我的需要,但是我也希望我的语法既接受空列表又禁止尾随分隔符。换句话说,给定规则:
lib2
我希望separator nonempty Stm ";" ;
是有效的输入,从而导致(:[]). [Stm] ::= Stm ;
(:). [Stm] ::= Stm ";" [Stm] ;
。同时,ParseResult. S ::= "[" [Integer] "]" ;
separator nonempty Integer "," ;
应该产生[]
,但是ParseResult []
不能派生。手册中提到了该问题:
问题。从分隔符生成的语法非空将 实际上还接受以分号结尾的列表,而 pretty-printer将其“标准化”。这可能被视为错误, 但是一套禁止终止分号的规则会很多 更复杂。非空情况很严格。
我无法找到或提出简单的解决方案。这可以轻松完成吗?