Skip to content

RustamSubkhankulov/shift-reduce-parser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

23 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Восходящий синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Ρ‚ΠΈΠΏΠ° "ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ/свёртка"

Note: see READMEen.md for english version of this document.

Бинтаксчиский Π°Π½Π°Π»ΠΈΠ· "пСрСнос/свёртка") прСдставляСт собой Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ восходящСго Π°Π½Π°Π»ΠΈΠ·Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ для хранСния символов Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стСк, Π° для хранСния ΠΎΡΡ‚Π°ΡŽΡ‰Π΅ΠΉΡΡ Π½Π΅ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ части Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки - Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΡ„Ρ„Π΅Ρ€. АнализируСмый aрифмСтичСский язык состоит ΠΈΠ· слоТСния, вычитания, умноТСния, дСлСния ΠΈ скобок. ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π½Π°Π΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ ΠΆΠ΅ Π½Π°Π΄ числами. Π”Π°Π»Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ описана Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°, Π·Π°Π΄Π°ΡŽΡ‰Π°Ρ Π΄Π°Π½Π½Ρ‹ΠΉ язык.

Для получСния Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ lexer. Π­Ρ‚ΠΎ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ ΠΌΠ½ΠΎΠΉ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Он Ρ‚Π°ΠΊΠΆΠ΅ присутствуСт Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ (дирСктория rules, Ρ„Π°ΠΉΠ»Ρ‹ inc/lexer.hpp, src/lexer.cpp)

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° арифмСтичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

  • E -> E + T | E - T | T
  • T -> T * F | T / F | F
  • F -> (E) | id | num

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ классу LR-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ подходят для восходящСго синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°. Π­Ρ‚Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ уровнями ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ². Однако ΠΎΠ½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована для нисходящСго синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π² силу Π΅Π΅ лСворСкурсивности.

Восходящий синтаксичСский Π°Π½Π°Π»ΠΈΠ·

Восходящий синтаксичСский Π°Π½Π°Π»ΠΈΠ· соотвСтствуСт ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡŽ Π΄Π΅Ρ€Π΅Π²Π° Ρ€Π°Π·Π±ΠΎΡ€Π° для Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки, начиная с Π»ΠΈΡΡ‚ΡŒΠ΅Π² (снизу) ΠΈ идя ΠΏΠΎ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡŽ ΠΊ ΠΊΠΎΡ€Π½ΡŽ (Π²Π²Π΅Ρ€Ρ…). Π£Π΄ΠΎΠ±Π½ΠΎ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠ°ΠΊ процСсс построСния Π΄Π΅Ρ€Π΅Π²Π° Ρ€Π°Π·Π±ΠΎΡ€Π°, хотя Π½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ стадия компиляции ΠΌΠΎΠΆΠ΅Ρ‚ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΈ Π±Π΅Π· явного построСния Π΄Π΅Ρ€Π΅Π²Π°. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ "снимков" Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Ρ€Π°Π·Π±ΠΎΡ€Π° Π½Π° рисункС ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ восходящий синтаксичСский Π°Π½Π°Π»ΠΈΠ· для ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² id * id Π² соотвСтствии с Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

bottom-up

Π‘Π²Ρ‘Ρ€Ρ‚ΠΊΠΈ

МоТно Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ восходящий синтаксичСский Π°Π½Π°Π»ΠΈΠ· ΠΊΠ°ΠΊ процСсс "свСртки" строки ΠΈ ΠΊ стартовому символу Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ. На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС свСртки (Π³Π΅duction) опрСдСлСнная подстрока, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ‚Π΅Π»Ρƒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ, замСняСтся Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ ΠΈΠ· Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° этой ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ. ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Π΅ Π² процСссС восходящСго синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, β€” ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ свСртку ΠΈ ΠΊΠ°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ.

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ свёрток для Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

id * id, F * id, I * id, T * F, T, E

По ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ свСртка прСдставляСт собой шаг, ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ (вспомнитС, Ρ‡Ρ‚ΠΎ Π² ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π² ΡΠ΅Π½Ρ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ замСщаСтся Ρ‚Π΅Π»ΠΎΠΌ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΉ). ЦСль восходящСго синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, состоит Π² построСнии пороТдСния Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. Π’ΠΎΡ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Ρƒ, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌΡƒ Π½Π° рисункС Π²Ρ‹ΡˆΠ΅: $$Eβ†’T β†’ T*Fβ†’T * id β†’ F * id β†’ id * id$$ Π”Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ являСтся ΠΏΡ€Π°Π²Ρ‹ΠΌ.

БинтаксичСский Π°Π½Π°Π»ΠΈΠ· "пСрСнос/свСртка"

БинтаксичСский Π°Π½Π°Π»ΠΈΠ· "пСрСнос/свСртка" (ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹ΠΉ Π΄Π°Π»Π΅Π΅ сокращСнно ПБ-Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ) прСдставляСт собой Ρ€Π°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡ‚ΡŒ восходящСго Π°Π½Π°Π»ΠΈΠ·Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ для хранСния символов Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ стСк, Π° для хранСния ΠΎΡΡ‚Π°ΡŽΡ‰Π΅ΠΉΡΡ Π½Π΅ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ части Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки - Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€.

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ стСк пуст, Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ содСрТит всю ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². Π’ процСссС сканирования Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ выполняСт Π½ΡƒΠ»ΡŒ ΠΈΠ»ΠΈ нСсколько пСрСносов символов Π² стСк, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ‚ΠΎΠ² Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ свСртку строки Π’ символов Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка. Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ выполняСт свСртку Π’ ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ. БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ повторяСт этот Ρ†ΠΈΠΊΠ» Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π° ошибка ΠΈΠ»ΠΈ ΠΏΠΎΠΊΠ° стСк Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стартовый символ, Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈ этом пуст. Достигнув ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ останавливаСтся ΠΈ сообщаСт ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ПБ-Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΏΡ€ΠΈ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строкС id1 * id2:

configuration

LR(0)-Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρ‹

Π”Π΅Ρ‚Π΅Ρ€ΠΌΠ΅Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для принятия Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π² процСссС синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° для LR(0)-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ называСтся LR(0)-Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠΌ. Π’ частности, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ состояниС LR(0)-Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π° прСдставляСт мноТСство ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² Π² каноничСском Π½Π°Π±ΠΎΡ€Π΅ LR(0). Бостояниями этого Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ мноТСства ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² ΠΈΠ· каноничСского Π½Π°Π±ΠΎΡ€Π° LR(0), Π° ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ GOTO.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎ структурС LR(0)-Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π² [1].

automaton

Для нашСй арифмСтичСской Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Π Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° арифмСтичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

Для построСния каноничСского LR (0)-Π½Π°Π±ΠΎΡ€Π° ΠΌΡ‹ опрСдСляСм Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΡƒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ ΠΈ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, CLOSURE ΠΈ GOTO. Если G - Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° со стартовым символом S, Ρ‚ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° G' прСдставляСт собой G с Π½ΠΎΠ²Ρ‹ΠΌ стартовым символом S' ΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠ΅ΠΉ S' -> S. НазначСниС этой Π½ΠΎΠ²ΠΎΠΉ стартовой ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ - ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ, ΠΊΠΎΠ³Π΄Π° слСдуСт ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ· ΠΈ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΎ принятии Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки; Ρ‚.Π΅. принятиС осущСствляСтся Ρ‚ΠΎΠ³Π΄Π° ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠΎΠ³Π΄Π° синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ выполняСт свСртку с использованиСм ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ S' -> S.

