SyntaxAnalyser

0

Описание

Реализация визуализации синтаксического анализатора

Языки

  • C++89,9%
  • Lex5%
  • CMake3,9%
  • Shell1,2%

README
# Синтаксический анализатор
 
# Сборка
## Предварительные требования
 
Перед началом убедитесь, что у вас установлены следующие инструменты:
 
- **CMake** (версия 3.14 или выше)
- **Компилятор C++** (например, GCC, Clang или MSVC)
- **Build инструменты** (например, Make, Ninja, или MSBuild)
 
## Сборка проекта
 
1. **Клонируйте репозиторий** (если еще не сделано):
 
```bash
git clone https://gitverse.ru/AndRUSSIA/SyntaxAnalyser.git
cd SyntaxAnalyser
 
```
2. **Упрощенный вариант сборки (создается 2 версии DEBUG и RELEASE)**
 
```bash
chmod "+" build.sh
./build.sh
```
3. **Запуск**
 
Чтобы запустить main:
```cpp
./build/Release/src/syntax_analyzer
```
Чтобы запустить тесты:
```cpp
./build/Release/tests/analyser_tests
```
## Грамматика языка:
Все замены которые использует функция reduce:
 
"F -> id | number | (E)"
"T -> T * F | T / F | F"
"E -> E + T | E - T | T"
"E' -> E"
 
 
## О программе:
Используя грамматику LR(0), программа реализует алгоритм shift-reduce:
передав в программу строку "(a + a) * ( a + b) + (AC * y)"
Она выводит табличку:
+-----------------+--------------------------------------------+--------------------+
| STACK | INPUT | ACTION |
+-----------------+--------------------------------------------+--------------------+
| $ | ( id + id ) * ( id + id ) + ( id * id ) $ | Shift: ( |
| $ ( | id + id ) * ( id + id ) + ( id * id ) $ | Shift: id |
| $ ( id | + id ) * ( id + id ) + ( id * id ) $ | Reduce: F -> id |
| $ ( F | + id ) * ( id + id ) + ( id * id ) $ | Reduce: T -> F |
| $ ( T | + id ) * ( id + id ) + ( id * id ) $ | Reduce: E -> T |
| $ ( E | + id ) * ( id + id ) + ( id * id ) $ | Shift: + |
| $ ( E + | id ) * ( id + id ) + ( id * id ) $ | Shift: id |
| $ ( E + id | ) * ( id + id ) + ( id * id ) $ | Reduce: F -> id |
| $ ( E + F | ) * ( id + id ) + ( id * id ) $ | Reduce: T -> F |
| $ ( E + T | ) * ( id + id ) + ( id * id ) $ | Reduce: E -> E + T |
| $ ( E | ) * ( id + id ) + ( id * id ) $ | Shift: ) |
| $ ( E ) | * ( id + id ) + ( id * id ) $ | Reduce: F -> ( E ) |
| $ F | * ( id + id ) + ( id * id ) $ | Reduce: T -> F |
| $ T | * ( id + id ) + ( id * id ) $ | Shift: * |
| $ T * | ( id + id ) + ( id * id ) $ | Shift: ( |
| $ T * ( | id + id ) + ( id * id ) $ | Shift: id |
| $ T * ( id | + id ) + ( id * id ) $ | Reduce: F -> id |
| $ T * ( F | + id ) + ( id * id ) $ | Reduce: T -> F |
| $ T * ( T | + id ) + ( id * id ) $ | Reduce: E -> T |
| $ T * ( E | + id ) + ( id * id ) $ | Shift: + |
| $ T * ( E + | id ) + ( id * id ) $ | Shift: id |
| $ T * ( E + id | ) + ( id * id ) $ | Reduce: F -> id |
| $ T * ( E + F | ) + ( id * id ) $ | Reduce: T -> F |
| $ T * ( E + T | ) + ( id * id ) $ | Reduce: E -> E + T |
| $ T * ( E | ) + ( id * id ) $ | Shift: ) |
| $ T * ( E ) | + ( id * id ) $ | Reduce: F -> ( E ) |
| $ T * F | + ( id * id ) $ | Reduce: T -> T * F |
| $ T | + ( id * id ) $ | Reduce: E -> T |
| $ E | + ( id * id ) $ | Shift: + |
| $ E + | ( id * id ) $ | Shift: ( |
| $ E + ( | id * id ) $ | Shift: id |
| $ E + ( id | * id ) $ | Reduce: F -> id |
| $ E + ( F | * id ) $ | Reduce: T -> F |
| $ E + ( T | * id ) $ | Shift: * |
| $ E + ( T * | id ) $ | Shift: id |
| $ E + ( T * id | ) $ | Reduce: F -> id |
| $ E + ( T * F | ) $ | Reduce: T -> T * F |
| $ E + ( T | ) $ | Reduce: E -> T |
| $ E + ( E | ) $ | Shift: ) |
| $ E + ( E ) | $ | Reduce: F -> ( E ) |
| $ E + F | $ | Reduce: T -> F |
| $ E + T | $ | Reduce: E -> E + T |
| $ E | $ | Accept |
+-----------------+--------------------------------------------+--------------------+
 
А на ошибочный пример " (a * a + )";
Error: Syntax error encountered!
+-------------+------------------+--------------------+
| STACK | INPUT | ACTION |
+-------------+------------------+--------------------+
| $ | ( id * id + ) $ | Shift: ( |
| $ ( | id * id + ) $ | Shift: id |
| $ ( id | * id + ) $ | Reduce: F -> id |
| $ ( F | * id + ) $ | Reduce: T -> F |
| $ ( T | * id + ) $ | Shift: * |
| $ ( T * | id + ) $ | Shift: id |
| $ ( T * id | + ) $ | Reduce: F -> id |
| $ ( T * F | + ) $ | Reduce: T -> T * F |
| $ ( T | + ) $ | Reduce: E -> T |
| $ ( E | + ) $ | Shift: + |
| $ ( E + | ) $ | Error |
+-------------+------------------+--------------------+
Указывает, что есть ошибка при синтаксическом анализе
 
### Контакты
 
Если у вас есть вопросы или предложения по этому проекту, пожалуйста, свяжитесь со мной:
 
- Email: glisanov.as@phystech.edu
- Telegram: @andruss1a