Что такое БНФ БНФ?т.е. как мы определяем метаграмму БНФ? - PullRequest
8 голосов
/ 28 февраля 2012

Я пытаюсь определить БНФ БНФ.Другими словами, я пытаюсь определить метаграмму БНФ.То есть грамматика BNF, которая является экземпляром самой себя и может генерировать любую другую грамматику BNF.

Любые советы / подсказки / фрагменты будут высоко оценены!

Спасибо!

Ответы [ 2 ]

6 голосов
/ 29 февраля 2012

Вот один из них:

bnf = rules ;
rules = rule ;
rules = rules rule ;
rule = lefthandside EQUAL righthandside SEMICOLON  ;
lefthandside = IDENTIFIER ;
righthandside = ;
righthandside = righthandside token ;
token = IDENTIFIER ;
token = QUOTEDLITERAL ;

Это оставляет IDENTIFIER, QUOTEDLITERAL, EQUAL и SEMICOLON неопределенными, в предположении, что BNF определяется по токенам языка.

Вы можете определять BNF по символам,Просто добавьте:

EQUAL = '=' ;
SEMICOLON = ';' ;
IDENTIFIER = letter ;
IDENTIFIER = IDENTIFIER letterordigit ;
letterordigit = letter ;
letterordigit = digit ;
letter = 'A' ;
...
letter = 'Z' ;
digit = '0' ;
...
digit = '9' ;

Оставьте в качестве упражнения для читателя: добавьте выбор (|), несколько правил и звездочку клини, чтобы сделать это BNF для EBNF;этот ответ явно утомляет работу с пробелами, но вы можете справиться с этим, вставляя нетерминал «заготовки» везде, где допускаются пробелы (нехорошо, но работает).Существуют системы спецификаций BNF, в которых вы действительно пишете грамматику, в основном, над символами, и для вас выполняется неявная нетерминальная вставка такого типа (например, "Синтаксический формализм определения" Stratego ).

Если вы хотите ошеломляющий урок в BNF-about-BNF, вы должны прочитать документ / сделать учебное пособие для системы обработки BNF от честного до черта 1965 года под названием «MetaII».В этой статье описывается, как использовать BNF в BNF и как построить два компилятора на всех 10 страницах.

(Один большой урок здесь: прочитайте все материалы по информатике 60-х и 70-х годов. Их не так уж много, и вы будете удивлены тем, сколько там хорошего материала).

0 голосов
/ 07 февраля 2017
<line> ::= '<' <word> '>' '::=' <definition>
<definition> ::= <word> '|' | '' <definition> | ''
...