Π‘Ρ‚Π°Ρ€Ρ‚ΠΎΠ²ΠΎΠ΅ состояниС LR (0)-Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π° - CLOSURE({[S' β†’ β€’S|}), Π³Π΄Π΅ S - стартовый символ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ. ВсС состояния ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠΌΠΈ. Под состояниСм $j$ Π΄Π°Π»Π΅Π΅ подразумСваСтся состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ мноТСству ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² $I_{j}$.

Каким ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ LR(0)-Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π² принятии Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ "пСрСнос/свСртка"? Π­Ρ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ принято ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ строка Ρƒ ΠΈΠ· символов Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ LR(0)-Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ ΠΈΠ· состояния 0 Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ состояниС $j$. Π’ΠΎΠ³Π΄Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ пСрСнос ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа Π°, Ссли состояниС $j$ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ символа Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС выбираСтся свСртка; ΠΏΡƒΠ½ΠΊΡ‚ Π² состоянии $j$ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π½Π°ΠΌ, ΠΊΠ°ΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΡŽ слСдуСт для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ.

  • E' -> E
  • E -> E - T | E + T | T
  • T -> T * F | T / F | F
  • F -> (E) | id

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ этапы Π°Π½Π°Π»ΠΈΠ·Π° с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² состояний Π² стСкС.

anls

Алгоритм SLR-Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

SLR-Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ("Simple LR") состоит ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°, Π²Ρ‹Ρ…ΠΎΠ΄Π°, стСка, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°, состоящСй ΠΈΠ· Π΄Π²ΡƒΡ… частСй (ACTION ΠΈ GOTO). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Π° для всСх LR-Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²; ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΊ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ син-таксичСского Π°Π½Π°Π»ΠΈΠ·Π°. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ считываСт символы ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°. Π’Π°ΠΌ, Π³Π΄Π΅ ПБ-Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ пСрСнСсти символ, LR-Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ пСрСносит состояниС. КаТдоС состояниС ΠΏΠΎΠ΄Ρ‹Ρ‚ΠΎΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°-Ρ†ΠΈΡŽ, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽΡΡ Π² стСкС Π½ΠΈΠΆΠ΅ Π½Π΅Π³ΠΎ.

CLOSURE ΠΈ GOTO

Если I - мноТСство ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G, Ρ‚ΠΎ CLOSURE(I) прСдставляСт собой мноТСство ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ², построСнноС ΠΈΠ· I согласно Π΄Π²ΡƒΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ.

  1. Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π² CLOSURE (I) Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ всС ΠΏΡƒΠ½ΠΊΡ‚Ρ‹ ΠΈΠ· I.
  2. Если А β†’ Π° - Π’Π’ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² CLOSURE (I), Π° Π’ β†’ Ρƒ являСтся ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠ΅ΠΉ, Ρ‚ΠΎ Π² CLOSURE (I) добавляСтся ΠΏΡƒΠ½ΠΊΡ‚ Π’ β†’ 7, Ссли Π΅Π³ΠΎ Ρ‚Π°ΠΌ Π΅Ρ‰Π΅ Π½Π΅Ρ‚. Π­Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ примСняСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ останСтся ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Π² CLOSURE (I).

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ являСтся GOTO(I, Π₯), Π³Π΄Π΅ I - мноТСство ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ², Π° X - грамматичСский символ. GOTO(I, Π₯) опрСдСляСтся ΠΊΠ°ΠΊ Π·Π°ΠΌΡ‹ΠΊΠ°Π½ΠΈΠ΅ мноТСства всСх ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² (А β†’ Π°Π₯ β€’ Π’], Ρ‚Π°ΠΊΠΈΡ…, Ρ‡Ρ‚ΠΎ [А β†’ Π° β€’ Π₯Π’) находится Π² I.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ SLR-Π°Π½Π°Π»ΠΈΠ·Π°

Π’Π°Π±Π»ΠΈΡ†Π° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° состоит ΠΈΠ· Π΄Π²ΡƒΡ… частСй: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ дСйствий синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ACTION ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² GOTO.

  1. Ѐункция ACTION ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° состояниС Ρ– ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» Π° (ΠΈΠ»ΠΈ $, ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ†Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки). Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ACTION(i, Π°] ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΠ΄ΠΎΠ²:
  • ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ j, Π³Π΄Π΅ j β€” состояниС. ДСйствиС, ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ΅ синтакси-чСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, эффСктивно пСрСносит Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ символ Π° Π² стСк, Π½ΠΎ для прСдставлСния Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ состояниС j.
  • Π‘Π²Π΅Ρ€Ρ‚ΠΊΠ° А β†’ Π’. ДСйствиС синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° состоит Π² эффСктивной свСрткС B Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ А.
  • ΠŸΡ€ΠΈΠ½ΡΡ‚ΠΈΠ΅. БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½ΡƒΡŽ строку ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ·.
  • Ошибка. БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π²ΠΎ Π²Ρ…ΠΎΠ΄-Π½ΠΎΠΉ строкС ΠΈ ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ дСйствиС.
  1. Ѐункция GOTO, опрСдСлСнная Π½Π° мноТСствах ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ², распространяСтся Π½Π° состояния: Ссли GOTO[$I_{i}$, A] = $I_{j}$, Ρ‚ΠΎ GOTO отобраТаст Ρ‚Π°ΠΊΠΆΠ΅ состояниС Ρ– ΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» А Π½Π° состояниС j.

ПовСдСниС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

ΠžΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ SLR-Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»Π½ΠΎΠ΅ состояниС синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: Π΅Π³ΠΎ стСк ΠΈ ΠΎΡΡ‚Π°Π²ΡˆΡƒΡŽΡΡ Π½Π΅ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ SLR-Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° прСдставляСт собой ΠΏΠ°Ρ€Ρƒ (S0 S1 ... Sm, Ai Ai+1...An$)

Π—Π΄Π΅ΡΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ - содСрТимоС стСка (Π²Π΅Ρ€ΡˆΠΈΠ½Π° стСка справа), Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ - ΠΎΡΡ‚Π°Π²ΡˆΠ°ΡΡΡ Π½Π΅ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки.

ΠžΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ шаг синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ· ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ опрСдСляСтся считанным Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ символом Π° ΠΈ состояниСм Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Sm ΠΏΡƒΡ‚Π΅ΠΌ обращСния ΠΊ записи ACTION(Sm, Ai].

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° для Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (Π±Π΅Π· дСлСния ΠΈ вычитания, Π² нашСм случаС ΠΎΠ½Π° отличаСтся Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ).

table

(1) E -> E+T (3) T -> T * F (2) E -> T (4) T -> F (5) E -> (E) (6) F -> id

  1. si ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ пСрСнос ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² стСкС состояния Ρ–.
  2. r ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ свСртку Π² соотвСтствии с ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠ΅ΠΉ с Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ j.
  3. асс ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ принятиС.
  4. ΠŸΡƒΡΡ‚ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

ΠœΠ΅Ρ‚ΠΎΠ΄ построСниС SLR-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

Π’Π₯ΠžΠ”: Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Π°Ρ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° G'. Π’Ρ‹Ρ…ΠΎΠ΄: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ SLR-Π°Π½Π°Π»ΠΈΠ·Π° ACTION ΠΈ GOTO для Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G' . ΠœΠ΅Ρ‚ΠΎΠ΄: выполняСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия.

  1. Π‘Ρ‚Ρ€ΠΎΠΈΠΌ Π‘ = {I0, I1,... , In) - Π½Π°Π±ΠΎΡ€ мноТСств LR(0)-ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² для G'.
  2. Из Π†Ρ– строим состояниС Ρ–. ДСйствиС синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° для состояния Ρ– опрСдСляСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.
  • Если [A β†’ Ξ±β€’aß) ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ii ΠΈ GOTO (Ii, Π°) = Ij, Ρ‚ΠΎ устанавливаСм ACTION(i, a] Ρ€Π°Π²Π½Ρ‹ΠΌ "пСрСнос j". Π—Π΄Π΅ΡΡŒ Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ.
  • Если [А β†’ aβ€’] ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ii, Ρ‚ΠΎ устанавливаСм ACTION[i, Π°) Ρ€Π°Π²Π½Ρ‹ΠΌ "свСртка А β†’ Π°" для всСх Π° ΠΈΠ· FOLLOW(А); здСсь А Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ S'.
  • Если [S' β†’ Sβ€’] ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ii, Ρ‚ΠΎ устанавливаСм ACTION(i, $) Ρ€Π°Π²Π½Ρ‹ΠΌ "принятиС". ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ любого ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ дСйствиями, возникшСго Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ примСнСния ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΏΡ€Π°Π²ΠΈΠ», дСлаСтся Π²Ρ‹Π²ΠΎΠ΄ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ классу SLR(1). Π’ Ρ‚Π°ΠΊΠΎΠΌ случаС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ для Π΄Π°Π½Π½ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ.
  1. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ для состояния Ρ– строим для всСх Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠ² А с использова- Π½ΠΈΠ΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°: Ссли GOTO(Ii, A) = Ij, To GOTO(i, A) = j.
  2. ВсС записи, Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ 2 ΠΈ 3, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ "ошибка".
  3. ΠΠ°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° строим ΠΈΠ· мноТСства ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ², содСрТащСго (S' β†’ β€’S].

Алгоритм SLR-Π°Π½Π°Π»ΠΈΠ·Π°

algo1

algo2

Π‘Π±ΠΎΡ€ΠΊΠ°

Для сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° систСма сборки CMake вСрсии 3.21 ΠΈ Π²Ρ‹ΡˆΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ установлСнная ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² flex. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ:

  • cmake -B build -DVERBOSE=ON -DDUMP=ON
  • cmake --build build --target parser dump.txt

ΠžΠΏΡ†ΠΈΡ VERBOSE Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ парсСра. ΠžΠΏΡ†ΠΈΡ DUMP Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ dump AST Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ dot. ΠŸΡ€ΠΈ использовании Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° Π²Ρ…ΠΎΠ΄ имя Ρ„Π°ΠΉΠ»Π°, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ dump. ΠžΠΏΡ†ΠΈΡ DUMP_JSON Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ лСксСра Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ JSON.

Запуск

На stdin ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ подаСтся тСкст исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ языкС. Π’ качСствС ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Ρ€ΡƒΠ³ΠΌΠ΅Π½Ρ‚Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ имя Ρ„Π°ΠΉΠ»Π° для dump'Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ dot ΠΏΡ€ΠΈ использовании ΠΎΠΏΡ†ΠΈΠΈ сборки DUMP.

  • ./build/parser < examples/main.ypp dump.txt

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст описания Π΄Π΅Ρ€Π΅Π²Π° AST Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ dot ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

  • dot dump.txt -Tpng -o dump.png

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ AST для выраТСния $(v1 - 100) / v2$

AST

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° для выраТСния $(v1 - 100) / v2$

 -------------------------------------------------------------------------------------------------------
|ITER|STACK                           |INPUT                           |ACTION                          |
 -------------------------------------------------------------------------------------------------------
|0   |0                               |OP_BR v1 ADD 100 CL_BR DIV v2 $ |SHIFT 4                         |
 -------------------------------------------------------------------------------------------------------
|1   |0 4                             |v1 ADD 100 CL_BR DIV v2 $       |SHIFT 5                         |
 -------------------------------------------------------------------------------------------------------
|2   |0 4 5                           |ADD 100 CL_BR DIV v2 $          |REDUCE 8 F->id                  |
 -------------------------------------------------------------------------------------------------------
|3   |0 4 3                           |ADD 100 CL_BR DIV v2 $          |REDUCE 6 T->F                   |
 -------------------------------------------------------------------------------------------------------
|4   |0 4 2                           |ADD 100 CL_BR DIV v2 $          |REDUCE 3 E->T                   |
 -------------------------------------------------------------------------------------------------------
|5   |0 4 8                           |ADD 100 CL_BR DIV v2 $          |SHIFT 13                        |
 -------------------------------------------------------------------------------------------------------
|6   |0 4 8 13                        |100 CL_BR DIV v2 $              |SHIFT 12                        |
 -------------------------------------------------------------------------------------------------------
|7   |0 4 8 13 12                     |CL_BR DIV v2 $                  |REDUCE 9 F->num                 |
 -------------------------------------------------------------------------------------------------------
|8   |0 4 8 13 3                      |CL_BR DIV v2 $                  |REDUCE 6 T->F                   |
 -------------------------------------------------------------------------------------------------------
|9   |0 4 8 13 14                     |CL_BR DIV v2 $                  |REDUCE 2 E->E-T                 |
 -------------------------------------------------------------------------------------------------------
|10  |0 4 8                           |CL_BR DIV v2 $                  |SHIFT 11                        |
 -------------------------------------------------------------------------------------------------------
|11  |0 4 8 11                        |DIV v2 $                        |REDUCE 7 F->(E)                 |
 -------------------------------------------------------------------------------------------------------
|12  |0 3                             |DIV v2 $                        |REDUCE 6 T->F                   |
 -------------------------------------------------------------------------------------------------------
|13  |0 2                             |DIV v2 $                        |SHIFT 15                        |
 -------------------------------------------------------------------------------------------------------
|14  |0 2 15                          |v2 $                            |SHIFT 5                         |
 -------------------------------------------------------------------------------------------------------
|15  |0 2 15 5                        |$                               |REDUCE 8 F->id                  |
 -------------------------------------------------------------------------------------------------------
|16  |0 2 15 16                       |$                               |REDUCE 5 T->T/F                 |
 -------------------------------------------------------------------------------------------------------
|17  |0 2                             |$                               |REDUCE 3 E->T                   |
 -------------------------------------------------------------------------------------------------------
|18  |0 1                             |$                               |ACCEPT                          |
 -------------------------------------------------------------------------------------------------------

ИспользованиС

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ парсСра ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π° дирСктория examples, содСрТащая ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ подмноТСствС языка Yazik++ (см. описаниС Ρ‚ΡƒΡ‚), прСдназначСнная для дСмонстрации Ρ€Π°Π±ΠΎΡ‚Ρ‹ лСксСра. ИспользованноС подмноТСство задаСтся 'арифмСтичСской Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ'. Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ парсСром, запуститС исполняСмый Ρ„Π°ΠΉΠ» ΠΈΠ· Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ build ΠΈ ΠΏΠΎΠ΄Π°ΠΉΡ‚Π΅ Π½Π° Π²Ρ…ΠΎΠ΄ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ»ΠΈ Π·Π°Ρ€Π°Π½Π΅Π΅ Π·Π°Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· examples.

Бписок Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹
  • [1] Ахо, ΠΠ»ΡŒΡ„Ρ€Π΅Π΄ Π’., Π›Π°ΠΌ, Моника Π‘., Π‘Π΅Ρ‚ΠΈ, Π Π°Π²ΠΈ, Ульман, Π”ΠΆΠ΅Ρ„Ρ„Ρ€ΠΈ Π”. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹: ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ инструмСнтарий

About

Shift-reduce parser for simple 'arithmetical' grammar

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published