Annotation of parser3/src/main/pa_dictionary.C, revision 1.17.2.1
1.1 parser 1: /** @file
2: Parser: dictionary class impl.
3:
1.17 paf 4: Copyright (c) 2001, 2003 ArtLebedev Group (http://www.artlebedev.com)
1.12 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.15 paf 6: */
1.1 parser 7:
1.17.2.1! paf 8: static const char* IDENT_DICTIONARY_C="$Date: 2003/01/21 15:51:14 $";
1.1 parser 9:
10: #include "pa_dictionary.h"
1.4 parser 11: #include "pa_exception.h"
1.1 parser 12:
1.17.2.1! paf 13: static void add_first(Table::element_type row, Dictionary* self) {
1.4 parser 14: // get a=>b values
1.17.2.1! paf 15: ConstStringPtr a=row->get(0);
! 16: ConstStringPtr b=row->get(1);
1.4 parser 17: // empty 'a' check
1.17.2.1! paf 18: if(a->is_empty()) {
1.14 paf 19: throw Exception("parser.runtime",
1.17.2.1! paf 20: a,
1.4 parser 21: "dictionary table 'from' column elements must not be empty");
22: }
1.17.2.1! paf 23: unsigned char c=(unsigned char)a->first_char();
! 24: if(!self->starting_line_of[c])
! 25: self->starting_line_of[c]=self->constructor_line;
! 26:
! 27: double ratio=((double)b->size())/a->size();
! 28: if(ratio>self->fmax_ratio)
! 29: self->fmax_ratio=ratio;
1.4 parser 30:
1.17.2.1! paf 31: self->constructor_line++;
1.1 parser 32: }
1.17.2.1! paf 33: Dictionary::Dictionary(TablePtr atable, double amin_ratio):
1.4 parser 34: table(atable),
35: fmax_ratio(amin_ratio) {
36:
37: // clear starting_lines
38: memset(starting_line_of, 0, sizeof(starting_line_of));
1.1 parser 39: // grab first letters of first column of a table
1.17.2.1! paf 40: constructor_line=1; table->for_each(add_first, this);
1.1 parser 41: }
42:
1.4 parser 43: #ifndef DOXYGEN
44: struct First_that_starts_info {
45: int line;
1.7 parser 46: const char *src; size_t src_size;
1.4 parser 47: };
48: #endif
1.17.2.1! paf 49: static bool starts(Table::element_type row, First_that_starts_info* info) {
1.4 parser 50: // skip irrelevant lines
1.17.2.1! paf 51: if(info->line>1) {
! 52: --info->line;
1.4 parser 53: return 0;
54: }
1.1 parser 55:
56: int partial;
1.17.2.1! paf 57: row->get(0)->cmp(partial, info->src, info->src_size);
1.3 parser 58: return (
1.1 parser 59: partial==0 || // full match
1.17.2.1! paf 60: partial==1); // typo left column starts 'src'
1.1 parser 61: }
62:
1.17.2.1! paf 63: Table::element_type Dictionary::first_that_starts(const char *src, size_t src_size) const {
1.4 parser 64: First_that_starts_info info;
65: if(info.line=starting_line_of[(unsigned char)*src]) {
66: info.src=src;
1.7 parser 67: info.src_size=src_size;
1.17.2.1! paf 68: return table->first_that(starts, &info);
1.4 parser 69: } else
1.17.2.1! paf 70: return 0;//Table::element_type(0);
1.1 parser 71: }
E-mail: