Есть ли способ использовать пробелы в BNFC?

Как использовать пробелы в определении BNFC?

Например, предположим, что я хочу создать парсер для лямбда-исчисления, где я допускаю абстрагирование списка переменных:

\x y z.x z (y z)

"Очевидная" вещь - использовать правило с надписью:

ListAbs . Exp ::= "\\" [Ident] "." Exp ;
separator Ident " "

Однако BNFC по умолчанию отключает пробелы, поэтому это не работает. Что делает работа с помощью разделителя запятой. Немного уродливее, но я мог бы жить с ним... Тем не менее было бы неплохо иметь возможность разделить пространство.

Есть ли класс символов пробелов в BNFC?

1 ответ

Вы можете объявить пустую строку как разделитель:

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

licensed under cc by-sa 3.0 with attribution.