Как написать грамматику для шестнадцатеричных чисел в 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"] +) ;