这只是一个有缺陷的语法吗



我查看了focal的语法,发现有人定义了他们的数字如下:

number
: mantissa ('e' signed_)?
;
mantissa
: signed_
| (signed_ '.')
| ('.' signed_)
| (signed_ '.' signed_)
;
signed_
: PLUSMIN? INTEGER
;
PLUSMIN
: '+'
| '-'
;

我很好奇,因为我认为这意味着,例如,1。-1将被语法识别为数字,而不是减法。有unsigned_的分支是否值得防止此问题?我想这对作者来说更像是一个问题,但以这种方式构建它有什么好处吗(除了明显避免浮点运算和int运算之外(?

它不一定有缺陷。

它似乎确实会将1.-1识别为mantissa。然而,这并不意味着某些解析后验证没有发现这个问题。

如果对1。

有时,识别一个无效的构造并为"解释此输入的唯一方法"生成解析树是很有用的,然后您可以在侦听器中检测到它,并向用户提供一条错误消息,该消息可能比ANTLR生成的默认消息更有意义。

再说一遍,这也可能只是一个疏忽。

另一方面,"signed_'规则是:
signed_ : PLUSMIN? INTEGER;

代替

signed_ : PLUSMIN? INTEGER+;

确实让人怀疑这个语法是一个很好的例子

你的分析在我看来是正确的:

  • 1.-1被识别为数字
  • 带有unsigned_的分支可以修复它

说这是"flawd";尝起来像是一种价值判断,似乎并不相关。

如果这是为了我自己的用途,我更喜欢:

  • 将0.-4识别为无效数字
  • 识别-.4为有效数字

所以我更喜欢这样的东西:

number
: signed_float('e' signed_integer)?
;
signed_float
: PLUSMIN? unsigned_float
;
unsigned_float
: integer
| (integer '.')
| ('.' integer)
| (integer'.' integer)
;
signed_integer
: PLUSMIN? unsigned_integer
;
PLUSMIN
: '+'
| '-'
;

相关内容

  • 没有找到相关文章

最新更新