Re: Unquoted strings in BASIC

Maury Markowitz <[email protected]> Tue, 3 Dec 2024 11:44:32 -0500
Newsgroups gmane.comp.parsers.bison.general
Message-ID <[email protected]>
> On Dec 1, 2024, at 2:07=E2=80=AFPM, James K. Lowden =
<[email protected]> wrote:
>=20
> require some real thinking, never easy.  For example, is
>=20
> 	10100 DATA "one",2B,"three"
>=20
> valid?  If it is, you'll need one pattern for "leading alpha" that =
might
> be just one character, and another for "leading digit" that requires

On further reflection, it seems it is much easier to parse everything in =
the data section as a string, and then turn it into a string or number =
at runtime based on the variable that's reading it. That's how INPUT =
works, so I can re-use that code.

So I made my DATA_STATEMENT state exclusive, and added these rules:

<DATA_STATEMENT>{
\"[^"^\n]*[\"\n] {
             yytext[strlen(yytext) - 1] =3D '\0';
             yylval.s =3D str_new(yytext + 1);
             return STRING;
           }

[^,:\n]* {
            yylval.s =3D str_new(yytext);
            return STRING;
          }
=20
[,] { return ','; }
[:] { BEGIN(INITIAL); return ':'; }
[\n] { BEGIN(INITIAL); return '\n'; }
}

This *almost* works!

The problem is leading whitespace. For instance:

10 DATA "one",two

In this case the second rule matches with the leading whitespace, so =
it's longer.

I played around with a couple of emulators to check the behaviour, and =
leading and trailing space are removed, so:

10 DATA one.    ,     two

Produces 'one' and 'two".

So, what's the easiest way to strip the white whitespace on either side, =
but NOT return them as part of the resulting string. Is this something I =
should do in my pattern, or better off in C code?=