Синтаксичний аналізатор

Модуль приймає як вихідні дані результат лексичного аналізу, список лексем. Мета подальшої обробки - побудова синтаксичного дерева.

Аналіз робиться за допомогою двох машин, які будують дерево:

  1. Основна машина для обробки керуючих конструкцій і операторів мови
  2. Машина, що відповідає за обробку виразів

Перемикання між машинами відбувається автоматично, спираючись на машину станів.

_images/machine.png

Стани 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 '

Комунікація між машинами

Використовується глобальний стек, який доступний обом машинам, так що розібрані вирази передаються з другої машини в першу через нього, так як остаточні вузли в дерево додає саме перша машина. Вирази ж є лише частинами більш великих конструкцій, таких як присвоювання, розгалуження і умови виходу в циклах.