Главное слово
В каждой цепочке, собираемой правилом, есть главное слово. Его грамматические признаки наследуются всей цепочкой как многословной единицей. По умолчанию главным словом назначается первое слово цепочки. В приведенной в предыдущем примере грамматике главными словами цепочек, собираемых правилами AdjCoord
и S
будут прилагательные, соответственно собранные цепочки тоже будут считаться прилагательными. В случае с AdjCoord
это правильно, а в случае с S
- нет, т.к. если мы, в дальнейшем, захотим включить эти цепочки в другие правила, то нужно будет, чтобы они функционировали как существительные и наследовали граммемы нетерминала Person
. Для того, чтобы указать парсеру, какое слово нужно считать главным, используется помета rt
.
Помета rt
также оказывает влияние на нормализацию слов, включенных в согласование. При нормализации граммемы задаются от главного слова к зависимому, а не наоборот. Это становится очевидным в случае, когда в согласовании участвуют прилагательное и существительное среднего рода: « фразцузское посольство
», «вкусное безе»
. Нормализованной формой прилагательного является именительный падеж мужского рода единственного числа. Соответственно при нормализации этих цепочек, собранных правилом S -> Adj<gnc-agr[1]> Noun<gnc-agr[1]>;
получим «французский посольство»
и «вкусный безе
.» Чтобы при нормализации прилагательные приняли форму среднего рода, необходимо указать, что главным словом является существительное, и именно оно указывает, в какую форму надо поставить согласованное с ним прилагательное: S -> Adj<gnc-agr[1]> Noun<gnc-agr[1], rt>;
.
Возвращаясь к грамматике из предыдущего примера, окончательный ее вариант должен быть таким:
#encoding "utf-8"
ProperName -> Word<h-reg1>+;
Person -> ProperName | ‘человек’;
FormOfAddress -> ‘товарищ’ | ‘мистер’ | ‘господин’;
AdjCoord -> Adj;
AdjCoord -> AdjCoord<gnc-agr[1]> ',' Adj<gnc-agr[1]>;
AdjCoord -> AdjCoord<gnc-agr[1]> 'и' Adj<gnc-agr[1]>;
S -> Adj<gnc-agr[1]>+ (FormOfAddress) Person<gnc-agr[1], rt>;
S -> AdjCoord<gnc-agr[1]> (FormOfAddress) Person<gnc-agr[1], rt>;
В конфигурационном файле указано, что анализируемый текст читается не из файла, а из стандартного ввода. Поэтому при запуске нужно передать содержимое тестовых файлов в поток стандартного ввода.
Таким образом, не меняя файла config.proto
можно запустить проект как на каком-то одном файле, так и на всех трех сразу:
# В Linux, FreeBSD и прочих *nix системах:
# на всех файлах
cat test?.txt | ./tomitaparser config.proto
# на одном файле
cat test1.txt | ./tomitaparser config.proto
rem В Windows:
rem на всех файлах
type test?.txt | tomitaparser.exe config.proto
rem на одном файле
tomitaparser.exe config.proto < test1.txt
Для того, чтобы парсер читал текст из файла, нужно добавить в конфигурационный файл следующий текст перед строкой «Articles = [»
:
Input = {
File = "test3.txt"; // путь к входному файлу
}