Скачиваний:
8
Добавлен:
01.05.2014
Размер:
209.92 Кб
Скачать

3. Описание синтаксического анализатора.

3.1. Описание языка

3.1.1. Бэкусовы нормальные формы

ПРОГРАММА

<ПРОГРАММА>::=

program <ИДЕНТИФИКАТОР>;<ОПИСАНИЯ>;<СОСТ_ОПЕРАТОР>.|

program <ИДЕНТИФИКАТОР> ; <СОСТ_ОПЕРАТОР>.|

<ОПИСАНИЯ> ; <СОСТ_ОПЕРАТОР>.|

<СОСТ_ОПЕРАТОР>.

РАЗДЕЛ ОПИСАНИЙ

<ОПИСАНИЯ>::=

<РАЗДЕЛ ОПИСАНИЯ>|

<ОПИСАНИЯ> ; < РАЗДЕЛ ОПИСАНИЯ>

1.<РАЗДЕЛ ОПИСАНИЯ>::=

label <ОПИСАНИЕ_МЕТОК> |

var <ОПИСАНИЕ_ПЕРЕМЕННЫХ>|

const <ОПИСАНИЕ_КОНСТАНТ>

1.1. <ОПИСАНИЕ_МЕТОК>::=

<МЕТКА> |

<ОПИСАНИЕ_МЕТКИ> , <МЕТКА>

1.2. <ОПИСАНИЕ_ПЕРЕМЕННЫХ>::=

<ОП1>|

<ОПИСАНИЕ_ПЕРЕМЕННЫХ> ; <ОП1>

<ОП1>::=<СПИСОК_ПЕРЕМЕННЫХ> : <ТИП>

1.2.1.<СПИСОК_ПЕРЕМЕННЫХ>::=

<ИДЕНТИФИКАТОР>|

<СПИСОК_ПЕРЕМЕННЫХ>,<ИДЕНТИФИКАТОР>

1.2.2.<ТИП>::= integer | boolean | array[<Список промежутков>] of boolean

<Список промежутков>::=

<Промежуток>|

<Промежуток>,<Список промежутков>

<Промежуток> ::= <ЦЕЛОЕ БЕЗ ЗНАКА>. .<ЦЕЛОЕ БЕЗ ЗНАКА>

1.3. <ОПИСАНИЕ_КОНСТАНТ>::=

<ОПИСАНИЕ_КОНСТ>|

<ОПИСАНИЕ_КОНСТАНТ> ; <ОПИСАНИЕ_КОНСТ>

<ОПИСАНИЕ_КОНСТ>::=<ИДЕНТИФИКАТОР> = <ЦЕЛОЕ_bool>;

<ЦЕЛОЕ_bool> = <ЦЕЛОЕ>| true | false

РАЗДЕЛ ОПЕРАТОРОВ

<СОСТ_ОПЕРАТОР>::=

begin <СПИСОК ОПЕРАТОРОВ> end |

begin end

<СПИСОК ОПЕРАТОРОВ>::=

<ОПЕРАТОР >|

<СПИСОК ОПЕРАТОРОВ>;< ОПЕРАТОР >

2. <ОПЕРАТОР> ::= <ОП1> | <СПИСОК_МЕТОК> :

<ОП1>::= <СПИСОК_МЕТОК> : <ОП2>|

<ОП2>

<ОП2>::= <ОП3> | <СОСТ_ОПЕРАТОР>

2.1. <СПИСОК_МЕТОК>::=

<МЕТКА> |

<СПИСОК_МЕТОК> : <МЕТКА>

2.2. <ОП3>::= <ОПЕРАТОР_ПРИСВАИВАНИЯ>|

<ОПЕРАТОР_ВВОДА> |

<ОПЕРАТОР_ВЫВОДА> |

<ОПЕРАТОР_ПЕРЕХОДА> |

<УСЛОВНЫЙ_ОПЕРАТОР>|

<ОПЕРАТОР_ЦИКЛА>|

2.2.1.<ОПЕРАТОР_ПРИСВАИВАНИЯ> ::= <ПЕРЕМ>:=<ВЫРАЖЕНИЕ>

2.2.2.<ОПЕРАТОР_ВВОДА> ::=

readln(<СПИСОК_ПАРАМЕТРОВ>) | read(<СПИСОК_ПАРАМЕТРОВ>)

2.2.3. <ОПЕРАТОР_ВЫВОДА> ::=

writeln(<СПИСОК_ПАРАМЕТРОВ>) |

write(<СПИСОК_ПАРАМЕТРОВ>)

<СПИСОК_ПАРАМЕТРОВ> ::=

<ПАРАМЕТР> |

<СПИСОК_ПАРАМЕТРОВ>,<ПАРАМЕТР>

<ПАРАМЕТР> ::= <ПЕРЕМ> | <ЦЕЛОЕ> | '<СТРОКА>'

2.2.4.<ОПЕРАТОР_ПЕРЕХОДА> ::= goto <МЕТКА>

2.2.5. <УСЛОВНЫЙ_ОПЕРАТОР> ::=

if <ВЫРАЖЕНИЕ> then <СОСТ_ОПЕРАТОР> |

if <ВЫРАЖЕНИЕ> then <СОСТ_ОПЕРАТОР> else <СОСТ_ОПЕРАТОР>

2.2.6. <ОПЕРАТОР_ЦИКЛА> ::=while <ВЫРАЖЕНИЕ> do <ОП2>

ВЫРАЖЕНИЯ

<ВЫРАЖЕНИЕ> ::= <ВЫРАЖЕНИЕ> < <В1> | <В1>

