fix floating-point parsing, error reporting
This commit is contained in:
parent
4cd50fa68d
commit
edb684b709
File diff suppressed because it is too large
Load Diff
|
|
@ -27,7 +27,6 @@
|
|||
|
||||
#include "vrmlNode.h"
|
||||
#include "vrmlParser.h"
|
||||
#include "indent.h"
|
||||
#include "pnotify.h"
|
||||
|
||||
static int yyinput(void); // declared by flex.
|
||||
|
|
@ -37,10 +36,9 @@ extern "C" int vrmlyywrap();
|
|||
// Static variables
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
// We'll increment line_number and col_number as we parse the file, so
|
||||
// We'll increment line_number as we parse the file, so
|
||||
// that we can report the position of an error.
|
||||
static int line_number = 0;
|
||||
static int col_number = 0;
|
||||
|
||||
// current_line holds as much of the current line as will fit. Its
|
||||
// only purpose is for printing it out to report an error to the user.
|
||||
|
|
@ -81,7 +79,6 @@ vrml_init_lexer(istream &in, const string &filename) {
|
|||
inp = ∈
|
||||
vrml_filename = filename;
|
||||
line_number = 0;
|
||||
col_number = 0;
|
||||
error_count = 0;
|
||||
warning_count = 0;
|
||||
}
|
||||
|
|
@ -102,10 +99,8 @@ vrmlyyerror(const string &msg) {
|
|||
cerr << " in " << vrml_filename;
|
||||
}
|
||||
cerr
|
||||
<< " at line " << line_number << ", column " << col_number << ":\n"
|
||||
<< " at line " << line_number << ":\n"
|
||||
<< current_line << "\n";
|
||||
indent(cerr, col_number-1)
|
||||
<< "^\n" << msg << "\n\n";
|
||||
|
||||
error_count++;
|
||||
}
|
||||
|
|
@ -117,10 +112,8 @@ vrmlyywarning(const string &msg) {
|
|||
cerr << " in " << vrml_filename;
|
||||
}
|
||||
cerr
|
||||
<< " at line " << line_number << ", column " << col_number << ":\n"
|
||||
<< " at line " << line_number << ":\n"
|
||||
<< current_line << "\n";
|
||||
indent(cerr, col_number-1)
|
||||
<< "^\n" << msg << "\n\n";
|
||||
|
||||
warning_count++;
|
||||
}
|
||||
|
|
@ -146,7 +139,6 @@ input_chars(char *buffer, int &result, int max_size) {
|
|||
strncpy(current_line, vrmlyytext, max_error_width);
|
||||
current_line[max_error_width] = '\0';
|
||||
line_number++;
|
||||
col_number = 0;
|
||||
|
||||
// Truncate it at the newline.
|
||||
char *end = strchr(current_line, '\n');
|
||||
|
|
@ -192,7 +184,7 @@ void extract_vec(double vec[], int num_elements) {
|
|||
%x IN_SFS IN_MFS IN_SFIMG
|
||||
|
||||
/* Big hairy expression for floating point numbers: */
|
||||
float (-?(([0-9]+)|([0-9]*\.[0-9]+)([eE][+\-]?[0-9]+)?))
|
||||
float (-?((([0-9]+)|([0-9]*\.[0-9]+))([eE][+\-]?[0-9]+)?))
|
||||
|
||||
/* Ints are decimal or hex (0x##): */
|
||||
int (-?([0-9]+)|(0[xX][0-9a-fA-F]*))
|
||||
|
|
@ -204,6 +196,8 @@ int (-?([0-9]+)|(0[xX][0-9a-fA-F]*))
|
|||
ws ([ \t\r\n,]|(#.*))+
|
||||
/* And the same pattern without the newline */
|
||||
wsnnl ([ \t\r,]|(#.*))
|
||||
/* Here's a pattern that matches a single newline character. */
|
||||
nl ((\n)|(\n\r)|(\r\n)|(\r))
|
||||
|
||||
/* Legal characters to start an identifier */
|
||||
idStartChar ([^\x30-\x39\x00-\x20\x22\x23\x27\x2b-\x2e\x5b-\x5d\x7b\x7d])
|
||||
|
|
@ -259,7 +253,7 @@ idRestChar ([^\x00-\x20\x22\x23\x27\x2b-\x2c\x2e\x5b-\x5d\x7b\x7d])
|
|||
|
||||
/* This is more complicated than they really need to be because */
|
||||
/* I was ambitious and made the whitespace-matching rule aggressive */
|
||||
<INITIAL>"#VRML V2.0 utf8".*\n{wsnnl}* {
|
||||
<INITIAL>"#VRML V2.0 utf8".*{nl}{wsnnl}* {
|
||||
BEGIN NODE;
|
||||
}
|
||||
|
||||
|
|
@ -549,17 +543,30 @@ idRestChar ([^\x00-\x20\x22\x23\x27\x2b-\x2c\x2e\x5b-\x5d\x7b\x7d])
|
|||
}
|
||||
<IN_SFIMG>{int} { ++sfImageIntsParsed;
|
||||
if (sfImageIntsParsed == sfImageIntsExpected) {
|
||||
BEGIN NODE; expectToken = 0; return SFIMAGE;
|
||||
BEGIN NODE; expectToken = 0; return SFIMAGE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Whitespace and catch-all rules apply to all start states: */
|
||||
<*>{wsnnl}+ ;
|
||||
/* This is also whitespace, but we'll keep track of line number */
|
||||
<*>{wsnnl}+ ;
|
||||
|
||||
/* A newline is also whitespace, but we'll keep track of line number */
|
||||
/* to report in errors: */
|
||||
<*>{wsnnl}*\n{wsnnl}* ;
|
||||
<*>\n.* {
|
||||
// Save a copy of the line so we can print it out for the benefit of
|
||||
// the user in case we get an error.
|
||||
strncpy(current_line, yytext+1, max_error_width);
|
||||
current_line[max_error_width] = '\0';
|
||||
line_number++;
|
||||
|
||||
// Return the whole line to the lexer, except the newline character,
|
||||
// which we eat.
|
||||
yyless(1);
|
||||
}
|
||||
|
||||
/* This catch-all rule catches anything not covered by any of */
|
||||
/* the above: */
|
||||
<*>. { return yytext[0]; }
|
||||
<*>. {
|
||||
return yytext[0];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@
|
|||
|
||||
|
||||
/* Copy the first part of user declarations. */
|
||||
#line 27 "vrmlParser.yxx"
|
||||
#line 23 "vrmlParser.yxx"
|
||||
|
||||
|
||||
//
|
||||
|
|
@ -240,7 +240,7 @@ vrml_cleanup_parser() {
|
|||
#endif
|
||||
|
||||
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
|
||||
#line 120 "vrmlParser.yxx"
|
||||
#line 116 "vrmlParser.yxx"
|
||||
typedef union YYSTYPE {
|
||||
char *string;
|
||||
VrmlFieldValue fv;
|
||||
|
|
@ -460,14 +460,14 @@ static const yysigned_char yyrhs[] =
|
|||
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
|
||||
static const unsigned short int yyrline[] =
|
||||
{
|
||||
0, 151, 151, 159, 162, 169, 170, 174, 180, 186,
|
||||
195, 196, 200, 200, 206, 208, 206, 211, 213, 217,
|
||||
219, 222, 221, 233, 232, 245, 247, 251, 253, 255,
|
||||
257, 262, 267, 267, 271, 273, 277, 277, 284, 285,
|
||||
288, 289, 290, 290, 294, 296, 301, 302, 303, 304,
|
||||
305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
|
||||
315, 316, 317, 319, 320, 326, 327, 331, 335, 346,
|
||||
349
|
||||
0, 147, 147, 155, 158, 165, 166, 170, 176, 182,
|
||||
191, 192, 196, 196, 202, 204, 202, 207, 209, 213,
|
||||
215, 218, 217, 229, 228, 241, 243, 247, 249, 251,
|
||||
253, 258, 263, 263, 267, 269, 273, 273, 280, 281,
|
||||
284, 285, 286, 286, 290, 292, 297, 298, 299, 300,
|
||||
301, 302, 303, 304, 305, 306, 307, 308, 309, 310,
|
||||
311, 312, 313, 315, 316, 322, 323, 327, 331, 342,
|
||||
345
|
||||
};
|
||||
#endif
|
||||
|
||||
|
|
@ -1281,21 +1281,21 @@ yyreduce:
|
|||
switch (yyn)
|
||||
{
|
||||
case 2:
|
||||
#line 152 "vrmlParser.yxx"
|
||||
#line 148 "vrmlParser.yxx"
|
||||
{
|
||||
parsed_scene = (yyvsp[0].scene);
|
||||
}
|
||||
break;
|
||||
|
||||
case 3:
|
||||
#line 159 "vrmlParser.yxx"
|
||||
#line 155 "vrmlParser.yxx"
|
||||
{
|
||||
(yyval.scene) = new VrmlScene;
|
||||
}
|
||||
break;
|
||||
|
||||
case 4:
|
||||
#line 163 "vrmlParser.yxx"
|
||||
#line 159 "vrmlParser.yxx"
|
||||
{
|
||||
Declaration d;
|
||||
d._node = (yyvsp[0].nodeRef);
|
||||
|
|
@ -1305,7 +1305,7 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 7:
|
||||
#line 175 "vrmlParser.yxx"
|
||||
#line 171 "vrmlParser.yxx"
|
||||
{
|
||||
(yyval.nodeRef)._p = (yyvsp[0].node);
|
||||
(yyval.nodeRef)._type = SFNodeRef::T_unnamed;
|
||||
|
|
@ -1314,7 +1314,7 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 8:
|
||||
#line 181 "vrmlParser.yxx"
|
||||
#line 177 "vrmlParser.yxx"
|
||||
{
|
||||
(yyval.nodeRef)._p = (yyvsp[0].node);
|
||||
(yyval.nodeRef)._type = SFNodeRef::T_def;
|
||||
|
|
@ -1323,7 +1323,7 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 9:
|
||||
#line 187 "vrmlParser.yxx"
|
||||
#line 183 "vrmlParser.yxx"
|
||||
{
|
||||
(yyval.nodeRef)._p = NULL;
|
||||
(yyval.nodeRef)._type = SFNodeRef::T_use;
|
||||
|
|
@ -1332,44 +1332,44 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 12:
|
||||
#line 200 "vrmlParser.yxx"
|
||||
#line 196 "vrmlParser.yxx"
|
||||
{ beginProto((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 13:
|
||||
#line 202 "vrmlParser.yxx"
|
||||
#line 198 "vrmlParser.yxx"
|
||||
{ endProto(); free((yyvsp[-7].string));}
|
||||
break;
|
||||
|
||||
case 14:
|
||||
#line 206 "vrmlParser.yxx"
|
||||
#line 202 "vrmlParser.yxx"
|
||||
{ beginProto((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 15:
|
||||
#line 208 "vrmlParser.yxx"
|
||||
#line 204 "vrmlParser.yxx"
|
||||
{ expect(MFSTRING); }
|
||||
break;
|
||||
|
||||
case 16:
|
||||
#line 209 "vrmlParser.yxx"
|
||||
#line 205 "vrmlParser.yxx"
|
||||
{ endProto(); free((yyvsp[-6].string)); }
|
||||
break;
|
||||
|
||||
case 19:
|
||||
#line 217 "vrmlParser.yxx"
|
||||
#line 213 "vrmlParser.yxx"
|
||||
{ addEventIn((yyvsp[-1].string), (yyvsp[0].string));
|
||||
free((yyvsp[-1].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 20:
|
||||
#line 219 "vrmlParser.yxx"
|
||||
#line 215 "vrmlParser.yxx"
|
||||
{ addEventOut((yyvsp[-1].string), (yyvsp[0].string));
|
||||
free((yyvsp[-1].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 21:
|
||||
#line 222 "vrmlParser.yxx"
|
||||
#line 218 "vrmlParser.yxx"
|
||||
{
|
||||
int type = fieldType((yyvsp[-1].string));
|
||||
expect(type);
|
||||
|
|
@ -1377,7 +1377,7 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 22:
|
||||
#line 227 "vrmlParser.yxx"
|
||||
#line 223 "vrmlParser.yxx"
|
||||
{
|
||||
addField((yyvsp[-3].string), (yyvsp[-2].string), &((yyvsp[0].fv)));
|
||||
free((yyvsp[-3].string));
|
||||
|
|
@ -1386,7 +1386,7 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 23:
|
||||
#line 233 "vrmlParser.yxx"
|
||||
#line 229 "vrmlParser.yxx"
|
||||
{
|
||||
int type = fieldType((yyvsp[-1].string));
|
||||
expect(type);
|
||||
|
|
@ -1394,7 +1394,7 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 24:
|
||||
#line 238 "vrmlParser.yxx"
|
||||
#line 234 "vrmlParser.yxx"
|
||||
{
|
||||
addExposedField((yyvsp[-3].string), (yyvsp[-2].string), &((yyvsp[0].fv)));
|
||||
free((yyvsp[-3].string));
|
||||
|
|
@ -1403,51 +1403,51 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 27:
|
||||
#line 251 "vrmlParser.yxx"
|
||||
#line 247 "vrmlParser.yxx"
|
||||
{ addEventIn((yyvsp[-1].string), (yyvsp[0].string));
|
||||
free((yyvsp[-1].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 28:
|
||||
#line 253 "vrmlParser.yxx"
|
||||
#line 249 "vrmlParser.yxx"
|
||||
{ addEventOut((yyvsp[-1].string), (yyvsp[0].string));
|
||||
free((yyvsp[-1].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 29:
|
||||
#line 255 "vrmlParser.yxx"
|
||||
#line 251 "vrmlParser.yxx"
|
||||
{ addField((yyvsp[-1].string), (yyvsp[0].string));
|
||||
free((yyvsp[-1].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 30:
|
||||
#line 257 "vrmlParser.yxx"
|
||||
#line 253 "vrmlParser.yxx"
|
||||
{ addExposedField((yyvsp[-1].string), (yyvsp[0].string));
|
||||
free((yyvsp[-1].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 31:
|
||||
#line 263 "vrmlParser.yxx"
|
||||
#line 259 "vrmlParser.yxx"
|
||||
{ free((yyvsp[-6].string)); free((yyvsp[-4].string)); free((yyvsp[-2].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 32:
|
||||
#line 267 "vrmlParser.yxx"
|
||||
#line 263 "vrmlParser.yxx"
|
||||
{ enterNode((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 33:
|
||||
#line 268 "vrmlParser.yxx"
|
||||
#line 264 "vrmlParser.yxx"
|
||||
{ (yyval.node) = exitNode(); free((yyvsp[-4].string));}
|
||||
break;
|
||||
|
||||
case 36:
|
||||
#line 277 "vrmlParser.yxx"
|
||||
#line 273 "vrmlParser.yxx"
|
||||
{ enterField((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 37:
|
||||
#line 279 "vrmlParser.yxx"
|
||||
#line 275 "vrmlParser.yxx"
|
||||
{
|
||||
storeField((yyvsp[0].fv));
|
||||
exitField();
|
||||
|
|
@ -1456,44 +1456,44 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 40:
|
||||
#line 288 "vrmlParser.yxx"
|
||||
#line 284 "vrmlParser.yxx"
|
||||
{ inScript(); free((yyvsp[-1].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 41:
|
||||
#line 289 "vrmlParser.yxx"
|
||||
#line 285 "vrmlParser.yxx"
|
||||
{ inScript(); free((yyvsp[-1].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 42:
|
||||
#line 290 "vrmlParser.yxx"
|
||||
#line 286 "vrmlParser.yxx"
|
||||
{ inScript();
|
||||
int type = fieldType((yyvsp[-1].string));
|
||||
expect(type); }
|
||||
break;
|
||||
|
||||
case 43:
|
||||
#line 293 "vrmlParser.yxx"
|
||||
#line 289 "vrmlParser.yxx"
|
||||
{ free((yyvsp[-3].string)); free((yyvsp[-2].string)); }
|
||||
break;
|
||||
|
||||
case 44:
|
||||
#line 295 "vrmlParser.yxx"
|
||||
#line 291 "vrmlParser.yxx"
|
||||
{ inScript(); free((yyvsp[-3].string)); free((yyvsp[-2].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 45:
|
||||
#line 297 "vrmlParser.yxx"
|
||||
#line 293 "vrmlParser.yxx"
|
||||
{ inScript(); free((yyvsp[-3].string)); free((yyvsp[-2].string)); free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 63:
|
||||
#line 319 "vrmlParser.yxx"
|
||||
#line 315 "vrmlParser.yxx"
|
||||
{ (yyval.fv)._sfnode = (yyvsp[0].nodeRef); }
|
||||
break;
|
||||
|
||||
case 64:
|
||||
#line 321 "vrmlParser.yxx"
|
||||
#line 317 "vrmlParser.yxx"
|
||||
{
|
||||
(yyval.fv)._sfnode._p = NULL;
|
||||
(yyval.fv)._sfnode._type = SFNodeRef::T_null;
|
||||
|
|
@ -1502,24 +1502,24 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 65:
|
||||
#line 326 "vrmlParser.yxx"
|
||||
#line 322 "vrmlParser.yxx"
|
||||
{ (yyval.fv)._mf = (yyvsp[0].mfarray); }
|
||||
break;
|
||||
|
||||
case 66:
|
||||
#line 327 "vrmlParser.yxx"
|
||||
#line 323 "vrmlParser.yxx"
|
||||
{ free((yyvsp[0].string)); }
|
||||
break;
|
||||
|
||||
case 67:
|
||||
#line 332 "vrmlParser.yxx"
|
||||
#line 328 "vrmlParser.yxx"
|
||||
{
|
||||
(yyval.mfarray) = (yyvsp[-1].mfarray);
|
||||
}
|
||||
break;
|
||||
|
||||
case 68:
|
||||
#line 336 "vrmlParser.yxx"
|
||||
#line 332 "vrmlParser.yxx"
|
||||
{
|
||||
(yyval.mfarray) = new MFArray;
|
||||
VrmlFieldValue v;
|
||||
|
|
@ -1529,14 +1529,14 @@ yyreduce:
|
|||
break;
|
||||
|
||||
case 69:
|
||||
#line 346 "vrmlParser.yxx"
|
||||
#line 342 "vrmlParser.yxx"
|
||||
{
|
||||
(yyval.mfarray) = new MFArray;
|
||||
}
|
||||
break;
|
||||
|
||||
case 70:
|
||||
#line 350 "vrmlParser.yxx"
|
||||
#line 346 "vrmlParser.yxx"
|
||||
{
|
||||
VrmlFieldValue v;
|
||||
v._sfnode = (yyvsp[0].nodeRef);
|
||||
|
|
@ -1777,7 +1777,7 @@ yyreturn:
|
|||
}
|
||||
|
||||
|
||||
#line 358 "vrmlParser.yxx"
|
||||
#line 354 "vrmlParser.yxx"
|
||||
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -100,7 +100,7 @@
|
|||
|
||||
|
||||
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
|
||||
#line 120 "vrmlParser.yxx"
|
||||
#line 116 "vrmlParser.yxx"
|
||||
typedef union YYSTYPE {
|
||||
char *string;
|
||||
VrmlFieldValue fv;
|
||||
|
|
|
|||
Loading…
Reference in New Issue