]> granicus.if.org Git - re2c/commit
Memorize options for each block and use them for delayed code generation.
authorUlya Trofimovich <skvadrik@gmail.com>
Thu, 29 Dec 2016 17:07:52 +0000 (17:07 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Thu, 29 Dec 2016 17:07:52 +0000 (17:07 +0000)
commita698ea6145a200890f222ce7545ff34d7c5aeede
treee8db1ad5e9069c387d7771845e683d83970a13ab
parentb79ab68097d3c7a6421c0c7003d1cd8a026d9100
Memorize options for each block and use them for delayed code generation.

Option scope is very poorly defined in re2c. Most options should have block
scope, but some have global scope (because they belong to global directives
like '/*!types:re2c ... */', '/*!tags:re2c ... */' or other global things
like generation date, etc.).

For now, options are applied immediately as they are parsed.
Code generation just reads the most recent state of options, so the output
depends not only on the location in source code when the option is defined,
but also on program points in which re2c generates and outputs code.
Generation and output may happen at different times, so they may use
different options. This is all very bad.

This commit is the first attempt to introduce scoped options: re2c now
makes a snapshot of options at the end of each block and uses this snapshot
for delayed code generation for this block (unless the given option must be
global).

This is not perfect (immediate code generation still uses 'seen-so-far'
options instead of block options), but at least it allows to delay code
generation for non-global things without loosing options.
re2c/bootstrap/src/parse/lex.cc
re2c/bootstrap/src/parse/parser.cc
re2c/src/codegen/output.cc
re2c/src/codegen/output.h
re2c/src/conf/opt.h
re2c/src/parse/parser.ypp