help-bison
[Top][All Lists]
Advanced

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

Question about token stack


From: Ervin Hegedüs
Subject: Question about token stack
Date: Sun, 30 Aug 2020 11:44:56 +0200
User-agent: NeoMutt/20171215

Hi all,

I could finish the handling of include files - both for explicit
listing and using metacharacters (eg. config*.conf).

You can check that here:

https://github.com/airween/flextest

(Note, this is just an example project...)

I still have a question - as you can see, I've created a function
which push the scanned token to stack, what usen in parser. Eg.:

https://github.com/airween/flextest/blob/master/mylexer.l#L49

<INITIAL>(\s*)Conf[a-zA-Z0-9]+    { push_sym(); ...

and in parser:

https://github.com/airween/flextest/blob/master/myparser.y#L52

config_directive_line:
      T_CONFIG_DIRECTIVE T_CONFIG_DIRECTIVE_ARGUMENT { printf("'%s' '%s'\n", 
$1, $2); free($1); free($2); }

This works as well, but I found some interesting thing when I
analyzed my code with valgrind: the pushed token is still
reachable when the parser run into an error.

There is a wrong config: badconf.conf.

Here is the result:

valgrind -s --leak-check=full --show-leak-kinds=all --track-origins=yes 
./myparser badconf.conf

==564114== 4 bytes in 1 blocks are still reachable in loss record 1 of 4
==564114==    at 0x483677F: malloc (in 
/usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==564114==    by 0x48EB71A: strdup (strdup.c:42)
==564114==    by 0x10B86A: push_sym (mylexer.l:111)
==564114==    by 0x109E7F: yylex (mylexer.l:53)
==564114==    by 0x10954B: yyparse (myparser.tab.c:1055)
==564114==    by 0x10BD38: open_and_parse (mylexer.l:221)
==564114==    by 0x10BF98: main (mylexer.l:272)


How can I avoid this situation? Is that any "best-practice"? How
can I access to pointers in stack to free them when error
occurred?

In the generated code (myparser.tab.c) I see there is the yyvsp[]
array - but I can access to that. Or em I wrong?




Thanks,



a.





reply via email to

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