]> granicus.if.org Git - re2c/commit
Simplified tracking of condition order.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 26 Aug 2015 11:41:48 +0000 (12:41 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 26 Aug 2015 11:41:48 +0000 (12:41 +0100)
commit8c1fe4f0113685b599bf906360814e4715e05447
treeb32c94a7d66339a8065c4d3198475a21314c9f1f
parentef3502b09c491ecc6d9d5ddeba3020c0315947d8
Simplified tracking of condition order.

In theory re2c makes no guarantee about the order of conditions in
the generated lexer. Users should use 'YYGETCONDITION'/'YYSETCONDITION'
interface and generate enum with condition names using either '-t'
option or '/*!types:re2c*/' directive. Only members of the generated
enum should be used with 'YYGETCONDITION' and 'YYSETCONDITION'.
This way code is independent of internal re2c condition numbering.

However, it turns out that some users (and notably, PHP) rely on
internal condition numbering: they manually hardcode condition numbers
and make re2c generate condition dispatch in such a way that it
doesn't mention condition names at all (e.g. with in the form of nested
'if' statements with '-b' or in the form of 'goto' table with '-g').
The code compiles, but change of code generation mode may break
compilation. Even worse, change of internal re2c condition numbering
may lead to epic runtime failures.

So re2c cannot just change internal condition numbering: it has to
preserve the existing numbering scheme (rather illogical and not
alphabetically sorted).

This commit tries to simplify tracking of condition numbers.
12 files changed:
re2c/bootstrap/src/parse/parser.cc
re2c/src/codegen/emit.h
re2c/src/codegen/emit_dfa.cc
re2c/src/codegen/output.cc
re2c/src/codegen/output.h
re2c/src/ir/dfa/dfa.h
re2c/src/parse/parser.h
re2c/src/parse/parser.ypp
re2c/test/condition_14.cif.c
re2c/test/php20150211_zend_ini_scanner.cDF--case-inverted.c
re2c/test/php20150211_zend_ini_scanner_trimmed.icF.c
re2c/test/php20150211_zend_language_scanner.cDF--case-inverted.c