- •Языки программирования и методы трансляции
- •Литература
- •Методы построения трансляторов. Лексический анализ.
- •Описание модельного языка
- •Лексический анализ
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •Алгоритм разбора
- •О недетерминированном разборе
- •О недетерминированном разборе
Алгоритм разбора
По диаграмме состояний легко написать анализатор для регулярной грамматики. Например, для грамматики G = ({S, A, B, C}, {a, b, }, S, P), где
P: |
S → C |
|
С→ Ab | Ba |
|
A → a | Ca |
|
B→ b | Cb |
анализатор будет таким:
Алгоритм разбора
#include<stdio.h> |
|
|
|
||
int scan_G() |
|
|
|
||
{ enum state {H, A, B, C, S, ER}; |
|||||
/ множество состояний |
/ |
||||
stateCS; |
|
|
|
|
|
/ CS – текущее состояние / |
|||||
FILE |
fp; |
/ |
указатель на файл, в котором находится |
||
анализируемая строка |
/ |
||||
int c; |
|
|
|
|
|
CS=H; |
|
|
|
|
|
fp |
= fopen ("data","r"); |
||||
c = |
fgetc (fp); |
|
|
||
do {switch (CS) |
|
|
Алгоритм разбора
{
{
case H: if (c == 'a')
}
c = fgetc(fp); CS = A;
else if (c == 'b')
{
c = fgetc(fp); CS = B;
} else CS = ER; break;
{ case A: if (c == 'b')
}
c = fgetc(fp); CS = C;
else CS = ER; break;
Алгоритм разбора
case B: if (c == 'a') |
|
{ |
c = fgetc(fp); CS = C; |
}else CS = ER; break;
case C: if (c =='a')
{
c = fgetc(fp); CS = A;
}
else if (c == 'b')
{
c = fgetc(fp); CS = B;
}
else if (c == ' ') CS = S; else CS = ER;
}break;}
while (CS != S && CS != ER);
if (CS == ER) return -1; else return 0; }