Compare commits
2 Commits
72d02e0a8d
...
5a76bc4ee2
| Author | SHA1 | Date | |
|---|---|---|---|
| 5a76bc4ee2 | |||
| 761f6ca9ff |
38
README.md
38
README.md
@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
Это очень маленький проект, который нужен для одной единственной лабы.
|
Это очень маленький проект, который нужен для одной единственной лабы.
|
||||||
|
|
||||||
Для работы он принимает rulebook файл (расширение `.rb`), в котором содержатся возможные преобразования над последовательностями символов. Далее можно перейти в интерактивный режим или скормить ввод напрямую
|
Для работы он принимает rulebook файл (расширение `.rb`, хотя так как это текстовые файлы, расширение у них может быть любое), в котором содержатся возможные преобразования над последовательностями символов. Далее можно перейти в интерактивный режим или скормить ввод напрямую.
|
||||||
|
|
||||||
Чтобы запустить приложение в интерактивном режиме, достаточно просто отдать ему книгу правил
|
Чтобы запустить приложение в интерактивном режиме, достаточно просто отдать ему книгу правил:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
poetry run markov.py <rulebook>
|
poetry run markov.py <rulebook>
|
||||||
@ -14,21 +14,43 @@ poetry run markov.py <rulebook>
|
|||||||
Можно и напрямую передать ввод:
|
Можно и напрямую передать ввод:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
poetry run markov.py -c <string>
|
poetry run markov.py <rulebook> -c <string>
|
||||||
```
|
```
|
||||||
|
|
||||||
Строки должны быть без пробелов
|
Для получения многословного вывода (который можно использовать для сдачи лабораторной работы), предусмотрена опция `-v`:
|
||||||
|
|
||||||
|
```
|
||||||
|
poetry run markov.py <rulebook> -c <string> -v
|
||||||
|
```
|
||||||
|
|
||||||
|
Стоит учесть, что опция `-v` без использования `-c` не учитывается. Если вы начнете с этим флагом в интерактивном режиме, он будет проигнорирован. В интерактивном режиме другой способ получить многословный вывод.
|
||||||
|
|
||||||
|
## Описание интерактивного режима
|
||||||
|
|
||||||
|
Интерактивный режим позволяет вводить последовательности символов, к которым будут применяться заданные вами правила. Тем не менее некоторые последовательности символов зарезервированы:
|
||||||
|
|
||||||
|
- `h:` - выводит help.
|
||||||
|
- `r:` - выводит список правил из используемой в этой сессии книги.
|
||||||
|
- `v:` - включает многословный режим для следующей последовательности символов. Она не игнорирует ввод после двоеточия, поэтому пользоваться ей следует так: `v: ||`. Заметим также, что пробелы перед символами и после них игнорируются, также как и табы.
|
||||||
|
- `e:` - мгновенно завершает работу приложения. Также его можно завершить отправив на вход EOF.
|
||||||
|
- `:` - используется, если требуемая для алгоритма последовательность символов совпадает с зарезервированной. Все, что написано после двоеточия воспринимается без изменений (Только обрезаются пробелы). Только отбрасывается символ двоеточия>
|
||||||
|
|
||||||
|
NOTE: Как правило во всех случаях пробелы будут обрезаться, поскольку синтаксис книг правил не подразумевает возможность создавать операции над ними. Поэтому если в середине последовательности встретится пробел, он там навсегда и останется. Впрочем может вам это и нужно.
|
||||||
|
|
||||||
## Синтаксис книг правил
|
## Синтаксис книг правил
|
||||||
|
|
||||||
На каждой отдельной строке идет описания нового правила. Каждое правило описывает преобразования одной цепочки символов в другую цепочку символов. Для указания перехода используется символ `->` Или если преобразование завершающее `->|`. Также есть зарезервирвованный символ пустой подстроки: `$`
|
На каждой отдельной строке идет описания нового правила. Каждое правило описывает преобразования одной цепочки символов в другую цепочку символов. Для указания перехода используется символ `->` или, если преобразование завершающее, `->|`. Также есть зарезервирвованный символ пустого множества: `$`
|
||||||
|
|
||||||
Есть возможность оставлять комментарии через символ `//`, по аналогии с C
|
Есть возможность оставлять комментарии через символ `//`, по аналогии с C.
|
||||||
|
|
||||||
Пример:
|
Пример:
|
||||||
|
|
||||||
```
|
```
|
||||||
ss -> +s // comment
|
ss -> +s // Комментарий
|
||||||
s ->| $
|
s ->| $ // Блокирующая операция, переводящая s в пустое множество
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Замечание по поводу синатксических ошибок
|
||||||
|
|
||||||
|
Обработка синтаксических огрехов у меня не предусмотрена, поэтому если где-то произошла описка, то в лучшем случае программа свалится от необработанного исключения, в худшем будет undefined behaviour
|
||||||
|
|||||||
@ -30,16 +30,20 @@ def interactve_mode(rulebook: Rulebook):
|
|||||||
elif user_input.startswith("e:"):
|
elif user_input.startswith("e:"):
|
||||||
return
|
return
|
||||||
elif user_input.startswith(":"):
|
elif user_input.startswith(":"):
|
||||||
print(rulebook.transform(user_input[1:]))
|
print(
|
||||||
|
rulebook.transform(
|
||||||
|
user_input[1:].strip(" \t")
|
||||||
|
)
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
print(rulebook.transform(user_input))
|
print(rulebook.transform(user_input.strip(" \t")))
|
||||||
|
|
||||||
def print_help():
|
def print_help():
|
||||||
print("you can type expressions right after prompt. However there is some "
|
print("You can type expressions right after prompt. However there are some "
|
||||||
'reserved chars: "h:" to print help, "v:" to run next expression in '
|
'reserved sequences: "h:" to print help, "v:" to run next expression in '
|
||||||
'verbose mode, "r:" to view rules, "e:" to exit, and ":" to imidiately '
|
'verbose mode, "r:" to view rules, "e:" to exit, and ":" to imidiately '
|
||||||
'start prompt.Can be omited if your prompt doesn\'t start from'
|
'start prompt (can be omitted if your prompt doesn\'t start from '
|
||||||
'reserved sequence. Note that your input after "h:", "e:" and "r:" will '
|
'reserved sequence). Note that your input after "h:", "e:" and "r:" will '
|
||||||
'be ignored')
|
'be ignored')
|
||||||
|
|
||||||
def _print_rules(rules: list[Rule]) -> None:
|
def _print_rules(rules: list[Rule]) -> None:
|
||||||
|
|||||||
Reference in New Issue
Block a user