Синтаксичний аналізатор¶
Модуль приймає як вихідні дані результат лексичного аналізу, список лексем. Мета подальшої обробки - побудова синтаксичного дерева.
Аналіз робиться за допомогою двох машин, які будують дерево:
- Основна машина для обробки керуючих конструкцій і операторів мови
- Машина, що відповідає за обробку виразів
Перемикання між машинами відбувається автоматично, спираючись на машину станів.
Стани EXPR* є станами, в яких включається друга машина. При зустрічі лексеми, що не належить до виразу машина повертає керування основній.
Використання машин не тільки дозволяє спростити синтаксичний аналіз, знаючи які лексеми очікуються і який тип виразу розбирається в даний момент набагато раніше, ніж це було б використовуючи шаблони (маски), це також допомагає виявляти синтаксичні помилки дуже рано.
-
pyCompiler.utils.syntax.
synt
(lex)¶ Функція, що відповідає за лексичний аналіз
Parameters: lex – список лексем Return type: дерево розбору
Основна машина¶
Машина працює строго по станам, діаграма яких зображена вище. Використовується так само стекова система, що дозволяє відкласти обробку деяких лексем до остаточного визначення типу виразу і збору всіх даних для додавання вузла в дерево.
Також проводить аналіз синтаксичних помилок, перериваючи роботу і вказуючи на рядок з помилкою при виявленні.
-
pyCompiler.utils.syntax.
m_default
()¶ Генератор дерева розбору, основна машина
Машина виразів¶
Стекова машина, що працює за принципом перетворення інфіксного вираження в постфіксной (польська нотація), при цьому на виході не постфіксной запис у рядок, а дерево виразу з математичними операціями та операндами у вузлах.
-
pyCompiler.utils.syntax.
m_expressions
()¶ Машина виразів
Приклад¶
Вираз
(15-2) -5
перетвориться в таке дерево
- '-',
------ '-',
---------- '15 ',
---------- '2 '
------ '5 '
Вираз
j +2> = 10
У таке дерево
- '> =',
------ '+',
---------- 'J',
---------- '2 '
------ '10 '
Комунікація між машинами¶
Використовується глобальний стек, який доступний обом машинам, так що розібрані вирази передаються з другої машини в першу через нього, так як остаточні вузли в дерево додає саме перша машина. Вирази ж є лише частинами більш великих конструкцій, таких як присвоювання, розгалуження і умови виходу в циклах.