如何在 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
我有以下语法
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