如何在BNFC定义中使用空格?
例如,假设我想为 lambda 演算生成一个解析器,其中允许抽象变量列表:
\x y z.x z (y z)
“显而易见”的事情是使用标记规则,例如:
ListAbs . Exp ::= "\\" [Ident] "." Exp ;
separator Ident " "
但是,BNFC 默认剥离空白,因此不起作用。起作用的是使用逗号分隔符。有点丑,但我可以忍受它......仍然能够通过空间分开很好。
BNFC 中是否有空白字符类?
如何在BNFC定义中使用空格?
例如,假设我想为 lambda 演算生成一个解析器,其中允许抽象变量列表:
\x y z.x z (y z)
“显而易见”的事情是使用标记规则,例如:
ListAbs . Exp ::= "\\" [Ident] "." Exp ;
separator Ident " "
但是,BNFC 默认剥离空白,因此不起作用。起作用的是使用逗号分隔符。有点丑,但我可以忍受它......仍然能够通过空间分开很好。
BNFC 中是否有空白字符类?
您可以将空字符串声明为分隔符:
separator Ident ""
在实践中,这允许您使用空格(或任何空格字符)作为分隔符:
$ cat test.cf
A . A ::= [Ident] ;
separator Ident ""
$ bnfc -haskell -m test.cf
$ make
$ echo 'x y z' | ./Testtest
Parse Successful!
[Abstract Syntax]
A [Ident "x",Ident "y",Ident "z"]
[Linearized tree]
x y z