如何在 PEG 语法中定义十进制数?

How do you define a decimal number in a PEG grammar?

我有以下语法

Arithmetic:
    Term     < Factor (Add / Sub)*
    Add      < "+" Factor
    Sub      < "-" Factor
    Factor   < Primary (Mul / Div)*
    Mul      < "*" Primary
    Div      < "/" Primary
    Primary  < Parens / Neg / Pos / Number / Variable
    Parens   < "(" Term ")"
    Neg      < "-" Primary
    Pos      < "+" Primary

    Dot      < "."
    Decimal  < ~(digit+ Dot? digit*)
    Integer  < digits
    Number   < Integer / Decimal

    Function < identifier (space+ Primary)+
    Variable <- identifier

大多数情况下一切正常,除了当我尝试解析小数时(例如 0.5)它不起作用。在 PEG 中定义 Decimal 解析器的正确语法是什么?

我正在使用 d-lang 中的 Pegged 库。有关文档,请参阅 here

由于已订购 PEG 替代品,因此您需要编写:

Number   < Decimal / Integer

正如所写,Integer / Decimal 将始终匹配数字开头的 Integer,因此永远不会尝试 Decimal

这一行有点奇怪:

Decimal  < ~(digit+ Dot? digit*)

注意 + 是贪心的(所有修饰符都是)所以如果 Dot 不匹配,其余必须为空。一种更简洁的方法是其中一种,具体取决于您喜欢缩写小数的方式:

Decimal <~ digit* (Dot digit*)? # matches `.`, `1.`, and `.5`, too.
Decimal <~ digit+ (Dot digit*)? / Dot digit+ # matches `1.` and `.5`
Decimal <~ digit* (Dot digit+)? / Dot digit+ # matches `.5`
Decimal <~ digit+ (Dot digit+)? # matches no abbreviated decimals