Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Announcing Ox release 1.9

24 views
Skip to first unread message

Tom Shields

unread,
Jul 25, 2020, 2:24:57 PM7/25/20
to
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.

0 new messages