Информация об изменениях

Сообщение контекстно-свободная самоописывающаяся грамматика от 03.03.2017 8:42

Изменено 03.03.2017 8:46 Arsen.Shnurkov

контекстно-свободная самоописывающаяся грамматика
Помогите, пожалуйста, найти ошибки в коде:

       (* контекстно-свободная самоописывающаяся грамматика *)

(*А*) файл = гм , набор правил , гм ;
(*Б*) набор правил = правило , { гм , правило } ;
(*В*) правило = имя , гм , "=" , гм , выражение , гм , ";" ;
(*Г*) выражение = { перечисление , гм , "|" , гм , перечисление };
(*Д*) перечисление = выбор , гм , { "," , гм , выбор } ;
(*Е*) выбор = имя | строка | утаивание | группировка | повторение | исключение | расширение текстореза ;
(*Ё*) утаивание = "[" , гм , выражение , гм , "]" ;
(*Ж*) группировка = "(" , гм , выражение , гм , ")" ;
(*З*) повторение = [ [ не менее , гм ] , "*" , [ гм , не более ] , гм ] , 
               "{" , гм , выражение , гм , "}" ;
(*И*) не менее = десятичное число ;
(*Й*) не более = десятичное число ;
(*К*) исключение = выражение , гм , "-" , гм , выражение ;
(*Л*) расширение текстореза = "?" , знак - "?" , "?" ;

       (* уровень регулярных выражений *)

(*М*) имя = часть имени, { тп , часть имени } ;
(*Н*) часть имени = буква , { буква | цифра } ;
(*О*) строка = двойная кавычка , символ , двойная кавычка;
(*П*) символ = знак - двойная кавычка | "0ш" , 1*2 { шестнадцатеричная цифра };
(*Р*) десятичное число := десятичная цифра, { десятичная цифра } ;

       (* уровень препроцессора *)
  
(*С*) гм = { обм } ; (* сгруппированное необязательное белое место *)
(*Т*) обм = ябм | комментарий ;
(*У*) комментарий = "(*" , { знак } - "*)" , "*)" ;
(*Ф*) ябм = тп | новая строка ; (* явно белое место *)
(*Х*) новая строка = перевод строки | перевод строки , возврат каретки | возврат каретки ;
(*Ц*) тп = табуляция | пробел, { табуляция | пробел } ; (* табуляции и пробелы *)

       (* уровень кодировки *)

(*0*) знак = 
       десятичная цифра | буква | заглавная буква | знак препинания | пробел | перевод строки | возврат каретки ;
(*1*) десятичная цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
(*2*) буква = "а" | "б" | "в" | "г" | "д" | "е" | "ё" | "ж" | "з" | "и" |
       "й" | "к" | "л" | "м" | "н" | "о" | "п" | "р" | "с" | "т" |
       "у" | "ф" | "х" | "ц" | "ч" | "ш" | "щ" | "ъ" | "ы" | "ь" |
       "э" | "ю" | "я" ;
(*3*) заглавная буква = "А" | "Б" | "В" | "Г" | "Д" | "Е" | "Ё" | "Ж" | "З" | "И" |
       "Й" | "К" | "Л" | "М" | "Н" | "О" | "П" | "Р" | "С" | "Т" |
       "У" | "Ф" | "Х" | "Ц" | "Ч" | "Ш" | "Щ" | "Ъ" | "Ы" | "Ь" |
       "Э" | "Ю" | "Я" ;
(*4*) знак препинания = 
       ":" | ";" | "=" | "," | "*" | "[" | "]" | "{" | "}" | "(" | ")" | "?" | двойная кавычка ;
(*5*) двойная кавычка = "0ш22" ;
(*6*) пробел = "0ш20" ;
(*7*) табуляция = "0ш07" ;
(*8*) перевод строки = "0ш0В" ;
(*9*) возврат каретки = "0ш0А" ;


1) То, что тут сложно использовать разные символы в строке — это должно решаться через механизм расширений.
Например можно написать
любой символ := ? ЛЮБОЙСИМВОЛ ? ;
а внутри реализации доопределять, что делать в случае если попалось расширение "ЛЮБОЙСИМВОЛ"
2) не обрабатывается Byte Order Mark (BOM) от UTF — это осознанный недостаток грамматики и исправлять его не хочу.
контекстно-свободная самоописывающаяся грамматика
Помогите, пожалуйста, найти ошибки в коде:

       (* контекстно-свободная самоописывающаяся грамматика *)

