Зачем нужно абстрактное синтаксическое дерево? Почему анализатор рекурсивного спуска не может разобрать, как он идет? - PullRequest
0 голосов
/ 24 июня 2018

Я новичок, когда дело доходит до проектирования интерпретатора, и, немного изучив дизайн языка (грамматики, язык, лексеры, синтаксические анализаторы), я не понимаю, почему анализатору необходимо создавать абстрактное синтаксическое дерево какэто идет.Почему бы просто не использовать рекурсивно вызванные функции для выполнения операции прямо там.

Вот самый простой пример того, о чем я говорю, который я нашел.https://www.youtube.com/watch?v=N55XNj8KjC4.

1 Ответ

0 голосов
/ 24 июня 2018

Джеймс: вы, вероятно, знакомы с Java.Представьте, что у вашего рекурсивного парсера для Java есть только текст исходного кода и ничего больше ... и он видит текст "x + y".Какие именно действия он должен выполнить?

Вам нужно больше, чем просто AST;вам также понадобятся таблицы символов, сопоставление фрагментов кода с областями действия и место для хранения значений переменных.Если вы следуете образу мышления @ EJP, если вам нужны умные ответы / более быстрые интерпретаторы (например, не искать идентификаторы в таблицах символов каждый раз, когда вы сталкиваетесь с ними), вам нужно будет кэшировать кучу фактов о структуре кода и значении идентификаторов..

Как только вы соглашаетесь с тем, что вам необходимо кэшировать некоторую информацию, чтобы сделать ваш "интерпретатор" более эффективным, единственным аргументом является то, что нужно кэшировать.AST кэширует результат синтаксического анализа текста, поэтому вам не нужно каждый раз анализировать его.Представьте, что вы анализируете исходный код для внутреннего цикла на каждой итерации;у вас будет необычайно медленный переводчик.

Все эти другие вещи в основном являются кешами результатов рассуждений о предоставленном тексте.Но они действительно полезны, когда пытаются сделать ваш языковой процессор достаточно эффективным для практического использования.

...