Задача: <p> Создайте интерпретатор для <ahref="https://en.wikipedia.org/wiki/Markov algorithm"title="wp: алгоритм Маркова">алгоритма Маркова</a> . </p><p> Правила имеют синтаксис: </p><p><ruleset> знак равно <comment> | <rule> ) <newline> +) * </newline></rule></comment></ruleset></p><p><comment> знак равно <anycharacter=""> } </any></comment></p><p><rule> знак равно <pattern><whitespace> -><whitespace> [.] <replacement></replacement></whitespace></whitespace></pattern></rule></p><p><whitespace> знак равно <tab> | <space> ) [ <whitespace> ] </whitespace></space></tab></whitespace></p><p>В каждой строке есть одно правило. </p><p> Если есть <b>.</b> (период), присутствующий до <replacement> , то это правило окончания, в этом случае интерпретатор должен остановить выполнение. </replacement></p><p>Набор правил состоит из последовательности правил с необязательными комментариями. </p><p><big><big>Rulesets</big></big></p><p> Используйте следующие тесты для записей: </p> Правила 1: <pre> Этот файл правил извлекается из Википедии:
</pre><p> Пример текста: </p><p><code>I bought a B of As from T S.</code></p><p> Должен генерировать вывод: </p><p><code>I bought a bag of apples from my brother.</code></p> Правила 2: <p> Проверка правила завершения </p><pre> Немного изменен из правил на WikipediaA -> apple
B -> сумка
S -> .shop
T ->
магазин -> мой брат
никогда не использовалось -> .terminating rule </pre><p> Пример текста: </p><p><code>I bought a B of As from T S.</code></p><p> Должна генерировать: </p><p><code>I bought a bag of apples from T shop.</code></p> Правила 3: <p> Это проверяет правильный порядок замещения и может задерживать простые подпрограммы на основе регулярного выражения, если специальные символы регулярного выражения не экранируются. </p><pre> BNF Синтаксические правила тестированияA -> apple
WWWW ->с
Багаж -> ->. *
B -> сумка
->. * -> деньги
W -> WW
S -> .shop
T ->
магазин -> мой брат
никогда не использовалось -> .terminating rule
</pre><p> Пример текста: </p><p><code>I bought a B of As W my Bgage from T S.</code></p><p> Должна генерировать: </p><p><code>I bought a bag of apples with my money from T shop.</code></p> Правила 4: <p> Это проверяет правильность порядка сканирования правил и может задерживать процедуры замены, которые сканируются в неправильном порядке. Он реализует общий механизм унарного умножения. (Обратите внимание, что входное выражение должно быть помещено в символы подчеркивания в этой реализации.) </p><pre> ## Unary Multiplication Engine, для тестирования алгоритмов Алгоритма Маркова
## Донал Стипендиаты.
Унарное сложение engine_ + 1 -> _1 +
1 + 1 -> 11+
Переход для преобразования из расщепления умножения в обычный
addition1! -> 1
,! ->! +
_! -> _
Унарное умножение путем дублирования левой стороны, правое время 1 * 1 -> x, @ y
1x -> xX
X, -> 1,1
X1 -> 1X
_x -> _X
, х ->, X
y1 -> 1y
y_ -> _
Следующая фаза применения 1 @ 1 -> x, @ y
1 @ _ -> @_
, @ _ ->! _
++ -> +
Очистка выводов для добавления_1 -> 1
1 + _ -> 1
_ + _ ->
</pre><p> Пример текста: </p><p><code>_1111*11111_</code></p><p> должен генерировать вывод: </p><p><code>11111111111111111111</code></p> Правила 5: <p> Простая <ahref="http://en.wikipedia.org/wiki/Turing_machine"title="ссылка: http://en.wikipedia.org/wiki/Turing_machine">машина Тьюринга</a> , </p><p> реализуя <ahref="http://en.wikipedia.org/wiki/Busy_beaver"title="ссылка: http://ru.wikipedia.org/wiki/Busy_beaver">трехгосударственный бобр</a> . </p><p> Лента состоит из 0s и 1s, состояния A, B, C и H (для Halt), а положение головы указывается путем записи буквы состояния перед символом, где находится голова. </p><p>Все части исходной ленты, на которой работает машина, должны быть указаны на входе. </p><p> Кроме того, демонстрируя, что алгоритм Маркова является Turing-полным, он также заставил меня поймать ошибку в реализации C ++, которая не была захвачена первыми четырьмя наборами правил. </p><pre> Машина Тьюринга: боберс тремя состояниями
# состояние A, символ 0 => запись 1, перемещение вправо, новое состояние BA0 -> 1B
состояние A, символ 1 => запись 1, перемещение влево, новое состояние C0A1 -> C01
1A1 -> C11
состояние B, символ 0 => запись 1, перемещение влево, новое состояние A0B0 -> A01
1B0 -> A11
состояние B, символ 1 => записать 1, двигаться вправо, новое состояние BB1 -> 1B
состояние C, символ 0 => запись 1, перемещение влево, новое состояние B0C0 -> B01
1C0 -> B11
состояние C, символ 1 => запись 1, перемещение влево, halt0C1 -> H01
- text: <code>markov(["A -> apple","B -> bag","S -> shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],"I bought a B of As from T S.")</code> should return "I bought a bag of apples from my brother.".
- text: <code>markov(["A -> apple","B -> bag","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],"I bought a B of As from T S.")</code> should return "I bought a bag of apples from T shop.".
- text: <code>markov(["A -> apple","WWWW -> with","Bgage -> ->.*","B -> bag","->.* -> money","W -> WW","S -> .shop","T -> the","the shop -> my brother","a never used -> .terminating rule"],"I bought a B of As W my Bgage from T S.")</code> should return "I bought a bag of apples with my money from T shop.".