| --- |
| short-description: Common Code Generators Module |
| authors: |
| - name: Dylan Baker |
| email: dylan@pnwbakers.com |
| years: [2024, 2025] |
| ... |
| |
| # Codegen Module |
| |
| *(New in 1.10.0)* |
| |
| This module provides wrappers around common code generators, such as flex/lex and yacc/bison. This purpose of this is to make it easier and more pleasant to use *common* code generators in a mesonic way. |
| |
| ## Functions |
| |
| ### lex() |
| |
| ```meson |
| lex_gen = codegen.lex(implementations : ['flex', 'reflex'], flex_version : ['>= 2.6', '< 3'], reflex_version : '!= 1.4.2') |
| ``` |
| |
| This function provides fine grained control over what implementation(s) and version(s) of lex are acceptable for a given project (These are set per-subproject). It returns a [new object](#lexgenerator), which can be used to generate code. |
| |
| It accepts the following keyword arguments: |
| |
| - `implementations`: a string array of acceptable implementations to use. May include: `lex`, `flex`, `reflex`, or `win_flex`. |
| - `lex_version`: a string array of version constraints to apply to the `lex` binary |
| - `flex_version`: a string array of version constraints to apply to the `flex` binary |
| - `reflex_version`: a string array of version constraints to apply to the `relex` binary |
| - `win_flex_version`: a string array of version constraints to apply to the `win_flex` binary |
| - `required`: A boolean or feature option |
| - `disabler`: Return a disabler if not found |
| - `native`: Is this generator for the host or build machine? |
| |
| ### yacc() |
| |
| ```meson |
| yacc = codegen.yacc(implementations : ['bison', 'win_bison']) |
| ``` |
| |
| This function provides fine grained controls over which implementation(s) and version(s) of the parser generator to use. |
| |
| Accepts the following keyword arguments: |
| |
| - `implementations`: a string array of acceptable implementations to use. May include: `yacc`, `byacc`, `bison`, or `win_bison`. |
| - `yacc_version`: a string array of version constraints to apply to the `yacc` binary |
| - `byacc_version`: a string array of version constraints to apply to the `byacc` binary |
| - `bison_version`: a string array of version constraints to apply to the `bison` binary |
| - `win_bison_version`: a string array of version constraints to apply to the `win_bison` binary |
| - `required`: A boolean or feature option |
| - `disabler`: Return a disabler if not found |
| - `native`: Is this generator for the host or build machine? |
| |
| ## Returned Objects |
| |
| ### LexGenerator |
| |
| #### lex.implementation |
| |
| ```meson |
| lex = codegen.lex() |
| impl = lex.implementation() |
| ``` |
| |
| Returns the string name of the lex implementation chosen. May be one of: |
| |
| - lex |
| - flex |
| - reflex |
| - win_flex |
| |
| #### lex.generate |
| |
| ```meson |
| lex = codegen.lex() |
| lex.generate('lexer.l') |
| ``` |
| |
| This function wraps flex, lex, reflex (but not RE/flex), and win_flex (on Windows). When using win_flex it will automatically add the `--wincompat` argument. |
| |
| This requires an input file, which may be a string, File, or generated source. It additionally takes the following options keyword arguments: |
| |
| - `args`: An array of extra arguments to pass the lexer |
| - `plainname`: If set to true then `@PLAINNAME@` will be used as the source base, otherwise `@BASENAME@`. |
| - `source`: the name of the source output. If this is unset Meson will use `{base}.{ext}` with an extension of `cpp` if the input has an extension of `.ll`, or `c` otherwise, with base being determined by the `plainname` argument. |
| - `header`: The optional output name for a header file. If this is unset no header is added |
| - `table`: The optional output name for a table file. If this is unset no table will be generated |
| |
| The outputs will be in the form `source [header] [table]`, which means those can be accessed by indexing the output of the `lex` call: |
| |
| ```meson |
| lex = codegen.lex() |
| l1 = lex.generate('lexer.l', header : '@BASENAME@.h', table : '@BASENAME@.tab.h') |
| headers = [l1[1], l1[2]] # [header, table] |
| |
| l2 = lex.generate('lexer.l', table : '@BASENAME@.tab.h') |
| table = l2[1] |
| ``` |
| |
| ### YaccGenerator |
| |
| #### yacc.implementation |
| |
| ```meson |
| yacc = codegen.yacc() |
| impl = yacc.implementation() |
| ``` |
| |
| Returns the string name of the yacc implementation chosen. May be one of: |
| |
| - yacc |
| - bison |
| - byacc |
| - win_bison |
| |
| #### yacc.generate |
| |
| ```meson |
| yacc = codegen.yacc() |
| yacc.generate('parser.y') |
| ``` |
| |
| This function wraps bison, yacc, byacc, and win_bison (on Windows), and attempts to abstract away the differences between them |
| |
| This requires an input file, which may be a string, File, or generated source. It additionally takes the following options keyword arguments: |
| |
| - `version`: Version constraints on the lexer |
| - `args`: An array of extra arguments to pass the lexer |
| - `plainname`: If set to true then `@PLAINNAME@` will be used as the source base, otherwise `@BASENAME@`. |
| - `source`: the name of the source output. If this is unset Meson will use `{base}.{ext}` with an extension of `cpp` if the input has an extension of `.yy` or `c` otherwise, with base being determined by the `plainname` argument. |
| - `header`: the name of the header output. If this is unset Meson will use `{base}.{ext}` with an extension of `hpp` if the input has an extension of `.yy` or `h` otherwise, with base being determined by the `plainname` argument. |
| - `locations`: The name of the locations file, if one is generated. Due to the way yacc works this must be duplicated in the file and in the command. |
| |
| The outputs will be in the form `source header [locations]`, which means those can be accessed by indexing the output of the `yacc` call: |
| |
| ```meson |
| yacc = codegen.yacc() |
| p1 = yacc.generate('parser.y', header : '@BASENAME@.h', locations : 'locations.h') |
| headers = [p1[1], p1[2]] # [header, locations] |
| |
| p2 = yacc.generate('parser.yy', locations : 'locations.hpp') |
| locations = p2[1] |
| ``` |