Форум программистов, компьютерный форум CyberForum.ru

Формы Бэкуса Науэра - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Antoha123
0 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 10
05.01.2013, 17:56     Формы Бэкуса Науэра #1
Как записать одномерный массив с помощью грамматики?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2013, 17:56     Формы Бэкуса Науэра
Посмотрите здесь:

Примеры схем Бэкуса Наура. C++
C++ Расширенные формы Бэкуса-Наура (синтаксический анализатор)

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
05.01.2013, 18:46     Формы Бэкуса Науэра #2
Не ясно что именно записать. Объявление массива, список инициализации, какое-то текстовое представление... Что именно? Приведите пример.
Antoha123
0 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 10
05.01.2013, 19:11  [ТС]     Формы Бэкуса Науэра #3
Извиняюсь - не правильно сформулировал вопрос. Никак не могу понять как записывается грамматика, прочитал много по этой теме, но как это записать с помощью грамматики так и не понимаю. Хоть кто-нибудь объяснил бы на пальцах) Надо записать вот это:

Для языка Cи
Тип данных: int, float
Операторы: присвоить, for, continue, if
Операции: +, *,/, >, !=
Одномерный массив
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
05.01.2013, 19:22     Формы Бэкуса Науэра #4
В правильности не уверен.

Код
<array-declaration> ::= <type> <white-space> <name> "[" <constant> "]" ";"
<type> ::= "int" | "char" | "long" | "float" | "double"
<name> ::= <non-digit> | <name> <digit> |<name><non-digit>
<constant> ::= <digit> | <constant> <digit> 
<white-space> ::= " "
<nondigit> ::= "_" | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" | "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form
Antoha123
0 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 10
05.01.2013, 19:47  [ТС]     Формы Бэкуса Науэра #5
Вот пример для Pascal тут все немного изменено для программы. Мне впринципе примерно тоже и надо сделать только для си:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<program> -> program id ; <label> <var> Begin <stmt_list> end . %
<label> -> Label <const> ; | %
<const> -> const | const , <const> %
<var> -> Var <var_block> ; | %
<var_block> -> <name> : <type> | <name> : <type> ; <var_block> %
<name> -> id | id , <name> %
<type> -> <simple> | <massive> %
<simple> -> integer | char %
<massive> -> array [ <ordinary> ] of <simple> %
<ordinary> -> <ord_type> | <ord_type> , <ordinary> %
<ord_type> -> const .. const %
<stmt_list> -> <const_stmt> | <const_stmt> ; <stmt_list> %
<const_stmt> -> const : <stmt> | <stmt> %
<stmt> -> <assign> | <case> | <for> | <goto> | <compound> %
<assign> -> id := <expression> %
<compound> -> Begin <stmt_list> end %
<for> -> For id := <expression> to <expression> do <stmt> %
<goto> -> GoTo const %
<case> -> Case <expression> of <case_block> ; end %
<case_block> -> <meaning> : <stmt> | <meaning> : <stmt> ; <case_block> %
<meaning> -> const | const , <meaning>  %
<expression> -> <simple_expr> | <simple_expr> = <simple_expr> | <simple_expr> > <simple_expr> | <simple_expr> < <simple_expr> %
<simple_expr> -> <term> | <simple_expr> + <term> | <simple_expr> - <term> %
<term> -> <factor> | - <factor> | + <factor> %
<factor> -> const | id | ( <expression> ) | not <factor> id %
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
05.01.2013, 20:12     Формы Бэкуса Науэра #6
Цитата Сообщение от Antoha123 Посмотреть сообщение
Извиняюсь - не правильно сформулировал вопрос. Никак не могу понять как записывается грамматика, прочитал много по этой теме, но как это записать с помощью грамматики так и не понимаю. Хоть кто-нибудь объяснил бы на пальцах) Надо записать вот это:

Для языка Cи
Тип данных: int, float
Операторы: присвоить, for, continue, if
Операции: +, *,/, >, !=
Одномерный массив
Код
<identifier> ::= <nondigit> | <identifier> <nondigit> | <identifier> <digit> 
<nondigit> ::= "_" | "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" | "y" | "z" | "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z" 
<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" 
<constant> : <integer-constant> | <floating-constant>  
<integer-constant> ::= <nonzero-digit> | <decimal-constant> <digit> 
<nonzero-digit> : "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" 
<floating-constant> ::= <fractional-constant> | <fractional-constant> <exponent-part>  | <digit-sequence> <exponent-part> #
<fractional-constant> ::= <digit-sequence> "." <digit-sequence> | "." <digit-sequence> | <digit-sequence> "."
<exponent-part> ::= "e" <sign> <digit-sequence> | "E" <sign> <digit-sequence> | "e" <digit-sequence> | "E" <digit-sequence> #
<sign> ::= "+" | "-"
<digit-sequence> ::= <digit> | <digit-sequence> <digit> 

