2015-03-18 6 views
-1

Я хочу, чтобы BNF, EBNF, регулярное выражение и синтаксис lex распознавали следующее: Строка должна начинаться с одного из A, B, C, D или E, за которым следует столько же, сколько вам нравится в A, B, C , D, E, 0,1,2,3, _ вы также можете иметь 1 или 0 символа $.Являются ли следующие BNF, EBNF, регулярные выражения и синтаксис Lex правильными?

До сих пор я сделал:

регулярное выражение

[A-E]([A-E0-9_]*[$]?[A-E0-9_]*) 

BNF

<S>::= <letter><Rest> 
<Rest>::=<rest1><symbol>|<rest1><symbol><rest1>|<symbol><rest1>|<rest1>|<symbol> 
<rest1>::=<character><rest1>|<rest1><character>|<character> 
<character>::=A|B|C|D|E|1|2|3|4|_ 
<letter>::=A|B|C|D|E 
<symbol>::=$ 

EBNF

S=letter{character}[symbol]{character} 
letter=|"A"|"B"|"C"|"D"|"E"| 
character=|"1"|"2"|"3"|"4"|"A"|"B"|"C"|"D"|"E"|"_" 
symbol="$" 

Лекса

^[A-E][A-E0-3_]*[$]?[A-E0-3_]*$ 

Правильны ли они? Регулярное выражение на 100% правильное. Я думаю, что у меня есть сомнения относительно ebnf, bnf и lex

ответ

1

Есть несколько проблем. Ссылаясь на BNF and EBNF: What are they and how do they work? (один из первых используемых веб-хитов - без цитируемого изменения, трудно предложить конкретные советы ...):

  • регулярное выражение и закон не согласны: вы используете «^» в привязать последний, но не первый. lex поддерживает чередование «|» в скобках, как и в регулярном выражении.
  • в BNF, линия определение rest1 выглядит странно (вы имели в виду, чтобы повторялись с помощью rest?)
  • страницы Garshol не использует квадратные скобки, как вы делали для [symbol] в EBNF. Скорее, он использует * и ? (как в регулярных выражениях).
  • ни BNF или EBNF показывают использование цифр 0-9
  • на самом деле, регулярное выражение использует 0-9, но постановка задачи является 0-3

--- надежда, что помогает

 Смежные вопросы

  • Нет связанных вопросов^_^