Який найпростіший приклад там пояснити різницю між синтаксичними розборами дерев та абстрактними синтаксичними деревами?


14

Наскільки я розумію, аналізатор створює дерево розбору, а потім відкидає його. Однак, воно також може вивести абстрактне синтаксичне дерево, яким нібито користується компілятор.

Мені здається, що і дерево розбору, і абстрактне синтаксичне дерево створюються під етапом розбору. Тоді хтось може пояснити, чому вони різні?


3
Чому вони мають бути різними? Хіба вони не можуть бути однаковими з двох дещо різних точок зору?
С.Лотт

1
Не впевнений, що я розумію ці дві "трохи різні точки зору" :-(
Логіка комбінатора

В тім-то й річ. Вони те саме, звідси плутанина. У вас просто різні слова залежно від точки зору: Парсинг проти генерації коду (або Виконання у випадку перекладача).
С.Лотт

Різниці немає. Трохи уяви можна винайти синтаксичне подання для будь-якого можливого абстрактного синтаксичного дерева. За браком уяви S-вирази Lisp були б синтаксисом за замовчуванням, підходящим для всього.
SK-логіка

1
Ви всі повинні прочитати відповідь, перш ніж коментувати. Існує різниця, але їхнє відокремлення або поєднання - це питання впровадження.
Павло

Відповіді:


20

Дерево розбору також відоме як дерево конкретного синтаксису.

В основному, абстрактне дерево має менше інформації, ніж конкретне дерево. Бетонне дерево містить кожен елемент мовою, тоді як абстрактне дерево викинуло нецікаві шматочки.

Наприклад вираз: (2 + 5) * 8

Бетон виглядає так

  ( 2  + 5 )  * 8
  |  \ | / |  | |
  |   \|/  |  | |
   \___|__/   | |
       \______|/

Тоді як абстрактне дерево має:

2  5 
 \/   
  +  8
   \/
   *

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


Ви забули згадати, у якому компіляторі для якої мови це реалізовано таким чином. Тому що, знаєте, вам не потрібно ... аналізатор міг би відразу ж викинути дужки.
Інго

1
@Ingo, у моїй відповіді нічого не сказано про те, коли компілятор викидає дужки. Це запитує, в чому різниця між конкретним деревом розбору та абстрактним деревом розбору.
Вінстон Еверт

Тож, напевно, ви можете назвати джерело вашої претензії? Або це лише ваше приватне визначення?
Інго



0

Перше, що вам потрібно зрозуміти, це те, що ніхто не змушує вас певним чином написати парсер чи компілятор. Зокрема, необов’язково буває, що результатом аналізатора має бути дерево. Це може бути будь-яка структура даних, яка підходить для представлення вхідних даних.

Наприклад, наступна мова:

prog:
      definition 
    | definition ';' prog
    ;

definition: .....

може бути представлений у вигляді списку визначень. (Nitpickers вкаже, що список - це вироджене дерево, але все одно.)

По-друге, не потрібно триматися на дереві розбору (або будь-якої структури даних, яку повернув аналізатор). Навпаки, компілятори зазвичай будуються як послідовність проходів, які перетворюють результати попереднього проходу. Отже, загальний макет компілятора може бути таким:

parser :: String             -> Maybe [Definitions]      -- parser
pass1  :: [Definitions]      -> Maybe DesugaredProg      -- desugarer
pass2  :: DesugaredProg      -> Maybe TypedProg          -- type checker
pass3  :: TypedProg          -> Maybe AbstractTargetLang -- code generation
pass4  :: AbstractTargetLang -> Maybe String             -- pretty printer

compiler :: String           -> Maybe String    -- transform source code to target code
compiler source = do
   defs  <- parser source
   desug <- pass1 defs
   typed <- pass2 desug
   targt <- pass3 typed
   pass4 targt

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


2
Як це відповідь на запитання?
Вінстон Еверт

@WinstonEwert Я стверджую, що "дерево розбору" та "дерево абстрактних синтаксисів" - це абстракції і означають не що інше, як "відповідні структури даних". Отже, відповідь полягає в тому, що питання в його загальності не має сенсу, якщо ви не вимагаєте різниці між типом повернення аналізатора і типом повернення якогось іншого пропуску у компіляторі XY мови L.
Ingo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.