TYPESYSTEM utils.PlainTextTypeSystem;
ENGINE utils.PlainTextAnnotator;
DECLARE Header;
DECLARE ColumnDelimiter;
DECLARE Cell(INT column);
DECLARE Keyword (STRING label);
DECLARE Keyword UnderWriterNameKeyword, AppraiserNameLicenseKeyword,
AppraisalCompanyNameKeyword;
"Underwriter's Name" -> UnderWriterNameKeyword ( "label" = "UnderWriter
Name");
"Appraiser's Name/License" -> AppraiserNameLicenseKeyword ( "label" =
"Appraiser Name");
"Appraisal Company Name" -> AppraisalCompanyNameKeyword ( "label" =
"Appraisal Company Name");
DECLARE Entry(Keyword keyword);
EXEC(PlainTextAnnotator, {Line,Paragraph});
ADDRETAINTYPE(WS);
Line{->TRIM(WS)};
Paragraph{->TRIM(WS)};
SPACE[3,100]{-PARTOF(ColumnDelimiter) -> ColumnDelimiter};
Line -> {ANY+{-PARTOF(Cell),-PARTOF(ColumnDelimiter) -> Cell};};
REMOVERETAINTYPE(WS);
INT index = 0;
BLOCK(structure) Line{}{
ASSIGN(index, 0);
Line{STARTSWITH(Paragraph) -> Header};
c:Cell{-> c.column = index, index = index + 1};
}
Header<-{hc:Cell{hc.column == c.column}<-{k:Keyword;};}
# c:@Cell{-PARTOF(Header) -> e:Entry, e.keyword = k};
DECLARE Entity (STRING label, STRING value);
DECLARE Entity UnderWriterName, AppraiserNameLicense, AppraisalCompanyName;
FOREACH(entry) Entry{}{
entry{ -> CREATE(UnderWriterName, "label" = k.label, "value" =
entry.ct)}<-{k:entry.keyword{PARTOF(UnderWriterNameKeyword)};};
entry{ -> CREATE(AppraiserNameLicense, "label" = k.label, "value" =
entry.ct)}<-{k:entry.keyword{PARTOF(AppraiserNameLicenseKeyword)};};
entry{ -> CREATE(AppraisalCompanyName, "label" = k.label, "value" =
entry.ct)}<-{k:entry.keyword{PARTOF(AppraisalCompanyNameKeyword)};};
}
Наиболее важным правилом является следующее:
Header<-{hc:Cell{hc.column == c.column}<-{k:Keyword;};}
# c:@Cell{-PARTOF(Header) -> e:Entry, e.keyword = k};
Содержит три элемента правила Header
, #
и Cell
и работает следующим образом:
- Правило начинает совпадать с элементом правила
Cell
, поскольку оно помечено как якорь с @
. - Этот элемент правила совпадает со всеми аннотациями
Cell
, которые не являются частьюHeader
аннотация. Он начинается с первой аннотации Cell
, которая удовлетворяет этому условию, и называет ее «c». - Следующий элемент правила -
#
, который соответствует, пока следующий элемент правила не сможет соответствовать. - Следующий элемент правила соответствует аннотации
Header
, если встроенное правило может соответствовать в пределах аннотации Header
. Встроенное правило соответствует аннотациям Cell
, которые помнят как "hc" в этом диапазоне, которые имеют то же значение для функции column
. Совпадение будет успешным, если оно содержит Keyword
, запомненное как «k». - Если эти три элемента правила совпадают успешно, действия применяются.
- Первое действие создает
Entry
аннотация, называемая "e", для диапазона аннотации Cell
. - Второе действие назначает ключевое слово функции
Entry
keyword
.
КакТаким образом, правило создает аннотацию Entry
для каждой аннотации Cell
, которая не является частью заголовка, и назначает ключевое слово заголовка соответствующего столбца для определения типа записи.