Проблемы преобразования конкретного правила EBNF в BNF - PullRequest
0 голосов
/ 02 марта 2019

Я работаю с Flex / Bison и VHDL 93. У меня проблема со следующим правилом:

choices ::= choice { | choice }

Если я преобразую его в BNF:

N1 ::= %empty | choice
N2 ::= %empty | N2 N1
choices ::= choice N2
choices ::= choice | choice N2 N1
choices ::= choice | choices N1
choices ::= choice | choices | choices choice

Но выбор: выбор бесполезен, так что, наконец,

choices ::= choice | choices choice

Итак, в чем проблема?Хорошо, представьте, что правило для преобразования:

choices ::= choice { choice }

И я применяю правила для преобразования в BNF:

N1 ::= choice
N2 ::= %empty | N2 N1
choices ::= choice N2
choices ::= choice | choice N2 N1
choices ::= choice | choices N1
choices ::= choice | choices choice

Что является тем же самым предыдущим результатом !!!Что происходит?В чем проблема?У меня были проблемы с этим правилом более года назад, я снова работаю в этом проекте, и мои проблемы с выбором все еще здесь: P

Вот что стандарт VHDL 93 сказал о вариантах:

Во втором случае «варианты» могут быть заменены списком «вариантов», разделенных вертикальными чертами.

Я не знаю, откуда взято «,».

Спасибо.

1 Ответ

0 голосов
/ 03 марта 2019

Описание VHDL совершенно ясно: вам нужен список choice, разделенных вертикальными полосами .EBNF, возможно, вводит в заблуждение, поскольку вертикальная черта может быть неверно истолкована как оператор EBNF.Но из описания видно, что это на самом деле токен.

Итак, в синтаксисе bison / yacc:

choices: choice
       | choices '|' choice
...