summaryrefslogtreecommitdiffstats
path: root/src/Backtrace/parser.y
diff options
context:
space:
mode:
authorKarel Klic <kklic@redhat.com>2009-11-25 16:39:18 +0100
committerKarel Klic <kklic@redhat.com>2009-11-25 16:39:18 +0100
commit02e46d27da349907b2a1f389ce7043b6e40c45cb (patch)
tree93726630ecefd98a9787fd4121b10ebc42165a42 /src/Backtrace/parser.y
parent6b30462c4b8f65e7a76009cfd1308e651a973c58 (diff)
downloadabrt-02e46d27da349907b2a1f389ce7043b6e40c45cb.tar.gz
abrt-02e46d27da349907b2a1f389ce7043b6e40c45cb.tar.xz
abrt-02e46d27da349907b2a1f389ce7043b6e40c45cb.zip
Parser simplified and even more corner cases added. Backtrace file is now loaded into memory and preprocessed before parsing. Backtrace file size limit increased to ~20 MB
Diffstat (limited to 'src/Backtrace/parser.y')
-rw-r--r--src/Backtrace/parser.y120
1 files changed, 61 insertions, 59 deletions
diff --git a/src/Backtrace/parser.y b/src/Backtrace/parser.y
index 8512366a..ae068a13 100644
--- a/src/Backtrace/parser.y
+++ b/src/Backtrace/parser.y
@@ -48,7 +48,7 @@ void yyerror(char const *s)
/* Bison declarations. */
%token END 0 "end of file"
-%type <backtrace> backtrace ignoredpart_backtrace
+%type <backtrace> backtrace
%type <thread> threads thread
%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
@@ -74,33 +74,25 @@ void yyerror(char const *s)
%% /* The grammar follows. */
-backtrace : /* empty */ { $$ = g_backtrace = backtrace_new(); }
- | ignoredpart_backtrace wsa { $$ = g_backtrace = $1; }
-;
-
-/**/
-ignoredpart_backtrace : threads %dprec 2
- {
- $$ = backtrace_new();
- $$->threads = $1;
- }
- | frame_head wss threads %dprec 4
- {
- $$ = backtrace_new();
- $$->threads = $3;
- $$->crash = $1;
- }
- | frame wss threads %dprec 3
- {
- $$ = backtrace_new();
- $$->threads = $3;
- $$->crash = $1;
- }
- | anychar ignoredpart_backtrace %dprec 1 { $$ = $2; }
-;
-
-anychar : ws | digit | nondigit | '(' | ')' | '+' | '-' | '#' | '=' | ':' | ';'
- | '/' | '.' | '[' | ']' | '?' | '\'' | '`' | ',' | '<' | '>' | '"'
+backtrace : /* empty */ %dprec 1
+ { $$ = g_backtrace = backtrace_new(); }
+ | threads wsa %dprec 2
+ {
+ $$ = g_backtrace = backtrace_new();
+ $$->threads = $1;
+ }
+ | frame_head wss threads wsa %dprec 4
+ {
+ $$ = g_backtrace = backtrace_new();
+ $$->threads = $3;
+ $$->crash = $1;
+ }
+ | frame wss threads wsa %dprec 3
+ {
+ $$ = g_backtrace = backtrace_new();
+ $$->threads = $3;
+ $$->crash = $1;
+ }
;
threads : thread { $$ = $1; }
@@ -217,36 +209,32 @@ file_location : file_name ':' digit_sequence
variables : variables_line '\n'
| variables_line END
- | variables_line variables_wss '\n'
- | variables_line variables_wss END
+ | variables_line wss_nonl '\n'
+ | variables_line wss_nonl END
| variables variables_line '\n'
| variables variables_line END
- | variables variables_wss variables_line '\n'
- | variables variables_wss variables_line END
- | variables variables_wss variables_line variables_wss '\n'
- | variables variables_wss variables_line variables_wss END
+ | variables wss_nonl variables_line '\n'
+ | variables wss_nonl variables_line END
+ | variables wss_nonl variables_line wss_nonl '\n'
+ | variables wss_nonl variables_line wss_nonl END
;
variables_line : variables_char_no_framestart
| variables_line variables_char
- | variables_line variables_wss variables_char
-;
-
-variables_ws : '\t' | ' '
-;
-
-variables_wss : variables_ws
- | variables_wss variables_ws
+ | variables_line wss_nonl variables_char
;
variables_char : '#' | variables_char_no_framestart
;
-variables_char_no_framestart : digit | nondigit | '(' | ')' | '+' | '-' | '<'
- | '>' | '"' | '/' | '.' | '[' | ']' | '?' | '\''
- | '`' | ',' | '=' | '{' | '}' | '^' | '&' | '$'
- | ':' | ';' | '\\' | '!' | '@' | '*' | '%' | '|'
- | '~'
+/* Manually synchronized with function_args_char. */
+variables_char_no_framestart : digit | nondigit | '"' | '(' | ')'
+ | '+' | '-' | '<' | '>' | '/' | '.'
+ | '[' | ']' | '?' | '\'' | '`' | ','
+ | '=' | '{' | '}' | '^' | '&' | '$'
+ | ':' | ';' | '\\' | '!' | '@' | '*'
+ | '%' | '|' | '~'
+;
function_call : function_name wsa function_args
;
@@ -263,20 +251,24 @@ function_args : '(' wsa ')'
| '(' wsa function_args_sequence wsa ')'
;
- /* TODO: function arguments can contain strings in "". As the string can
- contain any ascii-visible character (nonvisible chars are escaped),
- this must be somehow handled, especially characters ( and ). */
function_args_sequence : function_args_char
+ | function_args_sequence wsa '(' wsa ')'
+ | function_args_sequence wsa '(' wsa function_args_sequence wsa ')'
| function_args_sequence wsa function_args_char
| function_args_sequence wsa function_args_string
;
function_args_string : '"' function_args_string_sequence '"'
+ | '"' '"'
;
-function_args_char : digit | nondigit | '{' | '}' | '<' | '>' | ':' | '~'
- | '=' | '-' | '+' | '@' | ',' | '.' | '[' | ']' | '/' | '%'
- | '\\' | '&'
+/* Manually synchronized with variables_char_no_framestart. */
+function_args_char : digit | nondigit
+ | '+' | '-' | '<' | '>' | '/' | '.'
+ | '[' | ']' | '?' | '\'' | '`' | ','
+ | '=' | '{' | '}' | '^' | '&' | '$'
+ | ':' | ';' | '\\' | '!' | '@' | '*'
+ | '%' | '|' | '~'
;
function_args_string_sequence : function_args_string_char
@@ -348,7 +340,16 @@ nondigit : 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k'
;
/* whitespace */
-ws : '\t' | ' ' | '\n' | '\r'
+ws : ws_nonl | '\n' | '\r'
+;
+
+ /* No newline.*/
+ws_nonl : '\t' | ' '
+;
+
+ /* whitespace sequence without a newline */
+wss_nonl : ws_nonl
+ | wss_nonl ws_nonl
;
/* whitespace sequence */
@@ -379,13 +380,14 @@ keyword_sighandler: '<' 's' 'i' 'g' 'n' 'a' 'l' ' ' 'h' 'a' 'n' 'd' 'l' 'e' 'r'
%%
static bool scanner_echo = false;
-static FILE *yyin;
+static char *yyin;
int yylex()
{
- int c = fgetc(yyin);
- if (c == EOF)
- return 0;
+ char c = *yyin;
+ if (c == '\0')
+ return END;
+ ++yyin;
/* Debug output. */
if (scanner_echo)
@@ -403,7 +405,7 @@ int yylex()
* backtrace_free() on this.
* Returns NULL when parsing failed.
*/
-struct backtrace *do_parse(FILE *input, bool debug_parser, bool debug_scanner)
+struct backtrace *do_parse(char *input, bool debug_parser, bool debug_scanner)
{
/* Prepare for running parser. */
g_backtrace = 0;