(*А*) файл = гм , набор правил , гм ;
(*Б*) набор правил = правило , { гм , правило } ;
(*В*) правило = имя , гм , "=" , гм , выражение , гм , ";" ;
(*Г*) выражение = { перечисление , гм , "|" , гм , перечисление };
(*Д*) перечисление = выбор , гм , { "," , гм , выбор } ;
(*Е*) выбор = имя | строка | утаивание | группировка | повторение | исключение ;
(*Ё*) утаивание = "[" , гм , выражение , гм , "]" ;
(*Ж*) группировка = "(" , гм , выражение , гм , ")" ;
(*З*) повторение = [ [ не менее , гм ] , "*" , [ гм , не более ] , гм ] , 
               "{" , гм , выражение , гм , "}" ;
(*И*) не менее = десятичное число ;
(*Й*) не более = десятичное число ;
(*К*) исключение = выражение , гм , "-" , гм , выражение ;
(*Л*) расширение текстореза = "?" , знак - "?" , "?" ;

       (* уровень регулярных выражений *)

(*М*) имя = часть имени, { тп , часть имени } ;
(*Н*) часть имени = буква , { буква | цифра } ;
(*О*) строка = двойная кавычка , символ , двойная кавычка;
(*П*) символ = знак - двойная кавычка | "0ш" , 1*2 { шестнадцатеричная цифра };
(*Р*) десятичное число := десятичная цифра, { десятичная цифра } ;

       (* уровень препроцессора *)
  
(*С*) гм = { обм } ; (* сгруппированное необязательное белое место *)
(*Т*) обм = ябм | комментарий ;
(*У*) комментарий = "(*" , { знак } - "*)" , "*)" ;
(*Ф*) ябм = тп | новая строка ; (* явно белое место *)
(*Х*) новая строка = перевод строки | перевод строки , возврат каретки | возврат каретки ;
(*Ц*) тп = табуляция | пробел, { табуляция | пробел } ; (* табуляции и пробелы *)

       (* уровень кодировки *)

(*0*) знак = 
       десятичная цифра | буква | заглавная буква | знак препинания
       | пробел | перевод строки | возврат каретки  | расширение текстореза ;
(*1*) десятичная цифра = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
(*2*) буква = "а" | "б" | "в" | "г" | "д" | "е" | "ё" | "ж" | "з" | "и" |
       "й" | "к" | "л" | "м" | "н" | "о" | "п" | "р" | "с" | "т" |
       "у" | "ф" | "х" | "ц" | "ч" | "ш" | "щ" | "ъ" | "ы" | "ь" |
       "э" | "ю" | "я" ;
(*3*) заглавная буква = "А" | "Б" | "В" | "Г" | "Д" | "Е" | "Ё" | "Ж" | "З" | "И" |
       "Й" | "К" | "Л" | "М" | "Н" | "О" | "П" | "Р" | "С" | "Т" |
       "У" | "Ф" | "Х" | "Ц" | "Ч" | "Ш" | "Щ" | "Ъ" | "Ы" | "Ь" |
       "Э" | "Ю" | "Я" ;
(*4*) знак препинания = 
       ":" | ";" | "=" | "," | "*" | "[" | "]" | "{" | "}" | "(" | ")" | "?" | двойная кавычка ;
(*5*) двойная кавычка = "0ш22" ;
(*6*) пробел = "0ш20" ;
(*7*) табуляция = "0ш07" ;
(*8*) перевод строки = "0ш0В" ;
(*9*) возврат каретки = "0ш0А" ;


1) То, что тут сложно использовать разные символы в строке — это должно решаться через механизм расширений.
Например можно написать
любой символ := ? ЛЮБОЙСИМВОЛ ? ;
а внутри реализации доопределять, что делать в случае если попалось расширение "ЛЮБОЙСИМВОЛ"
2) не обрабатывается Byte Order Mark (BOM) от UTF — это осознанный недостаток грамматики и исправлять его не хочу.