Продолжение таблицы
do |
Ключевое слово |
X4 |
fg |
Идентификатор |
fg : 3 |
:= |
Знак присваивания |
S1 |
fg |
Идентификатор |
fg : 3 |
* |
Знак арифметической операции |
A1 |
0.5 |
Вещественная константа |
0.5 |
; |
Разделитель операторов |
S2 |
Однако в общем случае задача сканера несколько шире, чем просто проверка цепочки символов лексемы на соответствие ее входному языку. Сканер должен выполнить те или иные действия по запоминанию распознанной лексемы (занесение ее в таблицу лексем). Набор действий определяется реализацией компилятора. Обычно эти действия выполняются сразу же по обнаружению конца распознаваемой лексемы, поэтому их несложно вставить в соответствующие места рассмотренной выше программы-сканера.
Вторая проблема - это выделение границ лексем. Ведь во входном тексте лексемы не ограничены специальными символами. Если говорить в терминах программы-сканера, то определение границ лексем - это выделение тех строк в общем потоке входных символов, для которых надо выполнять распознавание. В общем случае эта задача может быть сложной, но для простейших входных языков границы лексем распознаются по заданным терминальным символам. Эти символы - пробелы, знаки операций, символы комментариев, а также разделители (запятые, точки с запятой и др.). Набор таких терминальных символов может варьироваться в зависимости от входного языка. Важно отметить, что знаки операций сами также являются лексемами, и необходимо не пропустить их при распознавании текста.
Таким образом, алгоритм работы простейшего сканера можно описать так:
просматривается входной поток символов программы на исходном языке до обнаружения очередного символа, ограничивающего лексему;
для выбранной части входного потока выполняется функция распознавания лексемы;
при успешном распознавании информация о выделенной лексеме заносится в таблицу лексем, и алгоритм возвращается к первому этапу;
при неуспешном распознавании выдается сообщение об ошибке, а дальнейшие действия зависят от реализации сканера - либо его выполнение прекращается, либо делается попытка распознать следующую лексему (идет возврат к первому этапу алгоритма).
Работа программы-сканера продолжается до тех пор, пока не будут просмотрены все символы программы на исходном языке из входного потока.
1. Входной язык содержит арифметические выражения, разделенные символом ;(точка с запятой). Арифметические выражения состоят из идентификаторов, десятичных чисел с плавающей точкой, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок.
2. Входной язык содержит логические выражения, разделенные символом ;(точка с запятой). Логические выражения состоят из идентификаторов, констант true и false, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок.
3. Входной язык содержит операторы условия типа if … then … else и if … then, разделенные символом ;(точка с запятой). Операторы условия содержат идентификаторы, знаки сравнения <, >, =, десятичные числа с плавающей точкой, знак присваивания (:=).
4. Входной язык содержит операторы цикла типа for … do, разделенные символом ;(точка с запятой). Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, десятичные числа с плавающей точкой, знак присваивания (:=).
5. Входной язык содержит арифметические выражения, разделенные символом ;(точка с запятой). Арифметические выражения состоят из идентификаторов, римских чисел, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок.
6. Входной язык содержит логические выражения, разделенные символом ;(точка с запятой). Логические выражения состоят из идентификаторов, констант 0 и 1, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок.
7. Входной язык содержит операторы условия типа if … then … else и if … then, разделенные символом ;(точка с запятой). Операторы условия содержат идентификаторы, знаки сравнения <, >, =, римские числа, знак присваивания (:=).
8. Входной язык содержит операторы цикла типа for … do, разделенные символом ;(точка с запятой). Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, римские числа, знак присваивания (:=).
9. Входной язык содержит арифметические выражения, разделенные символом ;(точка с запятой). Арифметические выражения состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций +, -, *, / и круглых скобок.
10. Входной язык содержит логические выражения, разделенные символом ;(точка с запятой). Логические выражения состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок.
11. Входной язык содержит операторы условия типа if … then … else и if … then, разделенные символом ;(точка с запятой). Операторы условия содержат идентификаторы, знаки сравнения <, >, =, шестнадцатеричные числа, знак присваивания (:=).
12. Входной язык содержит операторы цикла типа for … do, разделенные символом ;(точка с запятой). Операторы цикла содержат идентификаторы, знаки сравнения <, >, =, шестнадцатеричные числа, знак присваивания (:=).
Примечание:
- римскими числами считать последовательности больших латинских букв X, V и I;
- шестнадцатеричными числами считать последовательность цифр и символов ‘a’, ‘b’, ‘c’,’d’, ’e’ и ‘f’, начинающуюся с цифры (например: 89, 45ac9, 0abc4);
Ход выполнения работы:
1. Написать программу, которая выполняет лексический анализ входного текста в соответствии с заданием и порождает таблицу лексем с указанием их типов и значений.
2. Текст на входном языке задается в виде символьного (текстового) файла.
3. Программа должна выдавать сообщения о наличии во входном тексте ошибок, которые могут быть обнаружены на этапе лексического анализа.
4. Длину идентификаторов и строковых констант считать ограниченной 32 символами.
Сдать преподавателю программу.
Оформить отчет в электронном виде и сдать.
Что такое трансляция, компиляция, транслятор, компилятор?
Из каких процессов состоит компиляция? Расскажите об общей структуре компилятора.
Какую роль выполняет лексический анализ в процессе компиляции?
Как связаны лексический и синтаксический анализ?
Дайте определение цепочки, языка. Что такое синтаксис и семантика языка?
Какие существуют методы задания языков? Какие дополнительные вопросы необходимо решить при задании языка программирования?
Что такое грамматика? Дайте определения грамматики.
Как выглядит описание грамматики в форме Бэкуса-Наура.
Какие классы грамматик существуют? Что такое регулярные грамматики?
Дайте определения контекстно-свободной грамматики, выводимости цепочки, непосредственной выводимости, длины вывода.
Что такое конечный автомат? Дайте определение детерминированного и недетерминированного конечных автоматов.
Какие проблемы необходимо решить при построении сканера на основе конечного автомата?
Представить схему грамматики, описывающей целые числа без знака.
Представить схему грамматики, описывающей идентификаторы.
Представить схему грамматики для арифметических выражений, использующих только знаки сложения и умножения.
Представить схему грамматики для арифметических выражений, использующих скобки без вложенности.
Представить схему грамматики для арифметических выражений, допускающих применение вложенных скобок.
Представить схему грамматики для описания целых и вещественных переменных. Описание переменных определенного типа должно начинаться указателем типа 'real' или 'int'. В полном тексте описания переменных определенного типа могут повторяться.
Составить таблицу идентификаторов и таблицу лексем для следующего фрагмента исходного кода:
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 |