Announcing Ox release 1.9

Tom Shields <>
Sat, 25 Jul 2020 11:43:13 -0500

          From comp.compilers

Related articles
Announcing Ox release 1.9 (Tom Shields) (2020-07-25)
| List of all articles for this month |

From: Tom Shields <>
Newsgroups: comp.compilers
Date: Sat, 25 Jul 2020 11:43:13 -0500
Organization: Compilers Central
Injection-Info:; posting-host=""; logging-data="714"; mail-complaints-to=""
Keywords: yacc, tools, available, attribute
Posted-Date: 25 Jul 2020 14:24:54 EDT

Ox version 1.9 is now available on SourceForge

Ox generalizes the function of Yacc in the way that an attribute
grammar generalizes a context-free grammar. Ordinary Yacc and Lex
specifications may be augmented with definitions of synthesized and
inherited attributes written in C/C++ syntax. Ox checks these
specifications for consistency and completeness, and generates from
them a program that builds and decorates attributed parse trees. The
user may specify postdecoration traversals for easy ordering of side
effects, such as code generation. Ox handles the tedious and
error-prone details of writing code for parse-tree management, so its
use eases problems of security and maintainability associated with
that aspect of translator development.


* Noteworthy changes in release 1.9 (24 July 2020)

** Enhancements

    Ox new generates C++ lexer & parser specifications that work with the Flex,
    Bison, BtYacc and Msta C++ skeletons; C++ class, struct or union types with
    constructors and destructors are acceptable as Ox attribute type

    A C++ replacement std::new()/std::delete() library is provided, compiled
    the Boehm-Demers-Weiser Conservative C/C++ Garbage Collector (BDWGC)
    or the Dmalloc Debug Malloc Library (DMALLOC) package, if installed.
    Ox-generated AG evaluators in the distribution are linked with the
    library, if configured to build with one of these packages. The library can
    installed for use by user AG evaluators.

    New command line options are provided to inform Ox of the intended AG
    evaluator target for code generation (lexer generator, parser generator,
    language). Use of these options is only necessary if Ox cannot infer the
    intended target from the Y-file or L-file. For example, the Bison
    '%skeleton ""' found in the Y-file enables Ox to infer that the
    parser generator is Bison and the target language is C++.

** Internals

    The C++ `new' & `delete' operators are used instead of `malloc()' &
    when compiling the Ox skeleton with a C++ compiler.

    The collection of attributes declared for a particular AG evaluator is
    generated as a union (`union yyyAttrbs') of the set of structure types
    (`struct yyyTn', for `n' from 1) generated from the attribute declarations
    present in the Y-file. This works for C, but a C++ class type (`struct',
    `class' or `union') with virtual member functions, or nontrivial
    or destructors, cannot directly be a member of a union type.

    Ox generated code accomodates attributes with nontrivial C++ class types
    through the following approach:
    - generate a variant tag at the start of each `struct yyyTn' type
    - generate a constructor (`yyyTn(int yyyTypeNum)') to set the variant tag
    - the compiler generates code to invoke attribute default constructors and
    - implement each member of `union yyyAttrbs' as an array of bytes sized to
        hold the corresponding `struct yyyTn' value
    - generate a default constructor (`yyyAttrbs()') to zero the allocated
    - generate a constructor (`yyyAttrbs(int yyyTypeNum)') using a placement
        operator applied to "static_cast<struct yyyTn *>((void *)this)" to invoke
        the `yyyTn(yyyTypeNum)' constructor (via a `switch' statement)
    - generate a destructor (`~yyyAttrbs()') to explicitly call the
        compiler-generated `~yyyTn()' destructor (via a `switch' statement)
    - if an attribute class type requires a parameterized constructor, it must
        called within the evaluation part of each definition of that attribute
        a placement new operator

    The Ox parser will only build from scratch with `bison' 3.7+.

** Bug fixes

    Corrected bugs introduced in release 1.8:
    - broken code was generated for the "-u" command line option
    - generated Bison or BYacc parsers failed to compile if the Y-file contained
        `%destructor' or `%printer' directive defined for "<*>"
    - `genYaccUnionDecl()' ignored the `targetT' parameter
    - `finishYfileDefinitionSection()' dropped code needed in the Ox-generated
        header if the "%define api.value.type union" directive was used

** Documentation

    The User Reference Manual was revised to define the directives Ox currently
    uses to infer aspects of the intended AG evaluator generation target in
    Appendix E (Lex- and Yacc-compatible tool interoperation).

** Test suite

    New Bison, BtYacc & Msta test cases were added for C++. Flex C++
    are used in these test cases, if that support is installed.

    The existing BtYacc test cases now use the new Ox C++ capabilities. The
    oldest versions of the BtYacc parser skeleton requires C++, and there is no
    mechanism in BtYacc to get the version, so all BtYacc test cases always use
    C++ compiler.

** Build system

    A new configuration option is introduced to enable installation of the C++
    replacement std::new()/std::delete() library for use by AG evaluators.

    Ox successfully builds and passes the test suite with the MinGW-w64 build
    environment (both 64- and 32-bit) distributed as optional packages by
    and Msys2.

    Multiple `./configure' processes can now run concurrently, which is useful
    regression testing.

    The Ox configuration now disables multithreading by default. Formerly, The
    GNUlib default configuration enabled multithreading, if available.

Post a followup to this message

Return to the comp.compilers page.
Search the comp.compilers archives again.