如何在 BNFC 中为十六进制整数编写语法?

How to write a grammar for hex ints in BNFC?

这是十六进制整数的小语法。

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

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

它无法解析“0xff”,但是,因为词法分析器将 "ff" 视为单个标记。我该如何解决?

没有简单的方法来修复它。 BNFC 中似乎有一个错误,它包含 Ident 的内置规则,即使您的语法没有使用它,并且在您的示例中它优先于 HexDigit (最长匹配胜)。

但是你可以为十六进制写一个令牌规则:

token HexInt ({"0x"} ["0123456789abcdefABCDEF"] +) ;

在 BNFC 中,以下声明表示 HexDigits 将由空格分隔(而不是看起来像 nothing):

separator HexDigit "" ;