Главное слово

В каждой цепочке, собираемой правилом, есть главное слово. Его грамматические признаки наследуются всей цепочкой как многословной единицей. По умолчанию главным словом назначается первое слово цепочки. В приведенной в предыдущем примере грамматике главными словами цепочек, собираемых правилами 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"; // путь к входному файлу
  }