I want to parse numbers such that: -- zero is 0.0 -- numbers not equal zero are always signed with + or - -- both parts before and after dot are obligatory -- trailing or heading zeros are not allowed
Valid numbers: 0.0 +2.0 -0.2 +201.0 -0.0004 -1.05 +22.10001 Invalid numbers: +0.0 (signed zero, should be 0.0) +02.0 (heading zero, should be +2.0) -2.00100 (trailing zeros, should be -2.001) My grammar is: Numb ~ '0.0' | Numb_Signed Numb_Signed ~ Numb_Sign Numb_Rest Numb_Sign ~ '-' | '+' Numb_Rest ~ Numb_Rest_Both | Numb_Rest_Left | Numb_Rest_Right Numb_Rest_Both ~ Nonzero Digits_Or_Nothing '.' Digits_Or_Nothing Nonzero Numb_Rest_Left ~ Nonzero Digits_Or_Nothing '.0' Numb_Rest_Right ~ '0.' Digits_Or_Nothing Nonzero Digits ~ Digit+ Digits_Or_Nothing ~ Digit* Digit ~ [0-9] Nonzero ~ [1-9] Is there a more simple solution? Or this is optimal? More questions: (1) is there a possibility to restrict numbers to be maximu 15 characters long? (2) is it possible to read all digits after dot, because when it parses string "+1.000" it prints that it stopped parsing before "00", and for users it would be better to show that whole number failed, that is "+1.000"; so is there something like in perl6 grammars "not before": Numb_Signed ~ Numb_Sign Numb_Rest <HERE NOT BEFORE ANY DIGIT> Error: Error in SLIF parse: No lexeme found at line 1, column 9 * String before error: +1.0 * The error was at line 1, column 9, and at character 0x0030 '0', ... * here: 00 Marpa::R2 exception at ./lnaznum.pl line 68. -- You received this message because you are subscribed to the Google Groups "marpa parser" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
