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

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

Изменено 03.03.2017 10:12 Arsen.Shnurkov

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

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

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

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

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

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

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

(*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В" ;


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

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

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

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

(*К*) комментарий = "(*" , { ( знак - "*" ) | ( "*" , знак - ")" ) } , "*)" ;
(*Л*) любой символ = . ;
(*М*) маркер = "0шДЕ", "0шББ", "0шБЕ" ;
(*Н*) новая строка = перевод строки | возврат каретки , перевод строки | возврат каретки ;
(*О*) обм = ябм | комментарий ; (* обязательное белое место *)
(*П*) тп = табуляция | пробел, { табуляция | пробел } ;
(*Р*) расширение текстореза = "?" , { знак - "?" } , "?" ;
(*С*) строка = двойная кавычка , символ , двойная кавычка ;
(*Т*) символ = знак - двойная кавычка | "0ш" , 1*2 { шестнадцатеричная цифра };
(*У*) гм = { обм } ; (* сгруппированное необязательное белое место *)
(*Ф*) ябм = тп | новая строка ; (* явно белое место *)
(*Х*) не менее = десятичное число ;
(*Ц*) не более = десятичное число ;
(*Ч*) десятичное число = десятичная цифра - "0" , { десятичная цифра } ;

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

(*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В" ;