<В1>::= <В1>> <В2> | <В2>

<В2>::= <В2><= <В3> | <В3>

<В3>::= <В3>>= <В4> | <В4>

<В4>::= <В4><> <В5> | <В5>

<В5>::= <В5>= <В6> | <В6>

<В6>::= <В6>or <В7> | <В7>

<В7>::= <В7>– <В7> | <В8>

<В8>::= <В7>+ <В9> | <В9>

<В9>::= <В8>/ <В10> | <В10>

<В10>::= <В10>and <В11> | <В11>

<В11>::= <В11>* <В12> | <В12>

<В12>::= <В12>not <В13> | <В13>

<В13>::=(<ВЫРАЖЕНИЕ>) | <ЦЕЛОЕ> | <ПЕРЕМ>

***<СТРОКА> ::= <СИМВОЛ> | <СТРОКА><СИМВОЛ>

<МЕТКА>::= <ИДЕНТИФИКАТОР> | <ЦЕЛОЕ БЕЗ ЗНАКА>

<ЦЕЛОЕ>::= – – <ЦЕЛОЕ БЕЗ ЗНАКА>|

<ЦЕЛОЕ БЕЗ ЗНАКА>

Здесь знак – – означает унарный минус

<ПЕРЕМ>::= <ИДЕНТИФИКАТОР>|

<ИДЕНТИФИКАТОР> [<ИНДЕКСЫ>]

<ИНДЕКСЫ>::= <ВЫРАЖЕНИЕ>, <ИНДЕКСЫ>|

<ВЫРАЖЕНИЕ>

***<ЦЕЛОЕ БЕЗ ЗНАКА>::= <ЦИФРА> | <ЦЕЛОЕ БЕЗ ЗНАКА> <ЦИФРА>

***<ИДЕНТИФИКАТОР>::= <БУКВА> | <БУКВА> <ПОЛЕД_СИМ>

***<ПОСЛЕД_СИМ>::= <СИМВОЛ> | <ПОСЛЕД_СИМ><СИМВОЛ>

***<СИМВОЛ>::=<БУКВА>|<ЦИФРА>

***<ЦИФРА>::=1|2|3|4|5|6|7|8|9|0

***<БУКВА>::=

_|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

Здесь звездочками отмечены те описания, которые на этапе лексического анализа становятся лексемами, т.е. при описании синтаксиса языка эти элементы можно рассматривать как терминалы.

  1. Синтаксис языка

Для приведения всей грамматики к грамматике операторного предшествования исходная грамматика разбита на 5 частей, каждая из которых описывает грамматику операторного предшествования.

Нетерминалы, которые являются начальными в одной из пяти грамматик в остальных описываются как терминалы. В дальнейшем, в синтаксическом анализаторе, при встрече терминала, соответствующего начальному нетерминалу одной из оставшихся частей грамматики, мы переключаемся в нужную часть грамматики и продолжаем разбор входной цепочки в ней, по правилам, описанным для этой части грамматики.

Грамматика № 1_1. Программа

Правила :

1) PRG -> pr i ; OO ; sop .

2) PRG -> pr i ; sop .

3) PRG -> OO ; sop .

4) PRG -> sop .

5) OO -> ro

6) OO -> OO ro

где:

Терминалы :

pr = program,

ro = раздел описаний (соответствует 1-му символу грамматики № 1_1, описывающей раздел описаний),

; , . , i = идентификатор, sop = сост_оператор (грамматика № 1_2, описывающая раздел операторов)

Нетерминалы :

PRG = программа OO = описания

Матрица предшествования:

Функция перенос Функция свертка

правила грамматики :

1) PRG -> pr i ; PRG ; sop .

2) PRG -> pr i ; sop .

3) PRG -> PRG ; sop .

4) PRG -> sop .

5) PRG -> ro

6) PRG -> PRG ro

Грамматика № 1_2. Раздел описаний

Правила :

1) RO -> lab OM

2) RO -> c OC

3) RO -> var OP

4) OC -> i = VR ;

5) OC -> i = VR ; OC

6) OP -> LP : T ; OP

7) OP -> LP : T ;

8) OM -> m

9) OM -> OM , m

10) LP -> i

11) LP -> LP , i

12) T -> int

13) T -> bl

14) T -> ar [ PR ] of bl

15) VR -> Z

16) VR -> tru

17) VR -> fal

18) Z -> -- n

19) Z -> n

20) PR -> n . . n

где:

Терминалы :

lab = ключевое слово label, var = ключевое слово, c = ключевое слово const,

i = идентификатор, n = целое без знака,

m = метка (соответствует грамматике № 1_3),

, , ; , : , = , [ , ] , .

int = ключевое слово integer ,

bl = ключевое слово boolean,

ar = ключевое словоarray,

of = ключевое слово,

Нетерминалы :

RO = раздел описаний

OC = описание констант

OP = описание переменных

OM = описание меток

LP = список меток

T = тип

PR = промежуток

VR, Z

Матрица предшествования:

Функция перенос

Функция свертка

правила грамматики :

1) RO -> lab RO

2) RO -> c RO

3) RO -> var RO

4) RO -> i = vr ;

5) RO -> i = vr ; RO

6) RO -> RO : RO ; RO

7) RO -> RO : RO ;

8) RO -> m

9) RO -> RO , m

10) RO -> i

11) RO -> RO , i

12) RO -> int

13) RO -> bl

14) RO -> ar [ RO ] of bl

15) RO -> n . . n

Соседние файлы в папке Курсовая работа2