Материал: Методические указания по выполнению лабораторных работ № 9-11 по дисциплине «Системное программное обеспечение». Кремер О.Б

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Продолжение таблицы

do

Ключевое слово

X4

fg

Идентификатор

fg : 3

:=

Знак присваивания

S1

fg

Идентификатор

fg : 3

*

Знак арифметической операции

A1

0.5

Вещественная константа

0.5

;

Разделитель операторов

S2

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

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

Таким образом, алгоритм работы простейшего сканера можно описать так:

  • просматривается входной поток символов программы на исходном языке до обнаружения очередного символа, ограничивающего лексему;

  • для выбранной части входного потока выполняется функция распознавания лексемы;

  • при успешном распознавании информация о выделенной лексеме заносится в таблицу лексем, и алгоритм возвращается к первому этапу;

  • при неуспешном распознавании выдается сообщение об ошибке, а дальнейшие действия зависят от реализации сканера - либо его выполнение прекращается, либо делается попытка распознать следующую лексему (идет возврат к первому этапу алгоритма).

Работа программы-сканера продолжается до тех пор, пока не будут просмотрены все символы программы на исходном языке из входного потока.

Варианты заданий

1.  Входной язык содержит арифметические выражения, разделенные символом ;(точка с запятой). Арифметические выражения состоят из идентификаторов, десятичных чисел с плавающей точкой, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок.

2.  Входной язык содержит логические выражения, разделенные символом ;(точка с запятой). Логические выражения состоят из идентификаторов, констант true и false, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок.

3.  Входной язык содержит операторы условия типа ifthenelse и ifthen, разделенные символом ;(точка с запятой). Операторы условия содержат идентификаторы, знаки сравнения <, >, =, десятичные числа с плавающей точкой, знак присваивания (:=).

4.  Входной язык содержит операторы цикла типа fordo, разделенные символом ;(точка с запятой). Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, десятичные числа с плавающей точкой, знак присваивания (:=).

5.  Входной язык содержит арифметические выражения, разделенные символом ;(точка с запятой). Арифметические выражения состоят из идентификаторов, римских чисел, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок.

6.  Входной язык содержит логические выражения, разделенные символом ;(точка с запятой). Логические выражения состоят из идентификаторов, констант 0 и 1, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок.

7.  Входной язык содержит операторы условия типа ifthenelse и ifthen, разделенные символом ;(точка с запятой). Операторы условия содержат идентификаторы, знаки сравнения <, >, =, римские числа, знак присваивания (:=).

8.  Входной язык содержит операторы цикла типа fordo, разделенные символом ;(точка с запятой). Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, римские числа, знак присваивания (:=).

9.  Входной язык содержит арифметические выражения, разделенные символом ;(точка с запятой). Арифметические выражения состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок.

10.  Входной язык содержит логические выражения, разделенные символом ;(точка с запятой). Логические выражения состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок.

11.  Входной язык содержит операторы условия типа ifthenelse и ifthen, разделенные символом ;(точка с запятой). Операторы условия содержат идентификаторы, знаки сравнения <, >, =, шестнадцатеричные числа, знак присваивания (:=).

12.  Входной язык содержит операторы цикла типа fordo, разделенные символом ;(точка с запятой). Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, шестнадцатеричные числа, знак присваивания (:=).

Примечание:

-       римскими числами считать последовательности больших латинских букв X, V и I;

-       шестнадцатеричными числами считать последовательность цифр и символов ‘a’, ‘b’, ‘c’,’d’, ’e’ и ‘f’, начинающуюся с цифры (например: 89, 45ac9, 0abc4);

Ход выполнения работы:

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

2. Текст на входном языке задается в виде символьного (текстового) файла.

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

4. Длину идентификаторов и строковых констант считать ограниченной 32 символами.

Сдать преподавателю программу.

Оформить отчет в электронном виде и сдать.

Основные контрольные вопросы

  1. Что такое трансляция, компиляция, транслятор, компилятор?

  2. Из каких процессов состоит компиляция? Расскажите об общей структуре компилятора.

  3. Какую роль выполняет лексический анализ в процессе компиляции?

  4. Как связаны лексический и синтаксический анализ?

  5. Дайте определение цепочки, языка. Что такое синтаксис и семантика языка?

  6. Какие существуют методы задания языков? Какие дополнительные вопросы необходимо решить при задании языка программирования?

  7. Что такое грамматика? Дайте определения грамматики.

  8. Как выглядит описание грамматики в форме Бэкуса-Наура.

  9. Какие классы грамматик существуют? Что такое регулярные грамматики?

  10. Дайте определения контекстно-свободной грамматики, выводимости цепочки, непосредственной выводимости, длины вывода.

  11. Что такое конечный автомат? Дайте определение детерминированного и недетерминированного конечных автоматов.

  12. Какие проблемы необходимо решить при построении сканера на основе конечного автомата?

