如何在BNFC中为hex int编写语法?

时间:2017-05-16 18:55:43

标签: bnfc

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

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

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

然而,它无法解析“0xff”,因为词法分析器将“ff”视为单个标记。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

separator HexDigit "" ;

答案 1 :(得分:0)

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

但是,您可以为十六进制编写令牌规则:

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