Должен ли я использовать парсер / лексер для этого? - PullRequest
0 голосов
/ 18 декабря 2009

Я хотел бы знать, подойдет ли такой инструмент, как ANTLR, для анализа этих правил, или это излишне, и я должен сделать свой собственный анализатор.

Это для анализа чьего-либо формата, поэтому я не могу его изменить. Это для развлечения и практики, так что не беспокойтесь слишком сильно. Это правила для описания фонетических изменений в языках. Я процитирую оригинального автора :

Изменение формата звука

Надеюсь, формат правил будет знаком любому лингвисту. Например, вот одно изменение звука:

c/g/V_V

Это правило гласит, что нужно заменить c на g между гласными. (Мы увидим, как обобщить это правило ниже.)

В общем, изменение звука выглядит так:

x/y/z

где x - это то, что нужно изменить, y - то, к чему оно изменяется, а z - окружение.

Часть z всегда должна содержать подчеркивание _, представляющее часть, которая изменяется. Это может быть все, что есть, как в

gn/nh/_

, который говорит программе безоговорочно заменить gn на nh.

Символ # представляет начало или конец слова. Так

u/o/_#

означает заменить вас на o, но только в конце слова.

Средняя (y) часть может быть пустой, как в

s//_#

Это означает, что s удаляется, когда заканчивается слово.

Переменные

Среда (часть z) может содержать переменные, как V выше. Они определены в верхней части файла. Я использую заглавные буквы для этого, хотя это не является обязательным требованием. Переменные могут быть длиной не более одного символа. Вы можете определить любые переменные, необходимые для изменения звука. Например. Вы можете определить S как любую остановку, или K для любого коронала, или как угодно.

Итак, определение переменной и правило

F=ie c/i/F_t

означает, что c меняется на i после передней гласной и перед т.

Вы также можете использовать переменные в первых двух частях. Например, предположим, что вы определили

S=ptc Z=bdg S/Z/V_V

Это означает, что остановки ptc изменяются на их озвученные эквиваленты bdg между гласными. В этом случае переменные должны соответствовать единице за один - p переходит к b, t переходит к d и т. Д. Каждый символ в переменной замещения (здесь Z) дает преобразованное значение каждого символа во входной переменной (здесь S) , Убедитесь, что два определения переменных имеют одинаковую длину!

Переменную также можно установить на фиксированное значение или удалить. Э.Г.

Z//V_V

говорит об удалении голосовых остановок между гласными.

Правило порядка

Правила применяются в порядке их перечисления. Итак, со словом опера и правилами

p/b/V_V e//C_rV

первое правило озвучивает р, в результате чего обера; вторая удаляет е между согласной и межочаговой т, что приводит к обра.

Параметр командной строки -p может помочь в отладке правил, поскольку он заставляет вывод точно указывать, какие правила применяются к каждому слову.

Дополнительные элементы в среде

Один или несколько элементов в среде могут быть помечены как необязательные в скобках. Э.Г.

u/ü/_C(C)F

говорит, чтобы изменить вас на ü, когда за ним следует одна или две согласные, а затем передний гласный.

Ответы [ 5 ]

2 голосов
/ 18 декабря 2009

Хотя ваш язык прост, использование ANTLR имеет много преимуществ.

  1. Speed. Сгенерированный код очень быстрый.

  2. Простота. Поскольку вы работаете на языке более высокого уровня, небольшие грамматические изменения менее затратны и сложны.

  3. расширяемость. Поскольку вы работаете на языке более высокого уровня, добавление функций является более дешевым занятием.

Да, вам нужно выучить ANTLR. И если в вашей грамматике есть неоднозначности, вам нужно узнать о конфликтах сдвига-уменьшения и уменьшения-уменьшения. Это может быть хорошо проведенное время.

Многие проблемы связаны с лексическим сканированием или анализом. Знание того, как создать лексический сканер и парсер, является полезным навыком.

1 голос
/ 19 декабря 2009

Если ваша проблема заключается просто в разборе правил, вам может не понадобиться генератор парсера. Как вы сказали, все правила имеют форму X / Y / Z, и разделить их будет очень легко на любом языке.

Если, как я подозреваю, вы создаете инструмент, который будет читать правила и применять их к файлу, проблема значительно сложнее.

Чтобы использовать генератор синтаксического анализатора, предполагая, что у вас есть фиксированный набор правил, вы должны перевести их в набор грамматических произведений в формат, требуемый генератором синтаксического анализатора, и передать их ему. Скомпилировав вывод генератора синтаксического анализатора, вы получите программу, которая может преобразовать файл в соответствии с этими правилами. Учитывая то, что ваши правила кажутся контекстно-зависимыми (c/g/V_V), я предлагаю поискать генераторы синтаксических анализаторов, которые предлагают GLR (парсеры Tomita) или PEG (грамматика синтаксического разбора).

Если ваш набор правил не является фиксированным, и ваша программа должна прочитать их вместе с файлом для преобразования, то вам действительно нужен механизм преобразования текста. В этом случае вы переведете свои правила X / Y / Z в правильный формат и передадите их движку вместе с исходным файлом.

Предполагая, что вы не хотите писать свой собственный движок, вы можете посмотреть на обобщенные макропроцессоры ( M4 , Gema , ...) или непосредственно на интерпретируемые языки ( perl , Lua , ...), чтобы помочь вам.

Например, в Gema вы можете перевести c/g/V_V в:

<vowel>c<vowel>=$1g$2
vowel:a=a;e=e;i=i;o=o;u=u;=@terminate

и в Луа в:

function rule1(s)
  return (string.gsub(s,"([aeiou])c([aeiou])","%1g%2"))
end

В конце концов, это действительно зависит от того, нужно ли вам что-то создавать для данного набора правил или если вам нужно уметь читать и интерпретировать любой набор правил.

Конечно, в любом случае вы должны проанализировать свои правила, чтобы иметь возможность преобразовать их в надлежащий формат, но, как я уже говорил в начале, синтаксис выглядит очень простым для меня и не оправдывает использование генератор парсеров.

0 голосов
/ 01 сентября 2010

Сначала ответьте себе на вопрос: «Есть ли у этого языка какие-либо вложенные / рекурсивные шаблоны?»

Если да, вам нужен как минимум синтаксический анализатор грамматики без контекста. Создайте вручную или сгенерируйте с помощью какого-либо генератора синтаксических анализаторов.

Если нет, достаточно регулярных выражений.

0 голосов
/ 18 декабря 2009

Можно ли изменить формат правил для использования уже существующего синтаксиса с легкодоступным анализатором?

0 голосов
/ 18 декабря 2009

Мне кажется, что использование инструмента синтаксического анализа является излишним, особенно если вы еще не знакомы с инструментом, который может выполнять эту работу.

...