Как написать грамматику для шестнадцатеричных чисел в BNFC?

Вот крошечная грамматика для шестнадцатеричных целых чисел.

Numbers . Numbers ::= [HexInt];
separator HexInt " " ;

token HexDigit ["0123456789abcdefABCDEF"] ;
rules HexInt ::= "0x" [HexDigit] ;
separator HexDigit "" ;

Однако он не может проанализировать "0xff", потому что лексер обрабатывает "ff" как один токен. Как мне это исправить?

2 ответа

В BNFC следующее объявление говорит, что HexDigitsдолжны быть разделены пробелами (не ничем , как может показаться):

      separator HexDigit "" ;

Нет простого способа исправить это. Кажется, есть ошибка в BNFC, которая включает в себя встроенное правило для Ident даже если ваша грамматика не использует его, и она имеет приоритет над HexDigit в вашем примере (выигрывает самый длинный матч).

Однако вы можете написать правило токена для шестнадцатеричных чисел:

token HexInt ({"0x"} ["0123456789abcdefABCDEF"] +) ;
Другие вопросы по тегам