- •Теория языков программирования и методы трансляции
- •1. Языки и кризис программирования.
- •2. Математические методы описания языков программирования.
- •3. Основные понятия и определения.
- •1. S→ab→aAb→aaAb→aaaB→aaabB→aaabbB→aaabbbB→aaabbbb.
- •2. S→ab→AbB→AbbB→AbbbB→Abbbb→aAbbbb→aaAbbbb→aaabbbb
- •Load a mult b
- •4. Этапы построения транслятора.
- •5. Основные методы поиска ошибок в исходных текстах программ.
- •Устройство управления
- •6. Современное состояние и перспективы развития программирования трансляторов.
- •7. Лексический анализ. Интуитивный подход.
- •8. Классы лексем и их особенности.
- •9. Формирование таблиц лексем и построение дескрипторного текста исходной программы.
- •На основании составленных таблиц можно записать входной текст через введённые дескрипторы (дескрипторный текст):
- •10. Синтаксический анализ. Метод рекурсивного спуска.
- •11. Пример грамматики упрощенного языка Паскаль.
- •12. Пример программы на упрощенном Паскале.
- •Var sum, sumsq, I, value, mean, variance : integer;
- •13. Алгоритм синтаксического анализа по методу рекурсивного спуска.
- •Void read()
- •Void idlist()
- •Void assign()
- •15. Лексический анализ, регулярные грамматики и конечные автоматы.
- •17. Грамматики типа ll(k). Алгоритмы построения магазинных анализаторов.
- •18. Детерминированный синтаксический анализ сверху вниз.
- •19. Правила определения детерминированного мп-разпознавателя по ll(1) грамматике.
- •20. Заключение.
- •Литература
9. Формирование таблиц лексем и построение дескрипторного текста исходной программы.
Рассмотрим конкретный пример. Пусть нам дана программа на некотором алгоритмическом язык
PROGRAM PRIMER;
VAR X,Y,Z : REAL;
BEGIN
X:=5;
Z:=X+Y;
END;
Применим следующие коды для типов лексем:
К1- ключевое слово;
К2- разделитель;
К3- идентификатор;
К4- константа.
Лексический анализ можно производить, если нам задан алфавит,
список ключевых слов языка и служебных символов. Пусть всё это
имеется. Тогда внутренние таблицы сканера примут следующий вид.
Таблица 1. Ключевые слова.
№ |
Ключевое слово |
1 |
PROGRAM |
2 |
BEGIN |
3 |
END |
4 |
FOR |
5 |
REAL |
6 |
VAR |
Таблица 2. Разделители.
№ |
Разделители |
1 |
; |
2 |
, |
3 |
+ |
4 |
- |
5 |
/ |
6 |
* |
7 |
: |
8 |
= |
9 |
. |
Результат работы сканера таблица идентификаторов и таблица констант
Таблица 3. Идентификаторы.
№ |
Идентификаторы |
1 |
PRIMER |
2 |
X |
3 |
Y |
4 |
Z |
Таблица 4. Константы.
№ |
Знач. констант |
1 |
5 |
2 |
6 |
На основании составленных таблиц можно записать входной текст через введённые дескрипторы (дескрипторный текст):
( К1, 1) (К3, 1) (K2, 1)
( K1, 6) (K3, 2) (K2, 2) (k3, 3) ( K2, 2) (K3, 4) ( K2, 7) (K1, 5) (K2, 1)
( K1, 2)
( K3, 2) (K2, 7) (K2, 8) (K4, 1) (K2, 1)
( K3, 3) (K2, 7) (K2, 8) (K4, 2) (K2, 1)
( K3, 4) (K2, 7) (K2, 8) (K3, 2) (K2, 3) (K3, 3) (K2, 1)
( K1, 3) (K2, 9).
10. Синтаксический анализ. Метод рекурсивного спуска.
Грамматика алгоритмического языка может задаваться в виде диаграмм Вирта, Бекуса-Наура формах и в виде формальной грамматики. Формальные грамматики предпочтительнее, поскольку широко используются как в теории, так и в практике разработки и построения трансляторов с языков программирования.
Формальная грамматика − это совокупность четырёх объектов: множества нетерминальных символов {N}, множества терминальных символов {T}, множества продукций {P} и аксиомы грамматики S, из которой с помощью продукций могут быть выведены все сентенции и сентенциальные выражения данного языка.
11. Пример грамматики упрощенного языка Паскаль.
Алфавит языка символы латиницы и служебные символы. Пусть в формальной грамматике упрощенного Паскаля все нетерминальные символы заключаются в угловых скобках < >, терминальные символы – строчные латиница и служебные символы к которым добавим знаки арифметических операций +,-,*, div и круглые скобки ( ), которые используются и как разделители. Первая продукция является аксиомой языка.
1. <PROG>→program<PROGRAM-NAME>var<DEC-LIST>begin<STMT-
LIST>END.
Это, по сути, исходная запись и она же продукция. Прочие продукции будут иметь вид:
2. <PROG-NAME> →id
3. <DEC-LIST>→ <DEC>|<DEC-LIST>;<DEC>
4. <DEC> →<ID-LIST>:<TYPE>
5. <TYPE> → integer
6. <ID-LIST> →id|<ID-LIST>, id
7. <STMT-LIST>→<STMT>|<STMT-LIST>;<STMT>
8. <STMT>→<ASSIGN>|<READ>|<WRITE>|<FOR>
9. <ASSIGN> →id:=<EXP>
10. <EXP> →<TERM>|<EXP>+<TERM>|<EXP> - <TERM>
11. <TERM>→ <FACTOR>|<TERM>*<FACTOR>|<TERM> div
<FACTOR>
12. <FACTOR> →id|int|(EXP)
13. <READ> →read(<ID-LIST>)
14. <WRITE> →write(<ID-LIST>)
15. <FOR>→ for<INDEX-EXP> do <BODY>
16. INDEX-EXP>→ id:=<EXP> to <EXP>
17. <BODY>→ <STMT>|begin<STMT-LIST> end
Следует иметь ввиду, что под id подразумевается имя любого идентификаторы, под int – целая константа.