А после формирования постфиксной записи совокупности операторов добавляется метка завершения оператора условия:
VectPFRBlock.add("Label2_"+StIf.pop()+":");
Если оператор условия имеет сокращённую форму, то из постфиксной записи удаляются два последних значения и вносится лишь метка завершения оператора условия:
VectPFRBlock.remove(VectPFRBlock.size()-1); VectPFRBlock.remove(VectPFRBlock.size()-1); VectPFRBlock.add("Label1_"+StIf.pop()+":");
Добавление сформированной постфиксной записи для текущего блока к постфиксной записи всей программы осуществляется следующим образом:
VectPFRTotal.add(VectPFRBlock.clone()); VectPFRBlock.removeAllElements();
Для демонстрации результатов работы на экран выводится сформированная постфиксная запись, части которой привязаны к соответствующим именам блоков. Ниже приведён программный код, обеспечивающий такой вывод:
<p><table border=1 align=center class=dh cellpadding=0 cellspacing=0 style="border-collapse:collapse">
<tr class=bh><td colspan="2" align="center" style="background-color:lightgreen">Постфиксная запись</td></tr>
<tr class=bh><td align=center> Имя блока </td><td align=center> Постфиксная запись </td></tr>
<%for (int i=0; i<VectPFRTotal.size(); i++)
{%><tr><td align=center><%=VectNames.get(i)%></td><td align=center><%=VectPFRTotal.elementAt(i)%></td></tr><%}%>
</table></p>
Постфиксная запись |
|
Имя блока |
Постфиксная запись |
11 |
[a1, 5, let, b1, a, 10.3, +, 2, *, let, c1, b, a, /, let] |
12 |
[a2, 34.24, let, b2, a1, a2, +, let, c2, b2, 4, /, let] |
13 |
[x, 0, let, y, 0, let] |
21 |
[x, aa1, aa2, *, 4, b1, b2, *, *, -, let, x, 0, >, b2, a1, !=, &&, Label1_2, JmpF, x, x, c1, -, let, Label2_2, Jmp, Label1_2:, x, 0, <, Label1_3, JmpF, x, x, x2, -, let, Label2_3, Jmp, Label1_3:, x, x, 2, *, let, Label2_3:, Label2_2:] |
22 |
[y, cc1, cc2, +, let, y, 0, >=, cc1, cc2, bb1, +, <, ||, Label1_4, JmpF, y, y, x, +, let, Label2_4, Jmp, Label1_4:, y, 0, <, Label1_5, JmpF, y, x, 2, *, let, Label2_5, Jmp, Label1_5:, x, x, a1, +, let, y, x, 2, /, let, Label2_5:, Label2_4:] |
Рассмотрим несколько вариантов ошибочных программ:
1. Комментарий помещён в тело блока vars:
{11:vars;
let a1 5;
let b1 (a+10.3)*2;
Первый блок переменных
let c1 b/a;
}
Проверяемый текст неверен.
Таблица идентификаторов |
|
Текст слова |
Номер слова в группе |
a |
2 |
a1 |
0 |
b1 |
1 |
Таблица целочисленных констант |
|
Текст слова |
Номер слова в группе |
5 |
0 |
2 |
1 |
Таблица констант |
|
Текст слова |
Номер слова в группе |
10.3 |
0 |
Таблица служебных слов языка |
|
Текст слова |
Номер слова в группе |
, |
13 |
=> |
12 |
join |
6 |
) |
9 |
? |
10 |
( |
8 |
let |
7 |
do |
5 |
or |
11 |
; |
4 |
: |
1 |
} |
2 |
{ |
0 |
vars |
3 |
Постфиксная запись |
|
Имя блока |
Постфиксная запись |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.