Здравствуйте, Arsen.Shnurkov, Вы писали:
AS>Как, по-твоему, описать любую другую директиву, отличную от директивы Include ?
AS>Если расписывать по буквам вручную, как ты выше предлагаешь,
AS>то во что превратится этот процесс, если станет две директивы типа "include'? а если семь?
Тут проще ввести фактор приоритетности, — жадность/ленивость и отсечки.
Не знаю, как это на БНФ записать, — на регекспах это атомарные группы (?>blablabla)
Ну как-то так будет
directive = include_keyword, !, space, valid_path
| exclude_keyword, !, space, valid_path
| everything_else
;
Или вот так
directive = some_include | some_exclude | everything_else;
some_include = good_include | bad_include;
good_include = include_keyword, space, valid_path;
bad_include = include_keyword, ERROR_BEGINS_HERE, bullshit_till_end_of_sentence, ERROR_ENDS_HERE;
(* или так *)
some_include = include_keyword,
( space, valid_path, {space}, [ unexpected ]
| unexpected
),
LOOKAHEAD_end_of_sentence; (* сопоставляется, но не съедает, признак конца *)
unexpected = ERROR_BEGINS_HERE, (* сопоставляется с пустой строкой, служит признаком для парсера *)
bullshit_till_the_end_of_sentence,
ERROR_ENDS_HERE; (* то же самое *)
bullshit_till_the_end_of_sentence = {.}, LOOKAHEAD_end_of_sentence;
(* или в более сложных случаях, может проглатывать парные скобки, если признак конца фразы может встретиться внутри фразы, под скобками) *)
Заодно научишь парсер восстанавливаться после ошибок.