Вопросы к колоквиуму

  1. Представить схему грамматики, описывающей целые числа без знака.

  2. Представить схему грамматики, описывающей идентификаторы.

  3. Представить схему грамматики для арифметических выражений, использующих только знаки сложения и умножения.

  4. Представить схему грамматики для арифметических выражений, использующих скобки без вложенности.

  5. Представить схему грамматики для арифметических выражений, допускающих применение вложенных скобок.

  6. Представить схему грамматики для описания целых и вещественных переменных. Описание переменных определенного типа должно начинаться указателем типа 'real' или 'int'. В полном тексте описания переменных определенного типа могут повторяться.

  7. Составить таблицу идентификаторов и таблицу лексем для следующего фрагмента исходного кода:

begin

for I := 1 to N do m := m + 5

8. Составить таблицу идентификаторов и таблицу лексем для следующего фрагмента исходного кода:

If I > 10 then d := 20

Else d := 30

9. Составить таблицу идентификаторов и таблицу лексем для следующего фрагмента исходного кода:

Dim A As String, B As Integer

A = 20 : B = 10

Приложение

Таблица кодов виртуальных клавиш

Symbolic constant name

Value (hexadecimal)

Keyboard (or mouse) equivalent

VK_LBUTTON

01

Left mouse button

VK_RBUTTON

02

Right mouse button

VK_CANCEL

03

Control-break processing

VK_MBUTTON

04

Middle mouse button (three-button mouse)

VK_BACK

08

BACKSPACE key

VK_TAB

09

TAB key

VK_CLEAR

0C

CLEAR key

VK_RETURN

0D

ENTER key

VK_SHIFT

10

SHIFT key

VK_CONTROL

11

CTRL key

VK_MENU

12

ALT key

VK_PAUSE

13

PAUSE key

VK_CAPITAL

14

CAPS LOCK key

VK_ESCAPE

1B

ESC key

VK_SPACE

20

SPACEBAR

VK_PRIOR

21

PAGE UP key

VK_NEXT

22

PAGE DOWN key

VK_END

23

END key

VK_HOME

24

HOME key

VK_LEFT

25

LEFT ARROW key

VK_UP

26

UP ARROW key

VK_RIGHT

27

RIGHT ARROW key

Продолжние приложения

VK_DOWN

28

DOWN ARROW key

VK_SELECT

29

SELECT key

VK_PRINT

2A

PRINT key

VK_EXECUTE

2B

EXECUTE key

VK_SNAPSHOT

2C

PRINT SCREEN key

VK_INSERT

2D

INS key

VK_DELETE

2E

DEL key

VK_HELP

2F

HELP key

 

30

0 key

 

31

1 key

 

32

2 key

 

33

3 key

 

34

4 key

 

35

5 key

 

36

6 key

 

37

7 key

 

38

8 key

 

39

9 key

 

41

A key

 

42

B key

 

43

C key

 

44

D key

 

45

E key

 

46

F key

 

47

G key

 

48

H key

Продолжние приложения

 

49

I key

 

4A

J key

 

4B

K key

 

4C

L key

 

4D

M key

 

4E

N key

 

4F

O key

 

50

P key

 

51

Q key

 

52

R key

 

53

S key

 

54

T key

 

55

U key

 

56

V key

 

57

W key

 

58

X key

 

59

Y key

 

5A

Z key

VK_NUMPAD0

60

Numeric keypad 0 key

VK_NUMPAD1

61

Numeric keypad 1 key

VK_NUMPAD2

62

Numeric keypad 2 key

VK_NUMPAD3

63

Numeric keypad 3 key

VK_NUMPAD4

64

Numeric keypad 4 key

VK_NUMPAD5

65

Numeric keypad 5 key

VK_NUMPAD6

66

Numeric keypad 6 key

VK_NUMPAD7

67

Numeric keypad 7 key

Источник: https://studfile.net/preview/16567187/