Re[5]: контекстно-свободная самоописывающаяся грамматика
От: Кодт Россия  
Дата: 16.03.17 10:49
Оценка:
Здравствуйте, 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;
(* или в более сложных случаях, может проглатывать парные скобки, если признак конца фразы может встретиться внутри фразы, под скобками) *)

Заодно научишь парсер восстанавливаться после ошибок.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.