如何在 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 "" ;
这是十六进制整数的小语法。
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 "" ;