summaryrefslogtreecommitdiffstats
path: root/src/Backtrace/parser.y
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2009-11-23 16:52:50 +0100
committerKarel Klic <kklic@redhat.com>2009-11-23 16:52:50 +0100
commit4d725ba7f708087099496145a953064aded60365 (patch)
tree29551f955fd3ef19b17ef9872ca10d8e24e78013 /src/Backtrace/parser.y
parentb8da7620a417ef835869da692db140b75e8b7a93 (diff)
downloadabrt-4d725ba7f708087099496145a953064aded60365.tar.gz
abrt-4d725ba7f708087099496145a953064aded60365.tar.xz
abrt-4d725ba7f708087099496145a953064aded60365.zip
Backtrace detector improvements.
Diffstat (limited to 'src/Backtrace/parser.y')
-rw-r--r--src/Backtrace/parser.y87
1 files changed, 65 insertions, 22 deletions
diff --git a/src/Backtrace/parser.y b/src/Backtrace/parser.y
index 1062ae87..d9767ce7 100644
--- a/src/Backtrace/parser.y
+++ b/src/Backtrace/parser.y
@@ -48,10 +48,18 @@ void yyerror(char const *s)
/* Bison declarations. */
%type <backtrace> backtrace ignoredpart_backtrace
%type <thread> threads thread
-%type <frame> frames frame
+%type <frame> frames frame frame_head frame_head_1 frame_head_2 frame_head_3 frame_head_4 frame_head_5
%type <strbuf> identifier hexadecimal_digit_sequence hexadecimal_number file_name file_location function_call function_name digit_sequence frame_address_in_function
-%type <c> nondigit digit hexadecimal_digit file_name_char '(' ')' '+' '-' '/' '.' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z' '_' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' '\'' '`' ',' '#' '@' '<' '>' '=' ':' '"' ';' ' ' '\n' '\t' '\\' '!' '*' '%' '|' '^' '&' '$'
-%type <num> frame_head
+%type <c> nondigit digit hexadecimal_digit file_name_char
+ '(' ')' '+' '-' '/' '.' '_' '~'
+ 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l'
+ 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z'
+ 'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N'
+ 'O' 'P' 'Q' 'R' 'S' 'T' 'U' 'V' 'W' 'X' 'Y' 'Z'
+ '0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
+ '\'' '`' ',' '#' '@' '<' '>' '=' ':' '"' ';' ' '
+ '\n' '\t' '\\' '!' '*' '%' '|' '^' '&' '$'
+%type <num> frame_start
%destructor { thread_free($$); } <thread>
%destructor { frame_free($$); } <frame>
@@ -69,7 +77,18 @@ backtrace : /* empty */ { $$ = g_backtrace = backtrace_new(); }
;
/**/
-ignoredpart_backtrace : threads { $$ = backtrace_new(); $$->threads = $1; }
+ignoredpart_backtrace : frame_head wss threads
+ {
+ $$ = backtrace_new();
+ $$->threads = $3;
+ $$->crash = $1;
+ }
+ | frame wss threads
+ {
+ $$ = backtrace_new();
+ $$->threads = $3;
+ $$->crash = $1;
+ }
| anychar ignoredpart_backtrace { $$ = $2; }
;
@@ -100,7 +119,14 @@ frames : frame { $$ = $1; }
| frames wsa frame { $$ = frame_add_sibling($1, $3); }
;
-frame : frame_head wss function_call wsa keyword_at wss file_location wss variables %dprec 2
+frame : frame_head_1 wss variables %dprec 2
+ | frame_head_2 wss variables %dprec 3
+ | frame_head_3 wss variables %dprec 3
+ | frame_head_4 wss variables %dprec 1
+ | frame_head_5 wss variables
+;
+
+frame_head_1 : frame_start wss function_call wsa keyword_at wss file_location
{
$$ = frame_new();
$$->number = $1;
@@ -109,7 +135,9 @@ frame : frame_head wss function_call wsa keyword_at wss file_location wss va
$$->sourcefile = $7->buf;
strbuf_free_nobuf($7);
}
- | frame_head wss frame_address_in_function wss keyword_at wss file_location wss variables %dprec 3
+;
+
+frame_head_2 : frame_start wss frame_address_in_function wss keyword_at wss file_location
{
$$ = frame_new();
$$->number = $1;
@@ -118,7 +146,9 @@ frame : frame_head wss function_call wsa keyword_at wss file_location wss va
$$->sourcefile = $7->buf;
strbuf_free_nobuf($7);
}
- | frame_head wss frame_address_in_function wss keyword_from wss file_location wss variables %dprec 3
+;
+
+frame_head_3 : frame_start wss frame_address_in_function wss keyword_from wss file_location
{
$$ = frame_new();
$$->number = $1;
@@ -127,22 +157,31 @@ frame : frame_head wss function_call wsa keyword_at wss file_location wss va
$$->sourcefile = $7->buf;
strbuf_free_nobuf($7);
}
- | frame_head wss frame_address_in_function wss variables %dprec 1
+;
+
+frame_head_4 : frame_start wss frame_address_in_function
{
$$ = frame_new();
$$->number = $1;
$$->function = $3->buf;
strbuf_free_nobuf($3);
}
- | frame_head wss keyword_sighandler wss variables
+;
+
+frame_head_5 : frame_start wss keyword_sighandler
{
$$ = frame_new();
$$->number = $1;
}
-;
+frame_head : frame_head_1 %dprec 2
+ | frame_head_2 %dprec 3
+ | frame_head_3 %dprec 3
+ | frame_head_4 %dprec 1
+ | frame_head_5
+;
-frame_head : '#' digit_sequence
+frame_start: '#' digit_sequence
{
if (sscanf($2->buf, "%d", &$$) != 1)
{
@@ -168,13 +207,16 @@ file_location : file_name ':' digit_sequence
| file_name
;
-variables : variables_char
- | variables variables_char
- | variables variables_wss variables_char
- | variables '\n' variables_char_no_framestart
- | variables variables_wss '\n' variables_wss variables_char_no_framestart
- | variables variables_wss '\n' variables_char_no_framestart
- | variables '\n' variables_wss variables_char_no_framestart
+variables : variables_line '\n'
+ | variables_line variables_wss '\n'
+ | variables variables_line '\n'
+ | variables variables_wss variables_line '\n'
+ | variables variables_wss variables_line variables_wss '\n'
+;
+
+variables_line : variables_char_no_framestart
+ | variables_line variables_char
+ | variables_line variables_wss variables_char
;
variables_ws : '\t' | ' '
@@ -184,14 +226,14 @@ variables_wss : variables_ws
| variables_wss variables_ws
;
- /* We hope variables in frame never contain # character. */
variables_char : '#' | variables_char_no_framestart
;
variables_char_no_framestart : digit | nondigit | '(' | ')' | '+' | '-' | '<'
| '>' | '"' | '/' | '.' | '[' | ']' | '?' | '\''
| '`' | ',' | '=' | '{' | '}' | '^' | '&' | '$'
- | ':' | ';' | '\\' | '!' | '@' | '*' | '%' | '|'
+ | ':' | ';' | '\\' | '!' | '@' | '*' | '%' | '|'
+ | '~'
function_call : function_name wsa function_args
;
@@ -215,8 +257,9 @@ function_args_sequence : function_args_char
| function_args_sequence wsa function_args_char
;
-function_args_char : digit | nondigit | '{' | '}' | '<' | '>' | '"'
- | '=' | '-' | '+' | '@' | ',' | '.' | '[' | ']' | '/'
+function_args_char : digit | nondigit | '{' | '}' | '<' | '>' | '"' | ':' | '~'
+ | '=' | '-' | '+' | '@' | ',' | '.' | '[' | ']' | '/' | '%'
+ | '\\'
;
file_name : file_name_char { $$ = strbuf_new(); strbuf_append_char($$, $1); }