bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Bug Report Bison 3.0.4: parser crash when throwing syntax_error in C++ p


From: Denis T
Subject: Bug Report Bison 3.0.4: parser crash when throwing syntax_error in C++ parser with locations from mid-rule actions
Date: Fri, 25 Mar 2016 18:37:17 +0000

Hi,

I've found out that Bison 3.0.4 parser crashes when you attempt to throw 
syntax_error from any mid-rule action of C++ parser, which uses location 
tracking. Here's a simple example:

%code provides {
int yylex(yy::parser::semantic_type* type, const yy::parser::location_type* 
loc);
}

%require "3.0.4"
%language "C++"
%skeleton "lalr1.cc"
%locations
%define api.value.type {int}

%%

start:
    '1' '2' '3' { throw syntax_error(@1, "Test"); } '4' '5' '6' { $$ = 0; }
;

%%

void yy::parser::error(const yy::parser::location_type& loc, const std::string& 
message)
{
    std::cout << message << std::endl;
}

int yylex(yy::parser::semantic_type* type, const yy::parser::location_type* loc)
{
    static int start = '0';
    return ++start;
}

int main()
{
    yy::parser().parse();
}


The crash occurs in yyerrorlab, when trying to do something with locations, in 
the following autogenerated line:
 yyerror_range[1].location = yystack_[yylen - 1].location; // <- crash, as 
yylen = 0 here

Fortunately, there's an easy workaround for this bug: it's possible to move 
mid-rule action to another rule, and the issue doesn't reproduce anymore:
start:
    one_two_three '4' '5' '6' { $$ = 0; }
;

one_two_three:
    '1' '2' '3' { throw syntax_error(@1, "Test"); }
;


And a small another bug: it's currently not possible to use syntax_error class 
from outside grammar file, as it has inline constructor defined (c++.m4), which 
makes this class non-constructible from other cpp files, at least in Visual 
Studio 2015. Removing "inline" keyword solves this issue.
                                          

reply via email to

[Prev in Thread] Current Thread [Next in Thread]