Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.compilers > #2551

Announcing Ox release 1.9

From Tom Shields <thomas.evans.shields@gmail.com>
Newsgroups comp.compilers
Subject Announcing Ox release 1.9
Date 2020-07-25 11:43 -0500
Organization Compilers Central
Message-ID <20-07-005@comp.compilers> (permalink)

Show all headers | View raw


Ox version 1.9 is now available on SourceForge
(sourceforge.net/projects/ox-attribute-grammar-compiler/).

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.


Ox NEWS

* 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
specifiers.

  A C++ replacement std::new()/std::delete() library is provided, compiled
with
  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
corresponding
  library, if configured to build with one of these packages.  The library can
be
  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
directive
  '%skeleton "lalr1.cc"' found in the Y-file enables Ox to infer that the
target
  parser generator is Bison and the target language is C++.


** Internals

  The C++ `new' & `delete' operators are used instead of `malloc()' &
`free()'
  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
constructors
  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
definition
  - generate a constructor (`yyyTn(int yyyTypeNum)') to set the variant tag
  - the compiler generates code to invoke attribute default constructors and
    destructors
  - 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
bytes
  - generate a constructor (`yyyAttrbs(int yyyTypeNum)') using a placement
new
    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
corresponding
    compiler-generated `~yyyTn()' destructor (via a `switch' statement)
  - if an attribute class type requires a parameterized constructor, it must
be
    called within the evaluation part of each definition of that attribute
using
    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
a
    `%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++
capabilities
  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
a
  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
Cygwin
  and Msys2.

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

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

Back to comp.compilers | Previous | Next | Find similar


Thread

Announcing Ox release 1.9 Tom Shields <thomas.evans.shields@gmail.com> - 2020-07-25 11:43 -0500

csiph-web