2013-09-10 6 views
1

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

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

\x y z.x z (y z) 

«очевидный», что нужно сделать, это использовать меченый правило, как:

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

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

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

ответ

2

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

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 
Смежные вопросы