Op Sat, 18 Apr 2009, schreef Mike Denisenko:
Hello everyone, I'm a student of FESU, Russia. I've started to develop a feature - string cases (Topic: Easiest way to "case" strings, http://www.lazarus.freepascal.org/pipermail/lazarus/2009-March/023369.html), and now some questions appear: Existing method of parsing and generating assembly code doesn't process any constants but ordinal type, so the class holding case data, TCaseNode, contains labelinfo as object of TCaseLabel record.And TCaseLabel contains two fields: _low and _high representing the low and high bounds of interval signed as case label. These fields are of TConstExprInt type, so if we want to process the string label we get a problem: how it's better to hold its value? Should we simply add two string-type fields to TCaseLabel, or it should be solved by creating a base class with some virtual procedures and refactoring all modules having procedures operating with this type?
I am fine converting Tcaselabel into a variant record that takes a Pstring field. A new class is not a good idea, since we already have classes for this purpose: Tnode and descendends, a string constant can be represented by a Tstringconstnode. Tnode should be the most flexible since it allows you to handle all types of contants (and non constants if necessary).
Probably the parser already creates a Tnode tree, does constant expression evalutation, and then creates a Tcaselabel with the evaluated constant.
I wrote this case-label code about 10 years ago, it has a fundamental flaw: There is a worst case with quadratic time blowup, if you create a specially crafted case statement in the code, you can keep the compiler busy for a very long time. On the other hand, this has never been a problem in the lifetime of the compiler.
Daniël
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-devel