<declaration> ::=  <declaration-specifiers> <init-declarator-list> ";" 
<declaration-specifiers>  ::= <type-specifier>
<type-specifier> ::=  "int" | "float"
<init-declarator-list> ::= <init-declarator> 
<init-declarator> : <declarator> | <declarator> "=" <initializer>
<declarator> ::= <direct-declarator> 
<direct-declarator> ::= <identifier> | <direct-declarator> "[" <assignment-expression> "]" | <direct-declarator> "["  "]"   
<initializer> ::= <assignment-expression> | "{" <initializer-list> "}" 
<initializer-list> ::= <designation> <initializer> | <initializer> |   <initializer-list> "," <designation> <initializer>  | <initializer-list> ","  <initializer> #
<designation> ::= <designator-list> "=" #
<designator-list> ::= <designator> | <designator-list> <designator> #
<designator> ::= "[" <constant-expression> "]"  #

<primary-expression> ::= <identifier> | <constant> 
<postfix-expression> ::= <primary-expression> | <postfix-expression> "[" <expression> "]"  
<multiplicative-expression> ::= <postfix-expression> | <multiplicative-expression> "*"<postfix-expression> | <multiplicative-expression> "/" <postfix-expression>
<additive-expression> ::= <multiplicative-expression> | additive-expression "+" <multiplicative-expression>
<shift-expression> ::= <additive-expression>
<relational-expression> ::= <shift-expression> | <relational-expression> ">" <shift-expression>  
<equality-expression> ::= <relational-expression> | <equality-expression> "!=" <relational-expression>
<conditional-expression> ::= <equality-expression> 
<assignment-expression> ::= <conditional-expression> | <unary-expression> <assignment-operator> <assignment-expression> 
<assignment-operator> ::= "="
<expression> ::= <assignment-expression> 

<statement> ::= <expression-statement> | <selection-statement> | <iteration-statement> | <jump-statement> 
<expression-statement> ::= <expression> ";" | ";" 
<selection-statement> ::= "if" "(" <expression> ")" <statement>
<iteration-statement> ::= "for" "(" <expression> ";" <expression> ";" <expression> ")" <statement> | "for" "("  ";" <expression> ";" <expression> ")" <statement> | "for" "(" <expression> ";"  ";" <expression> ")" <statement> | "for" "(" <expression> ";" <expression> ";"  ")" <statement> | "for" "("  ";"  ";" <expression> ")" <statement> | "for" "("  ";" <expression> ";"  ")" <statement> | "for" "(" <expression> ";"  ";"  ")" <statement> | "for" "("  ";"  ";"  ")" <statement> 
<jump-statement> ::= "continue" ";"
Antoha123
0 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 10
05.01.2013, 20:39  [ТС]     Формы Бэкуса Науэра #7
+1 Спасибо! Вроде оно, пойду разбираться)
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
05.01.2013, 20:44     Формы Бэкуса Науэра #8
Наименования взяты из стандарта
http://www.open-std.org/jtc1/sc22/wg...docs/n1124.pdf (см. Annex A)
Antoha123
0 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 10
06.01.2013, 16:24  [ТС]     Формы Бэкуса Науэра #9
Блин все таки это немного сложновато - в том примере на Паскале все гораздо проще, да и программа проверяющая грамматику ругается на цифры(
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
06.01.2013, 18:53     Формы Бэкуса Науэра #10
Конечно. У Паскаля, в отличие от Плюсов, контекстно-независимая грамматика. Она действительно гораздо проще.
Antoha123
0 / 0 / 0
Регистрация: 02.01.2013
Сообщений: 10
06.01.2013, 19:37  [ТС]     Формы Бэкуса Науэра #11
А вот на си - тоже вроде бы не так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<PrgModule> -> <mparam> main ( <mparam> ) { <Define_list> <Statement_list> } %
<mparam> -> void |  %
 
<Define_list> -> <Define> <_Define_list> | %
<Define> -> <type> <id_list> ; %
<type> -> char | int %
<id_list> -> id <ContinList> %
<ContinList> -> , id <ContinList> | %
<_Define_list> -> <Define> <_Define_list> | %
 
<Statement_list> -> <Statement> <ContinueStatement_list> | %
<ContinueStatement_list> -> <Statement> <ContinueStatement_list> | %
<Statement> -> <Assign> | <if> | <block> | ; | <for> %
 
<Assign> -> id = <Expression> ; %
<Expression> -> <term> <Exp_Continue> %
<term> -> id | const %
<Exp_Continue> -> * <term> <Exp_Continue> | + <term> <Exp_Continue> | - <term> <Exp_Continue> | %
 
<if> -> if ( <Condition> ) <Statement> else <Statement> %
<Condition> -> <term> <Continue_Condition> %
<Continue_Condition> -> < <term> | > <term> | <= <term> | >= <term> | != <term> %
 
<block> -> { <Statement_list> } %
<for> -> for ( <init> ; <cond> ; <Adjst> ) <Statement> %
<init> -> <term> = <Expression> %
<Adjst> -> id = id + const %
<cond> -> id <Continue_Condition1> const %
<Continue_Condition1> -> < | > | <= | <= %
Yandex
Объявления
06.01.2013, 19:37     Формы Бэкуса Науэра
Ответ Создать тему
Опции темы

Текущее время: 07:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru