7

What is the best way to handle multiple Flex/Bison parsers inside a project?

I wrote a parser and now I need a second one in the same project. So far in the third section of parser1.y I inserted the main(..) method and called yyparse from there.

What I want to obtain is having two different parsers (parser1.y and parser2.y) and be able to use them from an external function (let's assume main in main.cpp).

Which precautions should I use to export yyparse functions outside .y files and how should I handle two parsers?

PS. I'm using g++ to compile but not the C++ versions of Flex and Bison and I would like to keep it this way (so avoiding encapsulating the parser inside an object).

Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
Jack
  • 131,802
  • 30
  • 241
  • 343

5 Answers5

12

In addition to Leffler's answer, I'd like to provide another approach here:

In the .lex file you could use %option prefix="PREFIX", and in the .y file you could use %define api.prefix PREFIX, which does the same thing as passing -p PREFIX to Bison and -P PREFIX to Flex.

Notice after the overriding of the default prefix yy, you can access internal names via BOTH the original yy* and your overridden PREFIX*, while obviously for external names you MUST use your PREFIX* to access them.

starrify
  • 14,307
  • 5
  • 33
  • 50
11

Note that Bison provides the '-p zz' option to prefix symbols with 'zz' instead of 'yy'.

Similarly, Flex provides the '-P zz' option to prefix symbols with 'zz' instead of 'yy'. It uses '-p' for performance reporting. 'Tis a pity they are not consistent with each other.

Jonathan Leffler
  • 730,956
  • 141
  • 904
  • 1,278
6

If you use Bison 3.0 or better, then have a look at %define api.prefix {foo_}, which replaces all yy and YY prefixes with foo_ and FOO_.

See the Documentation about Multiple Parsers.

Between Bison 2.6 and 3.0, there used to be no braces: %define api.prefix foo_.

akim
  • 8,255
  • 3
  • 44
  • 60
0

In addition to what was already stated, if you use a '%define api.prefix {PREFIX}' it will also rename yytext && yyparse to PREFIXtext and PREFIXparse. Don't forget the {} around the prefix !
The same applies to '%option prefix="PREFIX"' in lex, your lexer will be renamed to PREFIXlex.

Gull_Code
  • 115
  • 1
  • 5
0

The api.prefix variable is not working for me anymore (it's producing a compilation error)

%define api.prefix {PREFIX}

I had to use the following syntax

%name-prefix="PREFIX"
allo
  • 3,955
  • 8
  • 40
  • 71
  • Uh ... the one you had to use is actually the older way and is obsolete. The manual explicitly states this even. – Pryftan Mar 09 '23 at 13:22