lexer for IEEE488.2 numbers

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

lexer for IEEE488.2 numbers

dieter
Hi all,

I am writing a lexer for a SCPI parser. The number format of 488.2 is more tolerant than
list_to_float/1, it seems.
.123 and 456. are both valid in 488.2, but list_to_float/1 rejects them.

I have not yet found an erlang alternative to list_to_float/1,
my current approach is to add the omitted zeroes and feed the patched string to list_to_float/1.

This works if the number is only a mantissa, but
it gets a bit more complicated when there is also an exponent, like 123.e11
my leex expression for the number looks like

{MANTISSA}{EXPONENT} : {token, {float, TokenLine, i488tofloat(TokenChars)}}.

With this approach, I have to parse the string in my function a second time, which is not elegant at all.

Is there a way to have access to the regex macros (or regex groups) on the left side, like \1, \2?

I already tried to push back zeroes, but immediately ran into the promised consequences from note 4 on
http://erlang.org/doc/man/leex.html, so I quickly left that alley.

The question might be heretic, but why is list_to_float so strict? Every calculator allows to omit a leading 0 before the decimal point.

Kind regards,
Dieter





_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Reply | Threaded
Open this post in threaded view
|

Re: lexer for IEEE488.2 numbers

Mikael Pettersson-5
On Thu, Apr 25, 2019 at 6:04 PM <[hidden email]> wrote:

>
> Hi all,
>
> I am writing a lexer for a SCPI parser. The number format of 488.2 is more tolerant than
> list_to_float/1, it seems.
> .123 and 456. are both valid in 488.2, but list_to_float/1 rejects them.
>
> I have not yet found an erlang alternative to list_to_float/1,
> my current approach is to add the omitted zeroes and feed the patched string to list_to_float/1.
>
> This works if the number is only a mantissa, but
> it gets a bit more complicated when there is also an exponent, like 123.e11
> my leex expression for the number looks like
>
> {MANTISSA}{EXPONENT} : {token, {float, TokenLine, i488tofloat(TokenChars)}}.
>
> With this approach, I have to parse the string in my function a second time, which is not elegant at all.
>
> Is there a way to have access to the regex macros (or regex groups) on the left side, like \1, \2?
>
> I already tried to push back zeroes, but immediately ran into the promised consequences from note 4 on
> http://erlang.org/doc/man/leex.html, so I quickly left that alley.
>
> The question might be heretic, but why is list_to_float so strict? Every calculator allows to omit a leading 0 before the decimal point.

list_to_float is there to convert Erlang-style floating-point numbers,
not anyone else's, and since Erlang has some restrictions(*) on its
floats, that's reflected in this function.
This is normal.  C's strtoul() for instance can't convert Erlang-style
Base#Digits numbers.

You have two options: either fix up the string to match Erlang's
syntax before passing it to list_to_integer (which is what you're
already doing) or write your own stand-alone conversion code.  I'd
usually do the latter.

(*) Apart from syntax Erlang's floats are restricted to "finite"
values: infinities and NaNs are not permitted anywhere.  I don't
approve of this restriction, but it's there.
_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions
Reply | Threaded
Open this post in threaded view
|

Re: lexer for IEEE488.2 numbers

dieter
Hello Mikael,


thank you for the explanation!
Of course the reasons for the implementation of list_to_float/1 is due to the erlang requirements.
When your mileage varies, you have to walk a bit..


Right now I have implemented my conversion with some regular expressions, as I need this only
for reading configuration definitions, which is not performance-critical.


kind regards,
dieter


On 27.04.19 10:30, Mikael Pettersson wrote:
On Thu, Apr 25, 2019 at 6:04 PM [hidden email] wrote:
Hi all,

I am writing a lexer for a SCPI parser. The number format of 488.2 is more tolerant than
list_to_float/1, it seems.
.123 and 456. are both valid in 488.2, but list_to_float/1 rejects them.

I have not yet found an erlang alternative to list_to_float/1,
my current approach is to add the omitted zeroes and feed the patched string to list_to_float/1.

This works if the number is only a mantissa, but
it gets a bit more complicated when there is also an exponent, like 123.e11
my leex expression for the number looks like

{MANTISSA}{EXPONENT} : {token, {float, TokenLine, i488tofloat(TokenChars)}}.

With this approach, I have to parse the string in my function a second time, which is not elegant at all.

Is there a way to have access to the regex macros (or regex groups) on the left side, like \1, \2?

I already tried to push back zeroes, but immediately ran into the promised consequences from note 4 on
http://erlang.org/doc/man/leex.html, so I quickly left that alley.

The question might be heretic, but why is list_to_float so strict? Every calculator allows to omit a leading 0 before the decimal point.
list_to_float is there to convert Erlang-style floating-point numbers,
not anyone else's, and since Erlang has some restrictions(*) on its
floats, that's reflected in this function.
This is normal.  C's strtoul() for instance can't convert Erlang-style
Base#Digits numbers.

You have two options: either fix up the string to match Erlang's
syntax before passing it to list_to_integer (which is what you're
already doing) or write your own stand-alone conversion code.  I'd
usually do the latter.

(*) Apart from syntax Erlang's floats are restricted to "finite"
values: infinities and NaNs are not permitted anywhere.  I don't
approve of this restriction, but it's there.

_______________________________________________
erlang-questions mailing list
[hidden email]
http://erlang.org/mailman/listinfo/erlang-questions