g_scanner and negative num
- From: Wu Ming Wong <wuming wong gmail com>
- To: gtk-app-devel-list gnome org
- Subject: g_scanner and negative num
- Date: Tue, 7 Dec 2004 23:18:46 +1100
Hi all,
I am trying to use g_scanner to parse negative numbers so i decided to
use the suggestion below (read below). This works fine in parsing
negative numbers but it makes no distinction between text such as
"hello world - 2.3" and "hello world -2.3". Both will parse
-2.3
but in the first instance, i would prefer the '-' is treated as a
symbol and parsed as positive 2.3 instead of negative 2.3. Is there
any way to solve this problem?
with many thanks
wuming
-------
On Sun, 20 Sep 1998, David Bryant wrote:
Hi all,
I'm trying to use a GScanner to parse an rc-file for my proggie. The
problem is when parsing negative numbers I want the scanner to report a
negative-number, rather than a minus-sign followed by a positive-number.
ie,
here is my GScannerConfig:
GScannerConfig scanner_config =
{
" \t\n", /* cset_skip_characters */
(G_CSET_a_2_z /* cset_identifier_first */
"_"
G_CSET_A_2_Z),
(G_CSET_a_2_z /* cset_identifier_nth */
"_"
G_CSET_A_2_Z),
"#\n", /* cpair_comment_style */
0, /* case_sensitive */
TRUE, /* skip_comment_multi */
TRUE, /* skip_comment_single */
FALSE, /* scan_comment_multi */
TRUE, /* scan_identifier */
FALSE, /* scan_identifier_1char */
FALSE, /* scan_identifier_NULL */
TRUE, /* scan_symbols */
FALSE, /* scan_binary */
FALSE, /* scan_octal */
TRUE, /* scan_float */
FALSE, /* scan_hex */
FALSE, /* scan_hex_dollar */
FALSE, /* scan_string_sq */
FALSE, /* scan_string_dq */
FALSE, /* numbers_2_int */
TRUE, /* int_2_float */
FALSE, /* identifier_2_string */
TRUE, /* char_2_token */
FALSE /* symbol_2_token */
};
There doesn't seem to be any documentation on g_scanner_* yet, or is
there ?
nope, there is no explicit documentation yet, but you can use the gtkrc.c
source as example code (though the symbol_2_token=TRUE approach it takes
is somewhat ugly). other than that, gtk-list is the correct place to ask
questions about GScanner/Glib related stuff (unfortunately i get around to
read gtk-app-devel-list only rarely).
regarding negative numbers, doing that automatically is essentially a nono
for a lexical scanner since negating numbers is nearly always a parsing
issue (e.g. is a '-' an unary operator or an infix operator?).
if GScanner starts out on doing -5 magic, there is no good reason to not
also evaluate things like -5+7 or even 6^7 and return the resulting number,
because the differentiation between lexical scanning and parsing becomes
a grey zone.
this is also the reason why GTokenValue defines v_int as a gulong rather
than a glong.
to get negative numbers working correctly (as unary operator),
i usually use code like:
register gdouble number;
register gboolean negate;
negate = FALSE;
g_scanner_get_next_token (scanner);
while (scanner->token == '-')
{
negate = !negate;
g_scanner_get_next_token (scanner);
}
if (scanner->token == G_TOKEN_FLOAT)
number = scanner->value.v_float;
else if (scanner->token == G_TOKEN_INT)
number = scanner->value.v_int;
number = negate ? - number : number;
(as you have int_2_float=TRUE in your scanner config, you can even skip the
if (scanner->token == G_TOKEN_INT) check).
Thanks.
David Bryant
---
ciaoTJ
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]